From e8dc601b26a3d64361e08e11d2072b262d3adf1a Mon Sep 17 00:00:00 2001 From: Bouletmarc Date: Sat, 7 May 2022 20:39:50 -0400 Subject: [PATCH] V1.1.2 - Massive Update and bugs Fixes --- ClassEditor.cs | 392 +++++++-- Class_Cypher.cs | 62 +- Class_DefinitionMaker.cs | 530 ++++++++++-- Editortable.cs | 767 ++++++++++++++---- Editortable.resx | 18 + GForm_Main.cs | 703 ++++++++-------- frmOBD2Scan.cs | 454 +++++------ .../DesignTimeResolveAssemblyReferences.cache | Bin 819 -> 6723 bytes ...gnTimeResolveAssemblyReferencesInput.cache | Bin 7571 -> 8285 bytes obj/Debug/Editortable.resources | Bin 0 -> 40395 bytes ...ashToolTest.Properties.Resources.resources | Bin 132056 -> 132056 bytes .../FlashToolTest.csproj.FileListAbsolute.txt | 7 + ...lashToolTest.csproj.GenerateResource.cache | Bin 1337 -> 1904 bytes ...lashToolTest.csprojAssemblyReference.cache | Bin 424 -> 424 bytes obj/Debug/FlashToolTest.exe | Bin 254464 -> 549888 bytes obj/Debug/FlashToolTest.frmOBD2Scan.resources | Bin 0 -> 37748 bytes obj/Debug/FlashToolTest.pdb | Bin 89600 -> 439808 bytes obj/Debug/GForm_ConvertBIN.resources | Bin 0 -> 180 bytes obj/Debug/GForm_Credits.resources | Bin 0 -> 180 bytes obj/Debug/GForm_FWChkSum.resources | Bin 0 -> 180 bytes .../Properties.Resources.Designer.cs.dll | Bin 3584 -> 4096 bytes 21 files changed, 2025 insertions(+), 908 deletions(-) create mode 100644 obj/Debug/Editortable.resources create mode 100644 obj/Debug/FlashToolTest.frmOBD2Scan.resources create mode 100644 obj/Debug/GForm_ConvertBIN.resources create mode 100644 obj/Debug/GForm_Credits.resources create mode 100644 obj/Debug/GForm_FWChkSum.resources diff --git a/ClassEditor.cs b/ClassEditor.cs index 3fc0ac5..98aeea4 100644 --- a/ClassEditor.cs +++ b/ClassEditor.cs @@ -25,6 +25,9 @@ internal class ClassEditor public List DefinitionsMathX = new List(); public List DefinitionsMathY = new List(); public List DefinitionsMathTable = new List(); + public List DefinitionsMathXInverted = new List(); + public List DefinitionsMathYInverted = new List(); + public List DefinitionsMathTableInverted = new List(); public List DefinitionsFormatX = new List(); public List DefinitionsFormatY = new List(); public List DefinitionsFormatTable = new List(); @@ -42,6 +45,28 @@ internal class ClassEditor public List DefinitionsHeaders = new List(); public List DefinitionsIsXYInverted = new List(); public List DefinitionsIsTableInverted = new List(); + public List DefinitionsIsReadOnly = new List(); + public List DefinitionsIsUntested = new List(); + public List DefinitionsIsNotDefined = new List(); + + public int SelectedROMLocation; + public int SelectedTableSize; + public int SelectedTableIndexInDefinitions; + public bool IsTableLoadedCorrectly = false; + public bool CanReloadTablesValues = false; + public string string_ECU_Name; + public byte[] ROM_Bytes; + public string AllROMDifferences; + public string AllROMDifferencesRedo; + public bool ValuesChanged = false; + public bool IsSingleByteX = false; + public bool IsSingleByteY = false; + public bool IsSingleByteTable = false; + + public int[] BufferValuesArray = new int[200]; + public int[] BufferTableSize = new int[2]; + public string BufferMath = ""; + private string LastMathDoneCheck = ""; private Editortable Editortable_0; @@ -60,9 +85,18 @@ public string ValueIncDec(int RowIndex, int CellIndex, bool Increasing, bool Mul float num = this.smethod_1(); string format = "0"; string text = Editortable_0.dataGridView_0.Rows[RowIndex].Cells[CellIndex].Value.ToString(); - if (text.Contains(".")) + if (text.Contains(".") || text.Contains(",")) { - format = "0.000"; + string[] SplittedCmd = new string[0]; + if (text.Contains(".")) SplittedCmd = text.Split('.'); + if (text.Contains(",")) SplittedCmd = text.Split(','); + int FormatLenght = SplittedCmd[1].Length; + + if (FormatLenght == 0) format = "0.0"; + if (FormatLenght == 1) format = "0.0"; + if (FormatLenght == 2) format = "0.00"; + if (FormatLenght == 3) format = "0.000"; + if (FormatLenght == 4) format = "0.0000"; } if (Multiply4x) { @@ -166,9 +200,9 @@ public void ShortcutsCommand(KeyEventArgs keyEventArgs_0, int int_232) { IncDecreaseSelection(true, bool_); } - Class40 class40_0 = new Class40(); + //Class40 class40_0 = new Class40(); //this.smethod_4(200).ContinueWith(new Action(this.<> c.<> 9.method_0)); - this.smethod_4(200, class40_0).ContinueWith(new Action(class40_0.method_0)); + //this.smethod_4(200, class40_0).ContinueWith(new Action(class40_0.method_0)); } private Task smethod_4(int int_232, Class40 class40_0) @@ -196,7 +230,7 @@ public void GetChanges() { //calculate value inversed to make bytes double ThisValue = double.Parse(Editortable_0.dataGridView_0.Rows[j].Cells[i].Value.ToString().Replace(',', '.'), CultureInfo.InvariantCulture); - ThisValue = DoMath(ThisValue, BufferMath, true); + ThisValue = DoMath(ThisValue, BufferMath, true, "Table"); ReadBufferarray[i, j] = (Int16)ThisValue; } } @@ -229,9 +263,9 @@ public void GetChanges() byte[] array = new byte[this.SelectedTableSize * multiplier]; for (int i = 0; i < this.SelectedTableSize * multiplier; i++) { - array[i] = this.byte_0[num + i]; + array[i] = this.ROM_Bytes[num + i]; //Apply Changes - this.byte_0[num + i] = BytesBufferarray[i]; + this.ROM_Bytes[num + i] = BytesBufferarray[i]; } int num3 = 0; @@ -249,7 +283,13 @@ public void GetChanges() num3++; } if (!DiffDetected) Editortable_0.GForm_Main_0.method_1("No differences detected"); - this.string_3 = this.string_3 + "Address: " + this.SelectedROMLocation.ToString() + Environment.NewLine + text; + if (DiffDetected) + { + this.AllROMDifferencesRedo = ""; + this.Editortable_0.redoToolStripMenuItem.Enabled = false; + } + this.AllROMDifferences = this.AllROMDifferences + text; + //this.string_3 = this.string_3 + "Address: " + this.SelectedROMLocation.ToString() + Environment.NewLine + text; //this.string_3 = this.string_3 + "Table: " + TableSize + Environment.NewLine + "Address: " + this.SelectedROMLocation.ToString() + Environment.NewLine + text; } @@ -257,15 +297,14 @@ public void SaveROMBytes(string string_4) { try { - if (this.bool_2 && this.SelectedTableSize != 0 && this.SelectedROMLocation != 0) + if (this.ValuesChanged && this.SelectedTableSize != 0 && this.SelectedROMLocation != 0) { this.GetChanges(); - this.string_2 = this.string_2 + this.string_3 + Environment.NewLine; } - this.bool_2 = false; + this.ValuesChanged = false; //################################################ - byte[] SavingBytes = this.byte_0; + byte[] SavingBytes = this.ROM_Bytes; //Remove fake bootloader section if it's a partial firmware .bin file if (!this.Editortable_0.IsFullBinary) @@ -281,6 +320,16 @@ public void SaveROMBytes(string string_4) File.Create(string_4).Dispose(); File.WriteAllBytes(string_4, SavingBytes); + + //Set LastFileOpened + string LastOpenFilePath = Application.StartupPath + @"\LastFileOpened.txt"; + File.Create(LastOpenFilePath).Dispose(); + File.WriteAllText(LastOpenFilePath, string_4); + //################################################ + //Save rom differences changes to logs + string text = string_4 + "-logs.txt"; + File.Create(text).Dispose(); + File.WriteAllText(text, AllROMDifferences); //################################################ //string text = string_4 + "~temp"; //string text2 = string_4 + "~temp2"; @@ -307,12 +356,12 @@ public void SaveROMBytes(string string_4) public void FixChecksums() { - if (!this.Editortable_0.IsFullBinary) this.byte_0 = this.Editortable_0.GForm_Main_0.VerifyChecksumFWBin(this.byte_0); - if (this.Editortable_0.IsFullBinary) this.byte_0 = this.Editortable_0.GForm_Main_0.VerifyChecksumFullBin(this.byte_0); + if (!this.Editortable_0.IsFullBinary) this.ROM_Bytes = this.Editortable_0.GForm_Main_0.VerifyChecksumFWBin(this.ROM_Bytes); + if (this.Editortable_0.IsFullBinary) this.ROM_Bytes = this.Editortable_0.GForm_Main_0.VerifyChecksumFullBin(this.ROM_Bytes); } - public void SetTableValues(int[] TableSize, int ROMLocationX, string TopLeftString, string RowHeaderString, string[] HeaderStringList, string ThisMathX, string ThisFormatX, bool IsXYInverted, int ROMLocationTable, string ThisMathTable, string ThisTableFormat, bool IsTableInverted) + public void SetTableValues(int[] TableSize, int ROMLocationX, string TopLeftString, string RowHeaderString, string[] HeaderStringList, string ThisMathX, string ThisFormatX, bool IsXYInverted, int ROMLocationTable, string ThisMathTable, string ThisTableFormat, bool IsTableInverted, bool IsReadOnly) { try { @@ -350,8 +399,8 @@ public void SetTableValues(int[] TableSize, int ROMLocationX, string TopLeftStri else num = (double)this.GetIntValue(ROMLocationX + i * 2); string HeaderStr = ""; - if (ThisFormatX != "") HeaderStr = DoMath(num, ThisMathX, false).ToString(ThisFormatX); - if (ThisFormatX == "") HeaderStr = DoMath(num, ThisMathX, false).ToString(); + if (ThisFormatX != "") HeaderStr = DoMath(num, ThisMathX, false, "X").ToString(ThisFormatX); + if (ThisFormatX == "") HeaderStr = DoMath(num, ThisMathX, false, "X").ToString(); Editortable_0.dataGridView_0.Columns.Add(HeaderStr, HeaderStr); } else @@ -399,8 +448,8 @@ public void SetTableValues(int[] TableSize, int ROMLocationX, string TopLeftStri double num = 0; if (IsSingleByteX) num = (double)this.GetSingleByteValue(ROMLocationX + num10); else num = (double)this.GetIntValue(ROMLocationX + num10 * 2); - if (ThisFormatX != "") Editortable_0.dataGridView_0.Rows[num10].HeaderCell.Value = DoMath(num, ThisMathX, false).ToString(ThisFormatX); - if (ThisFormatX == "") Editortable_0.dataGridView_0.Rows[num10].HeaderCell.Value = DoMath(num, ThisMathX, false).ToString(); + if (ThisFormatX != "") Editortable_0.dataGridView_0.Rows[num10].HeaderCell.Value = DoMath(num, ThisMathX, false, "X").ToString(ThisFormatX); + if (ThisFormatX == "") Editortable_0.dataGridView_0.Rows[num10].HeaderCell.Value = DoMath(num, ThisMathX, false, "X").ToString(); } else { @@ -413,23 +462,61 @@ public void SetTableValues(int[] TableSize, int ROMLocationX, string TopLeftStri } //TableMath (Get full 1full row of value at a time) - object[] values = new object[0]; + string[] values = new string[0]; if (IsXYInverted) { - values = new object[TableSize[1]]; + values = new string[TableSize[1]]; for (int i = 0; i < TableSize[1]; i++) { - if (ThisTableFormat != "") values[i] = DoMath((double)numArray2[rowIndex, i], ThisMathTable, false).ToString(ThisTableFormat); - if (ThisTableFormat == "") values[i] = DoMath((double)numArray2[rowIndex, i], ThisMathTable, false).ToString(); + if (ThisTableFormat.Contains("X")) + { + //Display Values in Hexadecimals + string Mathhh = DoMath((double)numArray2[rowIndex, i], ThisMathTable, false, "Table").ToString(); + try + { + if (ThisTableFormat == "X4") values[i] = Int16.Parse(Mathhh).ToString(ThisTableFormat); + else if (ThisTableFormat == "X8") values[i] = Int32.Parse(Mathhh).ToString(ThisTableFormat); + else values[i] = int.Parse(Mathhh).ToString(ThisTableFormat); + } + catch + { + values[i] = Mathhh; + } + } + else + { + //Display Values in double/int + if (ThisTableFormat != "") values[i] = DoMath((double)numArray2[rowIndex, i], ThisMathTable, false, "Table").ToString(ThisTableFormat); + if (ThisTableFormat == "") values[i] = DoMath((double)numArray2[rowIndex, i], ThisMathTable, false, "Table").ToString(); + } } } else { - values = new object[TableSize[0]]; + values = new string[TableSize[0]]; for (int i = 0; i < TableSize[0]; i++) { - if (ThisTableFormat != "") values[i] = DoMath((double)numArray2[i, rowIndex], ThisMathTable, false).ToString(ThisTableFormat); - if (ThisTableFormat == "") values[i] = DoMath((double)numArray2[i, rowIndex], ThisMathTable, false).ToString(); + if (ThisTableFormat.Contains("X")) + { + //Display Values in Hexadecimals + string Mathhh = DoMath((double)numArray2[i, rowIndex], ThisMathTable, false, "Table").ToString(); + try + { + if (ThisTableFormat == "X4") values[i] = Int16.Parse(Mathhh).ToString(ThisTableFormat); + else if (ThisTableFormat == "X8") values[i] = Int32.Parse(Mathhh).ToString(ThisTableFormat); + else values[i] = int.Parse(Mathhh).ToString(ThisTableFormat); + } + catch + { + values[i] = Mathhh; + } + } + else + { + //Display Values in double/int + if (ThisTableFormat != "") values[i] = DoMath((double)numArray2[i, rowIndex], ThisMathTable, false, "Table").ToString(ThisTableFormat); + if (ThisTableFormat == "") values[i] = DoMath((double)numArray2[i, rowIndex], ThisMathTable, false, "Table").ToString(); + } } } Editortable_0.dataGridView_0.Rows.Insert(rowIndex, values); @@ -458,13 +545,13 @@ public void SetTableValues(int[] TableSize, int ROMLocationX, string TopLeftStri string valueinner = ""; if (IsXYInverted) { - if (ThisTableFormat != "") valueinner = DoMath((double)numArray2[i, i2], ThisMathTable, false).ToString(ThisTableFormat); - if (ThisTableFormat == "") valueinner = DoMath((double)numArray2[i, i2], ThisMathTable, false).ToString(); + if (ThisTableFormat != "") valueinner = DoMath((double)numArray2[i, i2], ThisMathTable, false, "Table").ToString(ThisTableFormat); + if (ThisTableFormat == "") valueinner = DoMath((double)numArray2[i, i2], ThisMathTable, false, "Table").ToString(); } else { - if (ThisTableFormat != "") valueinner = DoMath((double)numArray2[i2, i], ThisMathTable, false).ToString(ThisTableFormat); - if (ThisTableFormat == "") valueinner = DoMath((double)numArray2[i2, i], ThisMathTable, false).ToString(); + if (ThisTableFormat != "") valueinner = DoMath((double)numArray2[i2, i], ThisMathTable, false, "Table").ToString(ThisTableFormat); + if (ThisTableFormat == "") valueinner = DoMath((double)numArray2[i2, i], ThisMathTable, false, "Table").ToString(); } Editortable_0.dataGridView_0.Rows[i2].Cells[i].Value = valueinner; @@ -473,6 +560,7 @@ public void SetTableValues(int[] TableSize, int ROMLocationX, string TopLeftStri } //############################################################################################################## + Editortable_0.dataGridView_0.ReadOnly = IsReadOnly; foreach (object obj in Editortable_0.dataGridView_0.Columns) { DataGridViewColumn dataGridViewColumn = (DataGridViewColumn)obj; @@ -485,11 +573,11 @@ public void SetTableValues(int[] TableSize, int ROMLocationX, string TopLeftStri dataGridViewRow2.Height = 20; } this.SetBackColor(TableSize[0], Editortable.float_1[0], Editortable.float_1[1]); - this.bool_0 = true; + this.IsTableLoadedCorrectly = true; } catch (Exception ex) { - this.bool_0 = false; + this.IsTableLoadedCorrectly = false; DarkMessageBox.Show("Failed to load table. " + ex.ToString()); } } @@ -584,20 +672,110 @@ public string InvertMathString(string ThisMath) return ReturnStr; } + public string SwipeMathFunc(string ThisMath) + { + string ReturnStr = ""; + List MathFuncList = new List(); + List ValuesList = new List(); + bool WeHaveVal1 = false; + while (ThisMath != "") + { + if (!WeHaveVal1) ValuesList.Add(GetNextValue(ThisMath)); + MathFuncList.Add(GetNextMath(ThisMath)); + ThisMath = ThisMath.Substring(GetNearestMathIndex(ThisMath) + 1); + ValuesList.Add(GetNextValue(ThisMath)); + + int NearestIndex = GetNearestMathIndex(ThisMath); + if (NearestIndex != -1) ThisMath = ThisMath.Substring(GetNearestMathIndex(ThisMath)); + + WeHaveVal1 = true; + + if (!ThisMath.Contains("/") && !ThisMath.Contains("*") && !ThisMath.Contains("+")) + { + ThisMath = ""; //No remaining maths to perform + } + } + + //Create swiped math function + for (int i = 0; i < ValuesList.Count; i++) + { + if (i > 0) + { + if (i > 1) ReturnStr = ReturnStr + MathFuncList[i - 2].ToString(); + else ReturnStr = ReturnStr + MathFuncList[MathFuncList.Count - 1].ToString(); + } + ReturnStr = ReturnStr + ValuesList[i]; + } + + return ReturnStr; + } + - public double DoMath(double ThisValueCheck, string ThisMath, bool Reverse) + public double DoMath(double ThisValueCheck, string ThisMath, bool Reverse, string Direction) { - double ReturnVal = DoMathFinal(ThisValueCheck, ThisMath, Reverse); + //Check if the reversed math function exist, if not we perform the reversed math function manually + bool ReversFinalForMath = Reverse; + if (Reverse) + { + if (Direction == "X" && DefinitionsMathXInverted[SelectedTableIndexInDefinitions] != "") + { + ThisMath = DefinitionsMathXInverted[SelectedTableIndexInDefinitions]; + ReversFinalForMath = false; + } + if (Direction == "Y" && DefinitionsMathYInverted[SelectedTableIndexInDefinitions] != "") + { + ThisMath = DefinitionsMathYInverted[SelectedTableIndexInDefinitions]; + ReversFinalForMath = false; + } + if (Direction == "Table" && DefinitionsMathTableInverted[SelectedTableIndexInDefinitions] != "") + { + ThisMath = DefinitionsMathTableInverted[SelectedTableIndexInDefinitions]; + ReversFinalForMath = false; + } + } + + //Perform Math + double ReturnVal = DoMathFinal(ThisValueCheck, ThisMath, ReversFinalForMath); + //################################################ //Confirm Math function in reverse if (!Reverse) { - double ReversedVal = DoMathFinal(ReturnVal, ThisMath, true); + bool PerformedNormalReverse = true; + + //Has the reversed math function existing + if (Direction == "X" && DefinitionsMathXInverted[SelectedTableIndexInDefinitions] != "") + { + ThisMath = DefinitionsMathXInverted[SelectedTableIndexInDefinitions]; + PerformedNormalReverse = false; + } + if (Direction == "Y" && DefinitionsMathYInverted[SelectedTableIndexInDefinitions] != "") + { + ThisMath = DefinitionsMathYInverted[SelectedTableIndexInDefinitions]; + PerformedNormalReverse = false; + } + if (Direction == "Table" && DefinitionsMathTableInverted[SelectedTableIndexInDefinitions] != "") + { + ThisMath = DefinitionsMathTableInverted[SelectedTableIndexInDefinitions]; + PerformedNormalReverse = false; + } + + //Has NOT the reversed math function existing + double ReversedVal = DoMathFinal(ReturnVal, ThisMath, PerformedNormalReverse); if (((int) ReversedVal).ToString() != ((int) ThisValueCheck).ToString() && ((int)ReversedVal + 1).ToString() != ((int)ThisValueCheck).ToString() && ((int)ReversedVal - 1).ToString() != ((int)ThisValueCheck).ToString()) { - Editortable_0.GForm_Main_0.method_1("Problem with math: " + ThisMath + " | Values: " + ((int)ThisValueCheck).ToString() + " != " + ((int)ReversedVal).ToString()); + if (LastMathDoneCheck != ThisMath) + { + Editortable_0.GForm_Main_0.method_1("Problem with inverted math: " + ThisMath + " | Values: " + ((int)ThisValueCheck).ToString() + " != " + ((int)ReversedVal).ToString()); + LastMathDoneCheck = ThisMath; + } + //suggested to set 'ReadOnly' parameters when there is math problem. + //when there is math problem, it mean the inverted function of your math doesn't return the exact bytes values as within the binary. + //The problem come from the math inversion in the function bellow 'DoMathFinal' + + //DefinitionsIsReadOnly } } @@ -627,8 +805,22 @@ public double DoMathFinal(double ThisValue, string ThisMath, bool Reverse) ThisMath = ThisMath.Replace("X", ThisValue.ToString()); + //######################################################## + //double ValTest1 = GetNextValue(ThisMath); + char MathTestChar = GetNextMath(ThisMath); + string ThisMathTest = ThisMath.Substring(GetNearestMathIndex(ThisMath) + 1); + double ValTest2 = GetNextValue(ThisMathTest); + if (Reverse && MathTestChar == '*' && ValTest2 == 100) + { + IsDivXValFirst = true; + ThisMath = SwipeMathFunc(ThisMath); + } + //######################################################## + if (Reverse) ThisMath = InvertMathString(ThisMath); + //Console.WriteLine("Math: " + ThisMath + " | Reversed: " + Reverse); + bool WeHaveVal1 = false; double Val1 = 0; while (ThisMath != "") @@ -641,7 +833,8 @@ public double DoMathFinal(double ThisValue, string ThisMath, bool Reverse) if (MathChar == '*') ReturnVal = Val1 * Val2; if (MathChar == '/') ReturnVal = Val1 / Val2; if (MathChar == '+') ReturnVal = Val1 + Val2; - if (MathChar == '-') ReturnVal = Val1 - Val2; + + //Console.WriteLine("Doing: " + Val1 + MathChar.ToString() + Val2 + "=" + ReturnVal); if (Reverse && MathChar == '*' && !IsDivXValFirst) ReturnVal = Val2 / Val1; @@ -652,7 +845,6 @@ public double DoMathFinal(double ThisValue, string ThisMath, bool Reverse) Val1 = ReturnVal; //Check for remaining maths - //if (!ThisMath.Contains("/") && !ThisMath.Contains("*") && !ThisMath.Contains("+") && !ThisMath.Contains("-")) if (!ThisMath.Contains("/") && !ThisMath.Contains("*") && !ThisMath.Contains("+")) { ThisMath = ""; //No remaining maths to perform @@ -670,8 +862,8 @@ public string[] GetAdvancedHeader(int ValuesCount, int ThisLocation, string This if (IsSingleByteY) Valuue = GetSingleByteValue(ThisLocation + i); else Valuue = GetIntValue(ThisLocation + (i * 2)); - if (HeaderFormat == "") strArray[i] = DoMath((double) Valuue, ThisMath, false).ToString(); - if (HeaderFormat != "") strArray[i] = DoMath((double) Valuue, ThisMath, false).ToString(HeaderFormat); + if (HeaderFormat == "") strArray[i] = DoMath((double) Valuue, ThisMath, false, "Y").ToString(); + if (HeaderFormat != "") strArray[i] = DoMath((double) Valuue, ThisMath, false, "Y").ToString(HeaderFormat); } return strArray; } @@ -729,41 +921,47 @@ public bool LoadROMbytes(string string_4) { try { - this.byte_0 = File.ReadAllBytes(string_4); + this.ROM_Bytes = File.ReadAllBytes(string_4); //Create a fake bootloader section if (!Editortable_0.IsFullBinary) { - byte[] BufferBytes = new byte[0x8000 + this.byte_0.Length]; + byte[] BufferBytes = new byte[0x8000 + this.ROM_Bytes.Length]; for (int i = 0; i < 0x8000; i++) BufferBytes[i] = 0xff; - for (int i = 0; i < this.byte_0.Length; i++) BufferBytes[0x8000 + i] = this.byte_0[i]; + for (int i = 0; i < this.ROM_Bytes.Length; i++) BufferBytes[0x8000 + i] = this.ROM_Bytes[i]; - this.byte_0 = BufferBytes; + this.ROM_Bytes = BufferBytes; } //Get ECU filename (33 37 38 30 35 2D -> 37805- 'in ASCII chars') (37805-RRB-A140) this.string_ECU_Name = ""; - for (int i = 0; i < this.byte_0.Length; i++) + for (int i = 0; i < this.ROM_Bytes.Length; i++) { - if (this.byte_0[i] == 0x33 && - this.byte_0[i + 1] == 0x37 && - this.byte_0[i + 2] == 0x38 && - this.byte_0[i + 3] == 0x30 && - (this.byte_0[i + 4] == 0x35 || this.byte_0[i + 4] == 0x36) && - this.byte_0[i + 5] == 0x2D) + if (this.ROM_Bytes[i] == 0x33 && + this.ROM_Bytes[i + 1] == 0x37 && + this.ROM_Bytes[i + 2] == 0x38 && + this.ROM_Bytes[i + 3] == 0x30 && + (this.ROM_Bytes[i + 4] == 0x35 || this.ROM_Bytes[i + 4] == 0x36) && + this.ROM_Bytes[i + 5] == 0x2D) { for (int i2 = 0; i2 < 14; i2++) { - this.string_ECU_Name += (char)this.byte_0[i + i2]; + this.string_ECU_Name += (char)this.ROM_Bytes[i + i2]; } break; } } + //################################################################################################## + //Load all differences made in ROM from logs + string text = string_4 + "-logs.txt"; + if (File.Exists(text)) + { + AllROMDifferences = File.ReadAllText(text); + } return true; - + //################################################################################################## /*this.string_0 = array[0]; //37805-RRB-A140 this.string_1 = array[1]; //Unused - using (FileStream fileStream = new FileStream(string_4, FileMode.Open)) { using (ZipArchive zipArchive = new ZipArchive(fileStream, ZipArchiveMode.Read)) @@ -804,6 +1002,7 @@ public bool LoadROMbytes(string string_4) } Editortable_0.GForm_Main_0.method_1("Cannot load Error#1"); return false;*/ + //################################################################################################## } catch { @@ -815,12 +1014,12 @@ public bool LoadROMbytes(string string_4) public int GetIntValue(int int_232) { - return (int)((short)((int)this.byte_0[int_232] << 8 | (int)this.byte_0[int_232 + 1])); + return (int)((short)((int)this.ROM_Bytes[int_232] << 8 | (int)this.ROM_Bytes[int_232 + 1])); } public int GetSingleByteValue(int int_232) { - return (int)this.byte_0[int_232]; + return (int)this.ROM_Bytes[int_232]; } public void SetBackColor(int int_232, float float_0, float float_1) @@ -847,6 +1046,10 @@ public void SetBackColor(int int_232, float float_0, float float_1) public Color GetColor(float float_0, float float_1, float float_2) { Color result; + + if (float_0 > float_1) return Color.White; //More than Maximum + if (float_0 < float_2) return Color.White; //Less than Minimum + try { int num = (int)(1023f * (float_0 - float_1) / (float_2 - float_1)); @@ -958,20 +1161,29 @@ public void LoadThisECUDefinitions(string ThisECU) DefinitionsTableSize = new List(); DefinitionsMathX = new List(); DefinitionsMathY = new List(); + DefinitionsMathTable = new List(); + DefinitionsMathXInverted = new List(); + DefinitionsMathYInverted = new List(); + DefinitionsMathTableInverted = new List(); DefinitionsValueMin = new List(); DefinitionsValueMax = new List(); DefinitionsChangeAmount = new List(); DefinitionsIsSingleByteX = new List(); DefinitionsIsSingleByteY = new List(); DefinitionsIsSingleByteTable = new List(); - DefinitionsFormatX = new List(); DefinitionsHeaders = new List(); + DefinitionsFormatX = new List(); DefinitionsFormatY = new List(); + DefinitionsFormatTable = new List(); DefinitionsIsXYInverted = new List(); DefinitionsIsTableInverted = new List(); + DefinitionsIsReadOnly = new List(); + DefinitionsIsUntested = new List(); + DefinitionsIsNotDefined = new List(); Editortable_0.GForm_Main_0.method_1("Loading ECU definitions for: " + ThisECU); bool ECUFound = false; + bool IsFileGenerated = false; foreach (string ThisFilePath in AllDefinitionFiles) { string[] AllLines = File.ReadAllLines(ThisFilePath); @@ -987,6 +1199,9 @@ public void LoadThisECUDefinitions(string ThisECU) string CurrentMathX = ""; string CurrentMathY = ""; string CurrentMathTable = ""; + string CurrentMathXInverted = ""; + string CurrentMathYInverted = ""; + string CurrentMathTableInverted = ""; float CurrentValueMin = 0f; float CurrentValueMax = 255f; double CurrentChangeAmount = 1; @@ -999,13 +1214,18 @@ public void LoadThisECUDefinitions(string ThisECU) string CurrentHeaders = ""; bool CurrentIsXYInverted = false; bool CurrentIsTableInverted = false; + bool CurrentIsReadOnly = false; + bool CurrentIsUntested = false; + bool CurrentIsNotDefined = false; + + IsFileGenerated = false; for (int i = 0; i < AllLines.Length; i++) { string Thisline = AllLines[i]; if (Thisline.Contains("ROM Parameters")) GettingEcuList = false; //make sure we are not reading false contents - if (Thisline.Contains("THIS FILE AS BEEN GENERATED")) DarkMessageBox.Show("This Definitions file as been generated to get the ROM Locations.\nThe ROM Locations can possibly be wrong and\nthe tables can display corrupted values!"); + if (Thisline.Contains("THIS FILE AS BEEN GENERATED")) IsFileGenerated = true; //Get supported ecu list from file and check if it's match if (Thisline[0] != '#' && Thisline != "") @@ -1033,6 +1253,9 @@ public void LoadThisECUDefinitions(string ThisECU) if (Commands[0] == "MathX") CurrentMathX = Commands[1]; if (Commands[0] == "MathY") CurrentMathY = Commands[1]; if (Commands[0] == "MathTable") CurrentMathTable = Commands[1]; + if (Commands[0] == "MathXInverted") CurrentMathXInverted = Commands[1]; + if (Commands[0] == "MathYInverted") CurrentMathYInverted = Commands[1]; + if (Commands[0] == "MathTableInverted") CurrentMathTableInverted = Commands[1]; if (Commands[0] == "ValueMin") CurrentValueMin = (float) double.Parse(Commands[1].Replace(',', '.'), CultureInfo.InvariantCulture); if (Commands[0] == "ValueMax") CurrentValueMax = (float) double.Parse(Commands[1].Replace(',', '.'), CultureInfo.InvariantCulture); if (Commands[0] == "ChangeAmount") CurrentChangeAmount = double.Parse(Commands[1].Replace(',', '.'), CultureInfo.InvariantCulture); @@ -1045,6 +1268,9 @@ public void LoadThisECUDefinitions(string ThisECU) if (Commands[0] == "Headers") CurrentHeaders = Commands[1]; if (Commands[0] == "IsXYInverted") CurrentIsXYInverted = bool.Parse(Commands[1].ToLower()); if (Commands[0] == "IsTableInverted") CurrentIsTableInverted = bool.Parse(Commands[1].ToLower()); + if (Commands[0] == "IsReadOnly") CurrentIsReadOnly = bool.Parse(Commands[1].ToLower()); + if (Commands[0] == "IsUntested") CurrentIsUntested = bool.Parse(Commands[1].ToLower()); + if (Commands[0] == "IsNotDefined") CurrentIsNotDefined = bool.Parse(Commands[1].ToLower()); } } @@ -1055,6 +1281,8 @@ public void LoadThisECUDefinitions(string ThisECU) if (CurrentName != "") { CurrentName = CurrentName.Replace("\\x00b0", "°"); + CurrentUnit1 = CurrentUnit1.Replace("\\x00b0", "°"); + CurrentUnit2 = CurrentUnit2.Replace("\\x00b0", "°"); DefinitionsLocationsX.Add(CurrentLocationX); DefinitionsLocationsY.Add(CurrentLocationY); DefinitionsLocationsTable.Add(CurrentLocationTable); @@ -1065,6 +1293,9 @@ public void LoadThisECUDefinitions(string ThisECU) DefinitionsMathX.Add(CurrentMathX); DefinitionsMathY.Add(CurrentMathY); DefinitionsMathTable.Add(CurrentMathTable); + DefinitionsMathXInverted.Add(CurrentMathXInverted); + DefinitionsMathYInverted.Add(CurrentMathYInverted); + DefinitionsMathTableInverted.Add(CurrentMathTableInverted); DefinitionsValueMin.Add(CurrentValueMin); DefinitionsValueMax.Add(CurrentValueMax); DefinitionsChangeAmount.Add(CurrentChangeAmount); @@ -1077,6 +1308,9 @@ public void LoadThisECUDefinitions(string ThisECU) DefinitionsHeaders.Add(CurrentHeaders); DefinitionsIsXYInverted.Add(CurrentIsXYInverted); DefinitionsIsTableInverted.Add(CurrentIsTableInverted); + DefinitionsIsReadOnly.Add(CurrentIsReadOnly); + DefinitionsIsUntested.Add(CurrentIsUntested); + DefinitionsIsNotDefined.Add(CurrentIsNotDefined); //Reset values to default CurrentLocationX = ""; @@ -1089,6 +1323,9 @@ public void LoadThisECUDefinitions(string ThisECU) CurrentMathX = ""; CurrentMathY = ""; CurrentMathTable = ""; + CurrentMathXInverted = ""; + CurrentMathYInverted = ""; + CurrentMathTableInverted = ""; CurrentValueMin = 0f; CurrentValueMax = 255f; CurrentChangeAmount = 1f; @@ -1101,13 +1338,21 @@ public void LoadThisECUDefinitions(string ThisECU) CurrentFormatTable = ""; CurrentIsXYInverted = false; CurrentIsTableInverted = false; + CurrentIsReadOnly = false; + CurrentIsUntested = false; + CurrentIsNotDefined = false; } } } } - Editortable_0.GForm_Main_0.method_1("Definitions loaded!"); - if (ECUFound) return; + if (ECUFound) + { + Editortable_0.GForm_Main_0.method_1("Definitions loaded!"); + + if (IsFileGenerated) DarkMessageBox.Show("This Definitions file as been generated to get the ROM Locations.\nThe ROM Locations can possibly be wrong and\nthe tables can display corrupted values!"); + return; + } } if (!ECUFound) Editortable_0.GForm_Main_0.method_1("Definitions NOT loaded!"); @@ -1123,33 +1368,6 @@ public void LoadThisECUDefinitions(string ThisECU) } } - public int SelectedROMLocation; - public int SelectedTableSize; - public bool bool_0 = false; - public bool bool_1 = false; - public string string_ECU_Name; - public byte[] byte_0; - public string string_2; - public string string_3; - public bool bool_2 = false; - public bool IsSingleByteX = false; - public bool IsSingleByteY = false; - public bool IsSingleByteTable = false; - - public int[] BufferValuesArray = new int[200]; - //public byte[] BufferBytesArray = new byte[400]; - public int[] BufferTableSize = new int[2]; - public string BufferMath = ""; - - public int[] int_219 = new int[400]; - public int[] int_220 = new int[128]; - public int[] int_221 = new int[30]; - public int[] int_222 = new int[16]; - public int[] int_223 = new int[14]; - public int[] int_224 = new int[12]; - public int[] int_225 = new int[10]; - public int[] int_226 = new int[8]; - public int[] int_231 = new int[2]; [CompilerGenerated] private sealed class Class40 diff --git a/Class_Cypher.cs b/Class_Cypher.cs index 303a6dc..d3d327b 100644 --- a/Class_Cypher.cs +++ b/Class_Cypher.cs @@ -94,10 +94,10 @@ public static UInt16 GetKey01(byte[] SeedTwoBytes, string ThisECU) public static uint GetKey41(uint uint_0, byte byte_0) { uint uint_ = 0U; - uint num = 0U; - uint num2 = 0U; - uint num3 = 0U; - byte uint_2 = 0; + uint uint_2 = 0U; + uint KeyBytes1 = 0U; + uint KeyBytes2 = 0U; + uint FinalAdder = 0U; switch (byte_0) { @@ -132,10 +132,10 @@ public static uint GetKey41(uint uint_0, byte byte_0) IL_111: //Test#1 work for 0x01 algorithm //CIVIC 06-10 (All models??) | AE 0D 23 FF 40 65 58 B3 uint_ = 2U; - uint_2 = 0; - num = 2920096767U; - num2 = 1080383667U; - num3 = 0U; + uint_2 = 0U; + KeyBytes1 = 2920096767U; + KeyBytes2 = 1080383667U; + FinalAdder = 0U; goto IL_170; //######################################### IL_127: @@ -144,28 +144,28 @@ public static uint GetKey41(uint uint_0, byte byte_0) //######################################### IL_146: //Test#2 (Default Switch, NOT WORK**) uint_ = 2U; - uint_2 = 0; - num = 3129510011U; - num2 = 0U; - num3 = 955378367U; + uint_2 = 0U; + KeyBytes1 = 3129510011U; + KeyBytes2 = 0U; + FinalAdder = 955378367U; goto IL_170; //######################################### IL_15C: //Test#3 should works without issue //RIDGELINE 06-13 | 16 A4 AB B0 BF E8 5A 6D uint_ = 1U; - uint_2 = 0; - num = 379890608U; - num2 = 3219675757U; - num3 = 0U; + uint_2 = 0U; + KeyBytes1 = 379890608U; + KeyBytes2 = 3219675757U; + FinalAdder = 0U; goto IL_170; //######################################### IL_160: //Test#4 should works without issue //CRV 07-10 KEY BYTES | 6D 75 32 AC 9D 62 3B 64 uint_ = 2U; - uint_2 = 0; - num = BitConverter.ToUInt32(new byte[] { 0xac, 0x32, 0x75, 0x6d }, 0); - num2 = BitConverter.ToUInt32(new byte[] { 0x64, 0x3b, 0x62, 0x9d }, 0); - num3 = 0U; + uint_2 = 0U; + KeyBytes1 = BitConverter.ToUInt32(new byte[] { 0xac, 0x32, 0x75, 0x6d }, 0); + KeyBytes2 = BitConverter.ToUInt32(new byte[] { 0x64, 0x3b, 0x62, 0x9d }, 0); + FinalAdder = 0U; goto IL_170; //######################################### //######################################### @@ -174,18 +174,18 @@ public static uint GetKey41(uint uint_0, byte byte_0) IL_161: //FREED 11-13 | 95 58 3E 2C F3 96 B5 6F uint_ = 3U; - uint_2 = 0; - num = BitConverter.ToUInt32(new byte[] { 0x2c, 0x3e, 0x58, 0x95 }, 0); - num2 = BitConverter.ToUInt32(new byte[] { 0x6f, 0xb5, 0x96, 0xf3 }, 0); - num3 = 0U; + uint_2 = 0U; + KeyBytes1 = BitConverter.ToUInt32(new byte[] { 0x2c, 0x3e, 0x58, 0x95 }, 0); + KeyBytes2 = BitConverter.ToUInt32(new byte[] { 0x6f, 0xb5, 0x96, 0xf3 }, 0); + FinalAdder = 0U; goto IL_170; IL_165: //RDX KEY BYTES | 67 E9 76 C1 78 3E 17 39 uint_ = 2U; - uint_2 = 0; - num = BitConverter.ToUInt32(new byte[] { 0xC1, 0x76, 0xE9, 0x67 }, 0); - num2 = BitConverter.ToUInt32(new byte[] { 0x39, 0x17, 0x3E, 0x78 }, 0); - num3 = 0U; + uint_2 = 0U; + KeyBytes1 = BitConverter.ToUInt32(new byte[] { 0xC1, 0x76, 0xE9, 0x67 }, 0); + KeyBytes2 = BitConverter.ToUInt32(new byte[] { 0x39, 0x17, 0x3E, 0x78 }, 0); + FinalAdder = 0U; //######################################### //######################################### //######################################### @@ -196,9 +196,9 @@ public static uint GetKey41(uint uint_0, byte byte_0) Console.WriteLine("num3:" + num3.ToString()); //num3 = 0 Console.WriteLine("uint_:" + uint_.ToString()); //uint_ = 2 Console.WriteLine("uint_2:" + uint_2.ToString()); //uint_2 = 0*/ - uint num6 = Class_Cypher.smethod_3(num + uint_0, uint_); - uint num7 = Class_Cypher.smethod_4(num2 + uint_0, (uint)uint_2); - return (num6 ^ num7 ^ (uint_0 & 65535U) * (uint_0 >> 16)) + num3; + uint num6 = Class_Cypher.smethod_3(KeyBytes1 + uint_0, uint_); + uint num7 = Class_Cypher.smethod_4(KeyBytes2 + uint_0, uint_2); + return (num6 ^ num7 ^ (uint_0 & 65535U) * (uint_0 >> 16)) + FinalAdder; } public static uint smethod_3(uint uint_0, uint uint_1) diff --git a/Class_DefinitionMaker.cs b/Class_DefinitionMaker.cs index 3b947c6..0e879e1 100644 --- a/Class_DefinitionMaker.cs +++ b/Class_DefinitionMaker.cs @@ -5,17 +5,30 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using System.Diagnostics; +using System.Runtime.InteropServices; -class Class_DefinitionMaker +public class Class_DefinitionMaker { List AllECUS = new List(); List AllFoundFunctions = new List(); List AllFoundAddress = new List(); + List AllFoundAddressX = new List(); + List AllFoundAddressY = new List(); List AllFileNames = new List(); List AllBootLoaderSumBytes = new List(); + public string FirmwareFolder = ""; + + GForm_Main GForm_Main_0; + + public Class_DefinitionMaker(ref GForm_Main GForm_Main_1) + { + GForm_Main_0 = GForm_Main_1; + } + //########################################################################################################################## //########################################################################################################################## //########################################################################################################################## @@ -24,11 +37,6 @@ class Class_DefinitionMaker public void CreateDefinitionsFiles() { - //########################################################################################################################## - //string FirmwareFolder = Application.StartupPath + @"\Firmwares"; - string FirmwareFolder = @"C:\Users\boule\Documents\Visual Studio 2019\Projects\RWD_2_BIN\bin\Debug\Firmwares"; - //########################################################################################################################## - string[] AllFiles = Directory.GetFiles(FirmwareFolder, "*.bin"); foreach (string ThisFile in AllFiles) { @@ -46,47 +54,47 @@ public void CreateDefinitionsFiles() //####################################################################################################################### DoneParameter = false; int ThisAddr = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("00 0A 00 0A 00 C8 00"), 16, false); - if (ThisAddr != -1) AddToList(Path.GetFileNameWithoutExtension(ThisFile), "VTEC Engagement", ThisAddr); + if (ThisAddr != -1) AddToList(Path.GetFileNameWithoutExtension(ThisFile), "VTEC Engagement", ThisAddr, -1, -1); //####################################################################################################################### //####################################################################################################################### DoneParameter = false; ThisAddr = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("FA 01 2C FF FF 40"), 71, false); if (ThisAddr != -1 && !DoneParameter) { - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Revlimiter", ThisAddr); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 1", ThisAddr + 8); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 2", ThisAddr + 16); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 3", ThisAddr + 24); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 4", ThisAddr + 32); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 5", ThisAddr + 36); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 6", ThisAddr + 52); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 7", ThisAddr + 60); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Revlimiter", ThisAddr, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 1", ThisAddr + 8, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 2", ThisAddr + 16, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 3", ThisAddr + 24, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 4", ThisAddr + 32, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 5", ThisAddr + 36, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 6", ThisAddr + 52, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 7", ThisAddr + 60, -1, -1); DoneParameter = true; } if (ThisAddr == -1 && !DoneParameter) ThisAddr = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("FA 01 2C FF FF 3A"), 71, false); if (ThisAddr != -1 && !DoneParameter) { - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Revlimiter", ThisAddr); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 1", ThisAddr + 8); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 2", ThisAddr + 16); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 3", ThisAddr + 24); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 4", ThisAddr + 32); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 5", ThisAddr + 36); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 6", ThisAddr + 52); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 7", ThisAddr + 60); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Revlimiter", ThisAddr, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 1", ThisAddr + 8, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 2", ThisAddr + 16, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 3", ThisAddr + 24, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 4", ThisAddr + 32, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 5", ThisAddr + 36, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 6", ThisAddr + 52, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 7", ThisAddr + 60, -1, -1); DoneParameter = true; } if (ThisAddr == -1 && !DoneParameter) ThisAddr = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("00 00 00 00 80 00 80 00 00 00 00 00 00"), 84, false); if (ThisAddr != -1 && !DoneParameter) { - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Revlimiter", ThisAddr); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 1", ThisAddr + 8); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 2", ThisAddr + 16); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 3", ThisAddr + 24); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 4", ThisAddr + 32); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 5", ThisAddr + 36); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 6", ThisAddr + 52); - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 7", ThisAddr + 60); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Revlimiter", ThisAddr, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 1", ThisAddr + 8, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 2", ThisAddr + 16, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 3", ThisAddr + 24, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 4", ThisAddr + 32, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 5", ThisAddr + 36, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 6", ThisAddr + 52, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "--Revlimiter 7", ThisAddr + 60, -1, -1); DoneParameter = true; } //####################################################################################################################### @@ -95,25 +103,25 @@ public void CreateDefinitionsFiles() ThisAddr = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("00 32 00 1E 01 2C 00 00 08 66 66 00 00"), -2, false); if (ThisAddr != -1 && !DoneParameter) { - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Speedlimiter", ThisAddr); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Speedlimiter", ThisAddr, -1, -1); DoneParameter = true; } if (ThisAddr == -1 && !DoneParameter) ThisAddr = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("00 32 00 1E 02 BC 02 DC 01 2C"), -2, false); if (ThisAddr != -1 && !DoneParameter) { - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Speedlimiter", ThisAddr); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Speedlimiter", ThisAddr, -1, -1); DoneParameter = true; } if (ThisAddr == -1 && !DoneParameter) ThisAddr = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("01 90 00 14 01 2C 00 00 08 66 66 00 00"), -2, false); if (ThisAddr != -1 && !DoneParameter) { - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Speedlimiter", ThisAddr); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Speedlimiter", ThisAddr, -1, -1); DoneParameter = true; } if (ThisAddr == -1 && !DoneParameter) ThisAddr = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("01 2C 00 00 08 66 66 00 00"), -6, false); if (ThisAddr != -1 && !DoneParameter) { - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Speedlimiter", ThisAddr); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Speedlimiter", ThisAddr, -1, -1); DoneParameter = true; } //####################################################################################################################### @@ -122,13 +130,13 @@ public void CreateDefinitionsFiles() ThisAddr = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("0C 80 0F A0 12 C0 19 00"), 8, false); if (ThisAddr != -1 && !DoneParameter) { - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Injector Voltage Compensation", ThisAddr); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Injector Voltage Compensation", ThisAddr, -1, -1); DoneParameter = true; } if (ThisAddr == -1 && !DoneParameter) ThisAddr = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("FC 18 FF 38 80 00 80 00"), -92, false); if (ThisAddr != -1 && !DoneParameter) { - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Injector Voltage Compensation", ThisAddr); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Injector Voltage Compensation", ThisAddr, -1, -1); DoneParameter = true; } //####################################################################################################################### @@ -136,37 +144,61 @@ public void CreateDefinitionsFiles() //MISSING ON SOME ROMS, HAVE TO CHECK FOR OTHERS BYTES ARRAY DoneParameter = false; ThisAddr = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("00 1E 00 00 00 03 00 05 00"), -8, false); - if (ThisAddr != -1) AddToList(Path.GetFileNameWithoutExtension(ThisFile), "MAF Load Limit", ThisAddr); + if (ThisAddr != -1) AddToList(Path.GetFileNameWithoutExtension(ThisFile), "MAF Load Limit", ThisAddr, -1, -1); //####################################################################################################################### //####################################################################################################################### DoneParameter = false; - ThisAddr = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("7F FF F0 60 EF 98"), 181, false); + ThisAddr = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("7F FF F0 60 EF 98"), 182, false); if (ThisAddr != -1 && !DoneParameter) { - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Minimum IPW", ThisAddr); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Minimum IPW", ThisAddr, -1, -1); DoneParameter = true; } if (ThisAddr == -1 && !DoneParameter) ThisAddr = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("05 66 05 66 02 00 00 00 00 01"), 36, true); if (ThisAddr != -1 && !DoneParameter) { - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Minimum IPW", ThisAddr); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Minimum IPW", ThisAddr, -1, -1); DoneParameter = true; } //####################################################################################################################### //####################################################################################################################### + //GET COOLANT TEMP LOCATION + DoneParameter = false; + int ThisAddrY = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("01 C2 02 12 02 53 03 20 27 10"), 166, false); + if (ThisAddrY != -1 && !DoneParameter) DoneParameter = true; + if (ThisAddrY == -1 && !DoneParameter) ThisAddrY = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("80 00 7F FF 7F FF 7F FF 7F FF"), 286, false); + if (ThisAddrY != -1 && !DoneParameter) DoneParameter = true; + if (ThisAddrY == -1 && !DoneParameter) ThisAddrY = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("80 00 FE D4 FF"), 174, false); //MAY CAUSE CERTAIN ISSUE + if (ThisAddrY != -1 && !DoneParameter) DoneParameter = true; + //#################################################################### DoneParameter = false; ThisAddr = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("00 00 00 00 00 00 00 01 00 1E"), 16, false); if (ThisAddr != -1 && !DoneParameter) { - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Idle Speed", ThisAddr); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Idle Speed", ThisAddr, -1, ThisAddrY); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Post Start Idle Speed", ThisAddr + 16, -1, ThisAddrY); DoneParameter = true; } if (ThisAddr == -1 && !DoneParameter) ThisAddr = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("C8 01 90 03 20 61 A8 00"), -75, true); if (ThisAddr != -1 && !DoneParameter) { - AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Idle Speed", ThisAddr); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Idle Speed", ThisAddr, -1, ThisAddrY); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "Post Start Idle Speed", ThisAddr + 16, -1, ThisAddrY); + DoneParameter = true; + } + //####################################################################################################################### + //####################################################################################################################### + DoneParameter = false; + ThisAddr = CheckForBytesAndGetAddress(AllBytes, StringToByteArray("01 90 01 90 01 90 FF 38"), 48, false); + if (ThisAddr != -1 && !DoneParameter) + { + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "WOT Determiniation 1(TPS)", ThisAddr, -1, -1); + AddToList(Path.GetFileNameWithoutExtension(ThisFile), "WOT Determiniation 2(TPS)", ThisAddr + 24, -1, -1); DoneParameter = true; } + //MISSING: WOT Determiniation (MAP) + //####################################################################################################################### + //####################################################################################################################### } GenerateDefinitions(); @@ -189,6 +221,8 @@ private void GenerateDefinitions() string FoundFunc = AllFoundFunctions[i]; int FoundAddr = AllFoundAddress[i]; + int FoundAddrX = AllFoundAddressX[i]; + int FoundAddrY = AllFoundAddressY[i]; if (FoundFunc == "VTEC Engagement") { @@ -268,10 +302,10 @@ private void GenerateDefinitions() AllStringFile = AllStringFile + "#############################" + Environment.NewLine; } - if (FoundFunc == "Idle Speed") + if (FoundFunc == "Idle Speed" || FoundFunc == "Post Start Idle Speed") { AllStringFile = AllStringFile + "ROMLocationTable:0x" + FoundAddr.ToString("X") + Environment.NewLine; - //AllStringFile = AllStringFile + "ROMLocationY:0x" + FoundAddr.ToString("X") + Environment.NewLine; + if (FoundAddrY != -1) AllStringFile = AllStringFile + "ROMLocationY:0x" + FoundAddrY.ToString("X") + Environment.NewLine; AllStringFile = AllStringFile + "Name:" + FoundFunc + Environment.NewLine; AllStringFile = AllStringFile + "Unit1:Coolant Temp" + Environment.NewLine; AllStringFile = AllStringFile + "Unit2:RPM" + Environment.NewLine; @@ -279,7 +313,23 @@ private void GenerateDefinitions() AllStringFile = AllStringFile + "ValueMin:-1000" + Environment.NewLine; AllStringFile = AllStringFile + "ValueMax:4000" + Environment.NewLine; AllStringFile = AllStringFile + "ChangeAmount:50" + Environment.NewLine; - //AllStringFile = AllStringFile + "MathY:X/10" + Environment.NewLine; + if (FoundAddrY != -1) AllStringFile = AllStringFile + "MathY:X/10" + Environment.NewLine; + AllStringFile = AllStringFile + "#############################" + Environment.NewLine; + } + + if (FoundFunc == "WOT Determiniation 1(TPS)" || FoundFunc == "WOT Determiniation 2(TPS)") + { + AllStringFile = AllStringFile + "ROMLocationTable:0x" + FoundAddr.ToString("X") + Environment.NewLine; + AllStringFile = AllStringFile + "Name:" + FoundFunc + Environment.NewLine; + AllStringFile = AllStringFile + "Unit1:RPM" + Environment.NewLine; + AllStringFile = AllStringFile + "Unit2:TPS(%)" + Environment.NewLine; + AllStringFile = AllStringFile + "TableSize:6x1" + Environment.NewLine; + AllStringFile = AllStringFile + "ValueMin:-50" + Environment.NewLine; + AllStringFile = AllStringFile + "ValueMax:200" + Environment.NewLine; + AllStringFile = AllStringFile + "MathTable:X*0.005" + Environment.NewLine; + AllStringFile = AllStringFile + "FormatTable:0.00" + Environment.NewLine; + AllStringFile = AllStringFile + "ChangeAmount:1" + Environment.NewLine; + AllStringFile = AllStringFile + "Headers:1000,2000,3000,4000,5000,6000" + Environment.NewLine; AllStringFile = AllStringFile + "#############################" + Environment.NewLine; } } @@ -295,6 +345,8 @@ private void CreateFile(string AllString, string ThisFile) File.Create(DirectoryPath + @"\" + ThisFile + ".txt").Dispose(); File.WriteAllText(DirectoryPath + @"\" + ThisFile + ".txt", AllString); + + GForm_Main_0.method_1("File saved:" + DirectoryPath + @"\" + ThisFile + ".txt"); } private string GenerateNewHeader(string ThisEECU) @@ -317,11 +369,13 @@ private string GenerateNewHeader(string ThisEECU) return ReturnStr; } - private void AddToList(string ThisECUName, string ThisFunction, int ThisAddr) + private void AddToList(string ThisECUName, string ThisFunction, int ThisAddr, int ThisAddrX, int ThisAddrY) { AllECUS.Add(ThisECUName); AllFoundFunctions.Add(ThisFunction); AllFoundAddress.Add(ThisAddr); + AllFoundAddressX.Add(ThisAddrX); + AllFoundAddressY.Add(ThisAddrY); } public byte[] StringToByteArray(string hex) @@ -361,7 +415,7 @@ private int CheckForBytesAndGetAddress(byte[] ThisFileBytes, byte[] CheckThisByt { return i + AddressOffset; } - else + if (FoundSameBytes && GetLastInstance) { LastIndexFound = i + AddressOffset; } @@ -378,17 +432,13 @@ private int CheckForBytesAndGetAddress(byte[] ThisFileBytes, byte[] CheckThisByt public void GetFilesDifferenceCount() { - //########################################################################################################################## - //string FirmwareFolder = Application.StartupPath + @"\Firmwares"; - string FirmwareFolder = @"C:\Users\boule\Documents\Visual Studio 2019\Projects\RWD_2_BIN\bin\Debug\Firmwares"; - //########################################################################################################################## - string[] AllFiles = Directory.GetFiles(FirmwareFolder, "*.bin"); string SavingText = "#######################################################################" + Environment.NewLine; SavingText = SavingText + "# SHOWING THE AMOUNT OF BYTES DIFFERENCES BETWEEN 2 ECU FILE" + Environment.NewLine; SavingText = SavingText + "# IF THERE WERE MORE THAN 500 DIFFERENCES, THE 2 FILES ARE NOT LISTED" + Environment.NewLine; SavingText = SavingText + "#######################################################################" + Environment.NewLine; + GForm_Main_0.method_1(SavingText); List AllFileDiffChecked = new List(); @@ -420,8 +470,8 @@ public void GetFilesDifferenceCount() if (ByteDiffCount < 500) { - Console.WriteLine(Path.GetFileNameWithoutExtension(ThisFile) + " && " + Path.GetFileNameWithoutExtension(ThisFile2) + " > " + ByteDiffCount); - SavingText = SavingText + Path.GetFileNameWithoutExtension(ThisFile) + " && " + Path.GetFileNameWithoutExtension(ThisFile2) + " > " + ByteDiffCount + Environment.NewLine; + GForm_Main_0.method_1(Path.GetFileNameWithoutExtension(ThisFile) + " && " + Path.GetFileNameWithoutExtension(ThisFile2) + " > " + ByteDiffCount); + //SavingText = SavingText + Path.GetFileNameWithoutExtension(ThisFile) + " && " + Path.GetFileNameWithoutExtension(ThisFile2) + " > " + ByteDiffCount + Environment.NewLine; } AllFileDiffChecked.Add(ThisFile2 + "|" + ThisFile); @@ -434,9 +484,9 @@ public void GetFilesDifferenceCount() } - string SavingPath = Application.StartupPath + @"\DifferencesCountInECUFiles.txt"; - File.Create(SavingPath).Dispose(); - File.WriteAllText(SavingPath, SavingText); + //string SavingPath = Application.StartupPath + @"\DifferencesCountInECUFiles.txt"; + //File.Create(SavingPath).Dispose(); + //File.WriteAllText(SavingPath, SavingText); } //########################################################################################################################## @@ -445,13 +495,365 @@ public void GetFilesDifferenceCount() //########################################################################################################################## //########################################################################################################################## - public void ExtractAllBootLoaderSum_1Mb() + public void CreateExtractedDefinition() + { + //string ExtractedDefinitionFile = @"C:\Users\boule\Desktop\Kserie\roms\hondata\37805-RWC-A620_Definition.txt"; + //string SavingPath = Application.StartupPath + @"\37805-RWC-A620_Definition.txt"; + + int DumpsCount = CurrentExtractedDumps - 1; + if (DumpsCount >= 1) + { + for (int k = 0; k < DumpsCount; k++) + { + string ExtractedDefinitionFile = ThisEndPath + "ExtractedDefinition" + (k + 1).ToString() + ".txt"; + string SavingPath = ThisEndPath + "GeneratedDefinition" + (k + 1).ToString() + ".txt"; + + if (File.Exists(ExtractedDefinitionFile)) + { + string[] AllLines = File.ReadAllLines(ExtractedDefinitionFile); + + List AllParamName = new List(); + List AllParamLocations = new List(); + List AllParamReadOnly = new List(); + List AllParamUntested = new List(); + + List AllTableName = new List(); + List AllTableLocations = new List(); + List AllTableLocationsX = new List(); + List AllTableLocationsY = new List(); + List AllRowCount = new List(); + List AllColCount = new List(); + List AllTableReadOnly = new List(); + List AllTableUntested = new List(); + + string CurrentParam = ""; + for (int i = 0; i < AllLines.Length; i++) + { + try + { + if (AllLines[i].Contains("[Parameter")) + { + if (AllLines[i] != CurrentParam) + { + CurrentParam = AllLines[i]; + + AllParamName.Add(AllLines[i + 2].Split('=')[1]); + AllParamLocations.Add(AllLines[i + 7].Split('=')[1]); + if (AllLines[i + 17].Split('=')[1] == "0") AllParamReadOnly.Add(false); + if (AllLines[i + 17].Split('=')[1] == "1") AllParamReadOnly.Add(true); + if (AllLines[i + 18].Split('=')[1] == "0") AllParamUntested.Add(false); + if (AllLines[i + 18].Split('=')[1] == "1") AllParamUntested.Add(true); + } + } + + if (AllLines[i].Contains("[Table")) + { + if (AllLines[i] != CurrentParam) + { + CurrentParam = AllLines[i]; + + AllTableName.Add(AllLines[i + 2].Split('=')[1]); + AllTableLocations.Add(AllLines[i + 5].Split('=')[1]); + AllColCount.Add(int.Parse(AllLines[i + 10].Split('=')[1])); + + if (AllLines[i + 18].Split('=')[1] == "1") AllRowCount.Add(1); + if (AllLines[i + 18].Split('=')[1] == "0") AllRowCount.Add(20); //##### + + if (AllLines[i + 6].Split('=')[1] != "0x00000") AllTableLocationsX.Add(AllLines[i + 6].Split('=')[1]); + if (AllLines[i + 6].Split('=')[1] == "0x00000") AllTableLocationsX.Add(""); + + if (AllLines[i + 7].Split('=')[1] != "0x00000") AllTableLocationsY.Add(AllLines[i + 7].Split('=')[1]); + if (AllLines[i + 7].Split('=')[1] == "0x00000") AllTableLocationsY.Add(""); + + if (AllLines[i + 15].Split('=')[1] == "0") AllTableReadOnly.Add(false); + if (AllLines[i + 15].Split('=')[1] == "1") AllTableReadOnly.Add(true); + + if (AllLines[i + 16].Split('=')[1] == "0") AllTableUntested.Add(false); + if (AllLines[i + 16].Split('=')[1] == "1") AllTableUntested.Add(true); + } + } + } + catch (Exception ex) + { + GForm_Main_0.method_1("PROBLEM OCCURED while Generating Definitions file: " + ex); + } + } + + string SavingStr = ""; + for (int i = 0; i < AllParamName.Count; i++) + { + SavingStr = SavingStr + "ROMLocationTable:" + AllParamLocations[i] + Environment.NewLine; + SavingStr = SavingStr + "Name:" + AllParamName[i] + Environment.NewLine; + SavingStr = SavingStr + "TableSize:1x1" + Environment.NewLine; + SavingStr = SavingStr + "IsSingleByteTable:true" + Environment.NewLine; + SavingStr = SavingStr + "IsNotDefined:true" + Environment.NewLine; + if (AllParamReadOnly[i]) SavingStr = SavingStr + "IsReadOnly:true" + Environment.NewLine; + if (AllParamUntested[i]) SavingStr = SavingStr + "IsUntested:true" + Environment.NewLine; + if (i < AllParamName.Count - 2) SavingStr = SavingStr + "#############################" + Environment.NewLine; + } + + SavingStr = SavingStr + "#############################################################" + Environment.NewLine; + SavingStr = SavingStr + "#############################################################" + Environment.NewLine; + SavingStr = SavingStr + "#############################################################" + Environment.NewLine; + + for (int i = 0; i < AllTableName.Count; i++) + { + SavingStr = SavingStr + "ROMLocationTable:" + AllTableLocations[i] + Environment.NewLine; + if (AllTableLocationsX[i] != "") SavingStr = SavingStr + "ROMLocationX:" + AllTableLocationsX[i] + Environment.NewLine; + if (AllTableLocationsY[i] != "") SavingStr = SavingStr + "ROMLocationY:" + AllTableLocationsY[i] + Environment.NewLine; + SavingStr = SavingStr + "Name:" + AllTableName[i] + Environment.NewLine; + SavingStr = SavingStr + "TableSize:" + AllColCount[i] + "x" + AllRowCount[i] + Environment.NewLine; + SavingStr = SavingStr + "ValueMin:-32768" + Environment.NewLine; + SavingStr = SavingStr + "ValueMax:32768" + Environment.NewLine; + //SavingStr = SavingStr + "IsSingleByteTable:true" + Environment.NewLine; + SavingStr = SavingStr + "IsNotDefined:true" + Environment.NewLine; + if (AllTableReadOnly[i]) SavingStr = SavingStr + "IsReadOnly:true" + Environment.NewLine; + if (AllTableUntested[i]) SavingStr = SavingStr + "IsUntested:true" + Environment.NewLine; + SavingStr = SavingStr + "#############################" + Environment.NewLine; + } + + File.Create(SavingPath).Dispose(); + File.WriteAllText(SavingPath, SavingStr); + GForm_Main_0.method_1("Generated Definitions file created: " + SavingPath); + } + } + } + } + + // REQUIRED CONSTS + const int PROCESS_QUERY_INFORMATION = 0x0400; + const int MEM_COMMIT = 0x00001000; + const int PAGE_READWRITE = 0x04; + const int PROCESS_WM_READ = 0x0010; + + // REQUIRED METHODS + [DllImport("kernel32.dll")] + public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId); + + [DllImport("kernel32.dll")] + public static extern bool ReadProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead); + + [DllImport("kernel32.dll")] + static extern void GetSystemInfo(out SYSTEM_INFO lpSystemInfo); + + [DllImport("kernel32.dll", SetLastError = true)] + static extern int VirtualQueryEx(IntPtr hProcess, IntPtr lpAddress, out MEMORY_BASIC_INFORMATION lpBuffer, uint dwLength); + + public int BlockSizeExtracted = 30000000; + public Int64 CurrentIndex = 4000000; + public IntPtr proc_min_address; + public IntPtr proc_max_address; + public long proc_min_address_l; + public long proc_max_address_l; + public Process process; + + public bool Done = false; + public string ThisEndPath = Application.StartupPath + @"\Extracted\"; + public int CurrentExtractedDumps = 1; + public int ExtractedBlockDone = 1; + + // REQUIRED STRUCTS + public struct MEMORY_BASIC_INFORMATION + { + public int BaseAddress; + public int AllocationBase; + public int AllocationProtect; + public int RegionSize; + public int State; + public int Protect; + public int lType; + } + + public struct SYSTEM_INFO + { + public ushort processorArchitecture; + ushort reserved; + public uint pageSize; + public IntPtr minimumApplicationAddress; + public IntPtr maximumApplicationAddress; + public IntPtr activeProcessorMask; + public uint numberOfProcessors; + public uint processorType; + public uint allocationGranularity; + public ushort processorLevel; + public ushort processorRevision; + } + + public bool Extract() + { + try + { + SYSTEM_INFO sys_info = new SYSTEM_INFO(); + GetSystemInfo(out sys_info); + //CurrentIndex = 4000000; + CurrentIndex = 0; + Done = false; + ExtractedBlockDone = 1; + CurrentExtractedDumps = 1; + RemovePastDump(); + + long MaxIndex = (CurrentIndex + BlockSizeExtracted); + + proc_min_address = (IntPtr)CurrentIndex; + proc_max_address = (IntPtr)MaxIndex; + proc_min_address_l = (long)proc_min_address; + proc_max_address_l = (long)proc_max_address; + + GForm_Main_0.method_1("------------------------------------------"); + GForm_Main_0.method_1("Extracting..."); + + if (!Directory.Exists(ThisEndPath)) Directory.CreateDirectory(ThisEndPath); + + Process[] ProcList = Process.GetProcessesByName("FlashProManager"); + if (ProcList.Length == 0) + { + GForm_Main_0.method_1("FlashProManager is not running"); + return false; + } + else + { + process = Process.GetProcessesByName("FlashProManager")[0]; + GForm_Main_0.method_1("FlashProManager is running..."); + + //RemovePastDump(); + string ReloadDump = ""; + + while (!Done) + { + int Percent = (int)(((CurrentIndex - 4000000) * 100) / (Int64.Parse(sys_info.maximumApplicationAddress.ToString()) - 1)); + //Console.Write("\nSEARCH #" + SearchID + " " + Percent + "%"); + GForm_Main_0.method_4(Percent); + + if ((CurrentIndex + BlockSizeExtracted) > Int64.Parse(sys_info.maximumApplicationAddress.ToString())) + { + Done = true; + } + else + { + MaxIndex = (CurrentIndex + BlockSizeExtracted); + + proc_min_address = (IntPtr)CurrentIndex; + proc_max_address = (IntPtr)MaxIndex; + proc_min_address_l = (long)proc_min_address; + proc_max_address_l = (long)proc_max_address; + + ExtractMemoryBlock(); + //ReloadDump = ReloadDumpFile(); + ReloadDump = File.ReadAllText(ThisEndPath + "DumpHex" + ExtractedBlockDone); + + //5B446566696E6974696F6E5D ->[Definition] + if (ReloadDump.Contains("[Definition]")) + { + //GForm_Main_0.method_1("Found Definition in DumpHex" + ExtractedBlockDone); + Console.WriteLine("Found Definition in DumpHex" + ExtractedBlockDone); + + CurrentExtractedDumps++; + string DumpedDefinition = ReloadDump.Substring(ReloadDump.IndexOf("[Definition]")); + DumpedDefinition = DumpedDefinition.Substring(0, DumpedDefinition.LastIndexOf("ConditionalEnableValue=") + 24); + + DumpedDefinition = DumpedDefinition.Replace("..", "\n"); + + + string SaveDefPath = ThisEndPath + "ExtractedDefinition" + (CurrentExtractedDumps-1).ToString() + ".txt"; + GForm_Main_0.method_1("Extracted Definitions file created: " + SaveDefPath); + File.Create(SaveDefPath).Dispose(); + File.WriteAllText(SaveDefPath, DumpedDefinition); + } + } + + CurrentIndex += BlockSizeExtracted; + ExtractedBlockDone++; + } + + RemovePastDump(); + GForm_Main_0.ResetProgressBar(); + + if (CurrentExtractedDumps == 1) + { + GForm_Main_0.method_1("No definitions found loaded in memory\nTry saving your calibration in FlashProManager with small changes and retry this feature"); + return false; + } + else + { + GForm_Main_0.method_1((CurrentExtractedDumps - 1) + " definitions found!"); + return true; + } + } + } + catch (Exception message) + { + GForm_Main_0.ResetProgressBar(); + GForm_Main_0.method_1("Cannot extract! Error:\n" + message); + return false; + + } + } + + void RemovePastDump() + { + string[] FileList = Directory.GetFiles(ThisEndPath, "Dump*"); + if (FileList.Length > 0) + { + for (int i = 0; i < FileList.Length; i++) + { + File.Delete(FileList[i]); + } + } + } + + /*string ReloadDumpFile() { - //########################################################################################################################## - //string FirmwareFolder = Application.StartupPath + @"\Firmwares"; - string FirmwareFolder = @"C:\Users\boule\Documents\Visual Studio 2019\Projects\RWD_2_BIN\bin\Debug\Firmwares"; - //########################################################################################################################## + string ReloadDump = File.ReadAllText(ThisEndPath + "Dump" + ExtractedBlockDone + ".txt"); + ReloadDump = ReloadDump.Replace("\n", ""); + ReloadDump = ReloadDump.Replace("\r", ""); + ReloadDump = ReloadDump.Replace(" ", ""); + File.WriteAllText(ThisEndPath + "Dump" + ExtractedBlockDone + ".txt", ReloadDump); + + //ExtractedBytes = File.ReadAllBytes(ThisEndPath + "DumpHex"); + return ReloadDump; + }*/ + + void ExtractMemoryBlock() + { + int bytesRead = 0; + IntPtr processHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_WM_READ, false, process.Id); + MEMORY_BASIC_INFORMATION mem_basic_info = new MEMORY_BASIC_INFORMATION(); + //StreamWriter sw = new StreamWriter(ThisEndPath + "Dump" + ExtractedBlockDone + ".txt"); + StreamWriter sw2 = new StreamWriter(ThisEndPath + "DumpHex" + ExtractedBlockDone); + + while (proc_min_address_l < proc_max_address_l) + { + VirtualQueryEx(processHandle, proc_min_address, out mem_basic_info, 28); + + if (mem_basic_info.Protect == PAGE_READWRITE && mem_basic_info.State == MEM_COMMIT) + { + byte[] buffer = new byte[mem_basic_info.RegionSize]; + + ReadProcessMemory((int)processHandle, mem_basic_info.BaseAddress, buffer, mem_basic_info.RegionSize, ref bytesRead); + for (int i = 0; i < mem_basic_info.RegionSize; i++) + { + //sw.WriteLine(buffer[i].ToString("X2")); + sw2.Write((char)buffer[i]); + } + } + + proc_min_address_l += mem_basic_info.RegionSize; + proc_min_address = new IntPtr(proc_min_address_l); + } + + //sw.Close(); + sw2.Close(); + } + + //########################################################################################################################## + //########################################################################################################################## + //########################################################################################################################## + //########################################################################################################################## + //########################################################################################################################## + + public void ExtractAllBootLoaderSum_1Mb() + { AllFileNames = new List(); AllBootLoaderSumBytes = new List(); @@ -471,6 +873,8 @@ public void ExtractAllBootLoaderSum_1Mb() string SavingPath = Application.StartupPath + @"\BootLoaderSumBytesList.txt"; File.Create(SavingPath).Dispose(); File.WriteAllText(SavingPath, SavingText); + + GForm_Main_0.method_1("File saved:" + SavingPath); } public byte GetBootloaderSum(byte[] FWFileBytes) diff --git a/Editortable.cs b/Editortable.cs index db903f5..569ece8 100644 --- a/Editortable.cs +++ b/Editortable.cs @@ -8,6 +8,7 @@ using System.Windows.Forms; using DarkUI.Controls; using DarkUI.Forms; +using System.Runtime.CompilerServices; public class Editortable : DarkForm { @@ -17,9 +18,7 @@ public class Editortable : DarkForm private IContainer icontainer_1; public bool bool_0 = true; public static float float_0 = 1f; - private List list_0 = new List(); public static float[] float_1 = new float[2]; - private TableLayoutPanel tableLayoutPanel1; private DarkTreeView treeView1; private DarkGroupBox groupBox1; public DataGridView dataGridView_0; @@ -39,9 +38,22 @@ public class Editortable : DarkForm private ToolStripMenuItem openDefinitionsFolderToolStripMenuItem; private ToolStripDropDownButton toolStripDropDownButton2; private ToolStripMenuItem undoToolStripMenuItem; - private ToolStripMenuItem redoToolStripMenuItem; + public ToolStripMenuItem redoToolStripMenuItem; private ToolStripSeparator toolStripSeparator2; private ToolStripMenuItem increaseSelectionToolStripMenuItem; + private SplitContainer splitContainer1; + private SplitContainer splitContainer2; + private DarkTextBox darkTextBox_0; + private ToolStripDropDownButton toolStripDropDownButton3; + private ToolStripMenuItem developpersToolsToolStripMenuItem; + private ToolStripMenuItem generateDefinitionsFilesToolStripMenuItem; + private ToolStripMenuItem getDifferencesInAllFirmwaresFilesToolStripMenuItem; + private ToolStripMenuItem extractAllBootloadersumByteFromAllFirmwaresFilesToolStripMenuItem; + private ToolStripMenuItem extractDefinitionToolStripMenuItem; + private FolderBrowserDialog folderBrowserDialog1; + private ToolStripMenuItem removeBootloaderInbinToolStripMenuItem; + private ToolStripSeparator toolStripSeparator3; + private ToolStripMenuItem generateDefinitionFileFromExtractedDefinitionToolStripMenuItem; private ToolStripMenuItem decreaseSelectionToolStripMenuItem; internal Editortable(ref GForm_Main GForm_Main_1) @@ -55,17 +67,48 @@ internal Editortable(ref GForm_Main GForm_Main_1) if (this.ClassEditor_0 != null) this.ClassEditor_0 = null; this.ClassEditor_0 = new ClassEditor(ref Editortable_0); + this.Text = "Honda Rom Tables Editor (" + this.GForm_Main_0.Version + ")"; + } - this.Text = this.Text + " (" + this.GForm_Main_0.Version + ")"; + public void Loadingg() + { + string LastOpenFilePath = Application.StartupPath + @"\LastFileOpened.txt"; + if (File.Exists(LastOpenFilePath)) + { + DialogResult result = DarkMessageBox.Show(this, "Do you want to reopen the last file you have worked on?", "Reopen last file used", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation); + if (result == DialogResult.Yes) + { + LoadThisFile(File.ReadAllText(LastOpenFilePath)); + } + } + } + + public void method_Log(string string_3) + { + this.darkTextBox_0.Text += string_3; + //Console.Write(string_3); + } + + public void method_1(string string_3) + { + try + { + //With newline automaticly added + //Console.WriteLine(string_3); + Editortable.Class5 @class = new Editortable.Class5(); + @class.Editortable_0 = this; + @class.string_0 = string_3; + this.darkTextBox_0.BeginInvoke(new MethodInvoker(@class.method_0)); + } + catch { } } private void InitializeComponent() { - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle7 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle8 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle9 = new System.Windows.Forms.DataGridViewCellStyle(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Editortable)); - this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); this.treeView1 = new DarkUI.Controls.DarkTreeView(); this.groupBox1 = new DarkUI.Controls.DarkGroupBox(); this.dataGridView_0 = new System.Windows.Forms.DataGridView(); @@ -84,38 +127,41 @@ private void InitializeComponent() this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.increaseSelectionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.decreaseSelectionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.tableLayoutPanel1.SuspendLayout(); + this.toolStripDropDownButton3 = new System.Windows.Forms.ToolStripDropDownButton(); + this.developpersToolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.generateDefinitionsFilesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.getDifferencesInAllFirmwaresFilesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.extractAllBootloadersumByteFromAllFirmwaresFilesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.extractDefinitionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.splitContainer2 = new System.Windows.Forms.SplitContainer(); + this.darkTextBox_0 = new DarkUI.Controls.DarkTextBox(); + this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.removeBootloaderInbinToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.generateDefinitionFileFromExtractedDefinitionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.groupBox1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.dataGridView_0)).BeginInit(); this.darkToolStrip1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit(); + this.splitContainer2.Panel1.SuspendLayout(); + this.splitContainer2.Panel2.SuspendLayout(); + this.splitContainer2.SuspendLayout(); this.SuspendLayout(); // - // tableLayoutPanel1 - // - this.tableLayoutPanel1.BackColor = System.Drawing.SystemColors.ControlDarkDark; - this.tableLayoutPanel1.ColumnCount = 2; - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 260F)); - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.tableLayoutPanel1.Controls.Add(this.treeView1, 0, 0); - this.tableLayoutPanel1.Controls.Add(this.groupBox1, 1, 0); - this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; - this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 28); - this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(2); - this.tableLayoutPanel1.Name = "tableLayoutPanel1"; - this.tableLayoutPanel1.RowCount = 1; - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 517F)); - this.tableLayoutPanel1.Size = new System.Drawing.Size(1100, 517); - this.tableLayoutPanel1.TabIndex = 11; - // // treeView1 // - this.treeView1.BackColor = System.Drawing.SystemColors.ControlDark; + this.treeView1.BackColor = System.Drawing.SystemColors.ControlDarkDark; this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill; this.treeView1.EvenNodeColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); this.treeView1.FocusedNodeColor = System.Drawing.Color.FromArgb(((int)(((byte)(75)))), ((int)(((byte)(110)))), ((int)(((byte)(175))))); this.treeView1.ImageIndex = 0; this.treeView1.ImageList = null; - this.treeView1.Location = new System.Drawing.Point(2, 2); + this.treeView1.Location = new System.Drawing.Point(0, 0); this.treeView1.Margin = new System.Windows.Forms.Padding(2); this.treeView1.MaxDragChange = 20; this.treeView1.Name = "treeView1"; @@ -123,7 +169,7 @@ private void InitializeComponent() this.treeView1.OddNodeColor = System.Drawing.Color.FromArgb(((int)(((byte)(57)))), ((int)(((byte)(60)))), ((int)(((byte)(62))))); this.treeView1.SelectedImageIndex = 0; this.treeView1.SelectWithArrowKeys = false; - this.treeView1.Size = new System.Drawing.Size(256, 513); + this.treeView1.Size = new System.Drawing.Size(297, 517); this.treeView1.TabIndex = 2; this.treeView1.SelectedNodesChanged += new System.EventHandler(this.treeView1_AfterSelect); // @@ -132,11 +178,11 @@ private void InitializeComponent() this.groupBox1.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); this.groupBox1.Controls.Add(this.dataGridView_0); this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill; - this.groupBox1.Location = new System.Drawing.Point(262, 2); + this.groupBox1.Location = new System.Drawing.Point(0, 0); this.groupBox1.Margin = new System.Windows.Forms.Padding(2); this.groupBox1.Name = "groupBox1"; this.groupBox1.Padding = new System.Windows.Forms.Padding(2); - this.groupBox1.Size = new System.Drawing.Size(836, 513); + this.groupBox1.Size = new System.Drawing.Size(799, 361); this.groupBox1.TabIndex = 3; this.groupBox1.TabStop = false; this.groupBox1.Text = "Table:"; @@ -147,52 +193,50 @@ private void InitializeComponent() this.dataGridView_0.AllowUserToDeleteRows = false; this.dataGridView_0.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells; this.dataGridView_0.BackgroundColor = System.Drawing.SystemColors.ControlDarkDark; - dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.ControlDarkDark; - dataGridViewCellStyle1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.Window; - dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this.dataGridView_0.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + dataGridViewCellStyle7.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle7.BackColor = System.Drawing.SystemColors.ControlDarkDark; + dataGridViewCellStyle7.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle7.ForeColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle7.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle7.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle7.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dataGridView_0.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle7; this.dataGridView_0.ColumnHeadersHeight = 20; - dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.ControlLight; - dataGridViewCellStyle2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.ControlText; - dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; - this.dataGridView_0.DefaultCellStyle = dataGridViewCellStyle2; + dataGridViewCellStyle8.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle8.BackColor = System.Drawing.SystemColors.ControlLight; + dataGridViewCellStyle8.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle8.ForeColor = System.Drawing.SystemColors.ControlText; + dataGridViewCellStyle8.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle8.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle8.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dataGridView_0.DefaultCellStyle = dataGridViewCellStyle8; this.dataGridView_0.Dock = System.Windows.Forms.DockStyle.Fill; this.dataGridView_0.EnableHeadersVisualStyles = false; this.dataGridView_0.GridColor = System.Drawing.SystemColors.ControlDarkDark; this.dataGridView_0.Location = new System.Drawing.Point(2, 15); this.dataGridView_0.Margin = new System.Windows.Forms.Padding(2); this.dataGridView_0.Name = "dataGridView_0"; - this.dataGridView_0.ReadOnly = true; - dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle3.BackColor = System.Drawing.SystemColors.ControlDarkDark; - dataGridViewCellStyle3.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle3.ForeColor = System.Drawing.SystemColors.Window; - dataGridViewCellStyle3.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle3.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this.dataGridView_0.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + dataGridViewCellStyle9.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle9.BackColor = System.Drawing.SystemColors.ControlDarkDark; + dataGridViewCellStyle9.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle9.ForeColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle9.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle9.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle9.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dataGridView_0.RowHeadersDefaultCellStyle = dataGridViewCellStyle9; this.dataGridView_0.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders; this.dataGridView_0.RowTemplate.DefaultCellStyle.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; this.dataGridView_0.RowTemplate.Height = 31; - this.dataGridView_0.Size = new System.Drawing.Size(832, 496); + this.dataGridView_0.Size = new System.Drawing.Size(795, 344); this.dataGridView_0.TabIndex = 4; this.dataGridView_0.TabStop = false; this.dataGridView_0.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.CellValueChanged); - this.dataGridView_0.DoubleClick += new System.EventHandler(this.method_3); this.dataGridView_0.KeyDown += new System.Windows.Forms.KeyEventHandler(this.method_4); // // openFileDialog1 // this.openFileDialog1.DefaultExt = "*.bin"; - this.openFileDialog1.Filter = "Honda full binary rom file|*.bin|Honda decompressed firmware binary|*.bin"; + this.openFileDialog1.Filter = "Honda binary rom file|*.bin"; this.openFileDialog1.Title = "Open File"; // // saveFileDialog1 @@ -208,7 +252,8 @@ private void InitializeComponent() this.darkToolStrip1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); this.darkToolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripDropDownButton1, - this.toolStripDropDownButton2}); + this.toolStripDropDownButton2, + this.toolStripDropDownButton3}); this.darkToolStrip1.Location = new System.Drawing.Point(0, 0); this.darkToolStrip1.Name = "darkToolStrip1"; this.darkToolStrip1.Padding = new System.Windows.Forms.Padding(5, 0, 1, 0); @@ -297,11 +342,11 @@ private void InitializeComponent() // undoToolStripMenuItem // this.undoToolStripMenuItem.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); - this.undoToolStripMenuItem.Enabled = false; - this.undoToolStripMenuItem.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(153)))), ((int)(((byte)(153)))), ((int)(((byte)(153))))); + this.undoToolStripMenuItem.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); this.undoToolStripMenuItem.Name = "undoToolStripMenuItem"; this.undoToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.undoToolStripMenuItem.Text = "Undo"; + this.undoToolStripMenuItem.Click += new System.EventHandler(this.undoToolStripMenuItem_Click); // // redoToolStripMenuItem // @@ -311,6 +356,7 @@ private void InitializeComponent() this.redoToolStripMenuItem.Name = "redoToolStripMenuItem"; this.redoToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.redoToolStripMenuItem.Text = "Redo"; + this.redoToolStripMenuItem.Click += new System.EventHandler(this.redoToolStripMenuItem_Click); // // toolStripSeparator2 // @@ -338,23 +384,168 @@ private void InitializeComponent() this.decreaseSelectionToolStripMenuItem.Text = "Decrease Selection"; this.decreaseSelectionToolStripMenuItem.Click += new System.EventHandler(this.decreaseSelectionToolStripMenuItem_Click); // + // toolStripDropDownButton3 + // + this.toolStripDropDownButton3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); + this.toolStripDropDownButton3.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.toolStripDropDownButton3.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.removeBootloaderInbinToolStripMenuItem, + this.toolStripSeparator3, + this.developpersToolsToolStripMenuItem}); + this.toolStripDropDownButton3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); + this.toolStripDropDownButton3.Image = ((System.Drawing.Image)(resources.GetObject("toolStripDropDownButton3.Image"))); + this.toolStripDropDownButton3.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripDropDownButton3.Name = "toolStripDropDownButton3"; + this.toolStripDropDownButton3.Size = new System.Drawing.Size(47, 25); + this.toolStripDropDownButton3.Text = "Tools"; + // + // developpersToolsToolStripMenuItem + // + this.developpersToolsToolStripMenuItem.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); + this.developpersToolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.generateDefinitionsFilesToolStripMenuItem, + this.getDifferencesInAllFirmwaresFilesToolStripMenuItem, + this.extractAllBootloadersumByteFromAllFirmwaresFilesToolStripMenuItem, + this.extractDefinitionToolStripMenuItem, + this.generateDefinitionFileFromExtractedDefinitionToolStripMenuItem}); + this.developpersToolsToolStripMenuItem.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); + this.developpersToolsToolStripMenuItem.Name = "developpersToolsToolStripMenuItem"; + this.developpersToolsToolStripMenuItem.Size = new System.Drawing.Size(214, 22); + this.developpersToolsToolStripMenuItem.Text = "Developpers Tools"; + // + // generateDefinitionsFilesToolStripMenuItem + // + this.generateDefinitionsFilesToolStripMenuItem.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); + this.generateDefinitionsFilesToolStripMenuItem.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); + this.generateDefinitionsFilesToolStripMenuItem.Name = "generateDefinitionsFilesToolStripMenuItem"; + this.generateDefinitionsFilesToolStripMenuItem.Size = new System.Drawing.Size(367, 22); + this.generateDefinitionsFilesToolStripMenuItem.Text = "Generate Definitions files from all firmwares files"; + this.generateDefinitionsFilesToolStripMenuItem.Click += new System.EventHandler(this.generateDefinitionsFilesToolStripMenuItem_Click); + // + // getDifferencesInAllFirmwaresFilesToolStripMenuItem + // + this.getDifferencesInAllFirmwaresFilesToolStripMenuItem.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); + this.getDifferencesInAllFirmwaresFilesToolStripMenuItem.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); + this.getDifferencesInAllFirmwaresFilesToolStripMenuItem.Name = "getDifferencesInAllFirmwaresFilesToolStripMenuItem"; + this.getDifferencesInAllFirmwaresFilesToolStripMenuItem.Size = new System.Drawing.Size(367, 22); + this.getDifferencesInAllFirmwaresFilesToolStripMenuItem.Text = "Get differences count in all firmwares files"; + this.getDifferencesInAllFirmwaresFilesToolStripMenuItem.Click += new System.EventHandler(this.getDifferencesInAllFirmwaresFilesToolStripMenuItem_Click); + // + // extractAllBootloadersumByteFromAllFirmwaresFilesToolStripMenuItem + // + this.extractAllBootloadersumByteFromAllFirmwaresFilesToolStripMenuItem.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); + this.extractAllBootloadersumByteFromAllFirmwaresFilesToolStripMenuItem.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); + this.extractAllBootloadersumByteFromAllFirmwaresFilesToolStripMenuItem.Name = "extractAllBootloadersumByteFromAllFirmwaresFilesToolStripMenuItem"; + this.extractAllBootloadersumByteFromAllFirmwaresFilesToolStripMenuItem.Size = new System.Drawing.Size(367, 22); + this.extractAllBootloadersumByteFromAllFirmwaresFilesToolStripMenuItem.Text = "Extract all bootloader \'sum\' byte from all firmwares files"; + this.extractAllBootloadersumByteFromAllFirmwaresFilesToolStripMenuItem.Click += new System.EventHandler(this.extractAllBootloadersumByteFromAllFirmwaresFilesToolStripMenuItem_Click); + // + // extractDefinitionToolStripMenuItem + // + this.extractDefinitionToolStripMenuItem.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); + this.extractDefinitionToolStripMenuItem.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); + this.extractDefinitionToolStripMenuItem.Name = "extractDefinitionToolStripMenuItem"; + this.extractDefinitionToolStripMenuItem.Size = new System.Drawing.Size(367, 22); + this.extractDefinitionToolStripMenuItem.Text = "Extract Definition file"; + this.extractDefinitionToolStripMenuItem.Click += new System.EventHandler(this.extractDefinitionToolStripMenuItem_Click); + // + // splitContainer1 + // + this.splitContainer1.BackColor = System.Drawing.SystemColors.ControlDark; + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(0, 28); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.treeView1); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.splitContainer2); + this.splitContainer1.Size = new System.Drawing.Size(1100, 517); + this.splitContainer1.SplitterDistance = 297; + this.splitContainer1.TabIndex = 4; + // + // splitContainer2 + // + this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer2.Location = new System.Drawing.Point(0, 0); + this.splitContainer2.Name = "splitContainer2"; + this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer2.Panel1 + // + this.splitContainer2.Panel1.Controls.Add(this.groupBox1); + // + // splitContainer2.Panel2 + // + this.splitContainer2.Panel2.Controls.Add(this.darkTextBox_0); + this.splitContainer2.Size = new System.Drawing.Size(799, 517); + this.splitContainer2.SplitterDistance = 361; + this.splitContainer2.TabIndex = 0; + // + // darkTextBox_0 + // + this.darkTextBox_0.Dock = System.Windows.Forms.DockStyle.Fill; + this.darkTextBox_0.Location = new System.Drawing.Point(0, 0); + this.darkTextBox_0.Multiline = true; + this.darkTextBox_0.Name = "darkTextBox_0"; + this.darkTextBox_0.Size = new System.Drawing.Size(799, 152); + this.darkTextBox_0.TabIndex = 56; + this.darkTextBox_0.Text = "Honda CANBUS Tools"; + // + // toolStripSeparator3 + // + this.toolStripSeparator3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); + this.toolStripSeparator3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); + this.toolStripSeparator3.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(211, 6); + // + // removeBootloaderInbinToolStripMenuItem + // + this.removeBootloaderInbinToolStripMenuItem.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); + this.removeBootloaderInbinToolStripMenuItem.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); + this.removeBootloaderInbinToolStripMenuItem.Name = "removeBootloaderInbinToolStripMenuItem"; + this.removeBootloaderInbinToolStripMenuItem.Size = new System.Drawing.Size(214, 22); + this.removeBootloaderInbinToolStripMenuItem.Text = "Remove Bootloader in .bin"; + this.removeBootloaderInbinToolStripMenuItem.Click += new System.EventHandler(this.removeBootloaderInbinToolStripMenuItem_Click); + // + // generateDefinitionFileFromExtractedDefinitionToolStripMenuItem + // + this.generateDefinitionFileFromExtractedDefinitionToolStripMenuItem.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); + this.generateDefinitionFileFromExtractedDefinitionToolStripMenuItem.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); + this.generateDefinitionFileFromExtractedDefinitionToolStripMenuItem.Name = "generateDefinitionFileFromExtractedDefinitionToolStripMenuItem"; + this.generateDefinitionFileFromExtractedDefinitionToolStripMenuItem.Size = new System.Drawing.Size(367, 22); + this.generateDefinitionFileFromExtractedDefinitionToolStripMenuItem.Text = "Generate Definition file from Extracted Definition"; + this.generateDefinitionFileFromExtractedDefinitionToolStripMenuItem.Click += new System.EventHandler(this.generateDefinitionFileFromExtractedDefinitionToolStripMenuItem_Click); + // // Editortable // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(1100, 545); - this.Controls.Add(this.tableLayoutPanel1); + this.Controls.Add(this.splitContainer1); this.Controls.Add(this.darkToolStrip1); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Margin = new System.Windows.Forms.Padding(2); this.Name = "Editortable"; this.Text = "Honda Rom Tables Editor"; this.Load += new System.EventHandler(this.Editortable_Load); - this.tableLayoutPanel1.ResumeLayout(false); this.groupBox1.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.dataGridView_0)).EndInit(); this.darkToolStrip1.ResumeLayout(false); this.darkToolStrip1.PerformLayout(); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.splitContainer2.Panel1.ResumeLayout(false); + this.splitContainer2.Panel2.ResumeLayout(false); + this.splitContainer2.Panel2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit(); + this.splitContainer2.ResumeLayout(false); this.ResumeLayout(false); } @@ -374,10 +565,7 @@ public bool LoadDefinitionsFor(string string_9) { ClassEditor_0.LoadThisECUDefinitions(string_9); - foreach (string str2 in ClassEditor_0.DefinitionsName) - { - this.list_0.Add(str2); - } + //foreach (string str2 in ClassEditor_0.DefinitionsName) this.NodesNameList.Add(str2); return true; } } @@ -387,7 +575,7 @@ public bool LoadDefinitionsFor(string string_9) public void method_1() { - ClassEditor_0.bool_1 = false; + ClassEditor_0.CanReloadTablesValues = false; if (!ClassEditor_0.LoadROMbytes(LoadedFilename)) { DarkMessageBox.Show("Failed to open Binary file."); @@ -398,41 +586,134 @@ public void method_1() } else { - this.SetNodesImages(); + this.CreateNodes(); } - ClassEditor_0.bool_1 = true; + ClassEditor_0.CanReloadTablesValues = true; } private void CellValueChanged(object sender, DataGridViewCellEventArgs e) { - if (ClassEditor_0.bool_1) + if (ClassEditor_0.CanReloadTablesValues) { - ClassEditor_0.bool_2 = true; + ClassEditor_0.ValuesChanged = true; ClassEditor_0.SetBackColor(dataGridView_0.Columns.Count, float_1[0], float_1[1]); } } - public void SetNodesImages() + public void CreateNodes() { this.treeView1.Nodes.Clear(); int num = 0; + List AllUndefininedNodes = new List(); + List AllUntestedNodes = new List(); + List AllReadOnlyNodes = new List(); + //Makes Nodes - foreach (string str in this.list_0) + for (int i = 0; i < ClassEditor_0.DefinitionsName.Count; i++) { + //############################################# + if (ClassEditor_0.DefinitionsIsReadOnly[i]) + { + AllReadOnlyNodes.Add(ClassEditor_0.DefinitionsName[i]); + } + if (ClassEditor_0.DefinitionsIsUntested[i] && !ClassEditor_0.DefinitionsIsReadOnly[i]) + { + AllUntestedNodes.Add(ClassEditor_0.DefinitionsName[i]); + } + if (ClassEditor_0.DefinitionsIsNotDefined[i] && !ClassEditor_0.DefinitionsIsUntested[i] && !ClassEditor_0.DefinitionsIsReadOnly[i]) + { + AllUndefininedNodes.Add(ClassEditor_0.DefinitionsName[i]); + } + //############################################# + + if (!ClassEditor_0.DefinitionsIsNotDefined[i] && !ClassEditor_0.DefinitionsIsUntested[i] && !ClassEditor_0.DefinitionsIsReadOnly[i]) + { + string str = ClassEditor_0.DefinitionsName[i]; + DarkTreeNode ThisNode = new DarkTreeNode(); + if (str.ToString().Contains("----")) + { + ThisNode.Text = str.Replace("----", ""); + this.treeView1.Nodes[this.treeView1.Nodes.Count - 1].Nodes[this.treeView1.Nodes[this.treeView1.Nodes.Count - 1].Nodes.Count - 1].Nodes.Add(ThisNode); + continue; + } + if (str.ToString().Contains("--")) + { + ThisNode.Text = str.Replace("--", ""); + this.treeView1.Nodes[this.treeView1.Nodes.Count - 1].Nodes.Add(ThisNode); + continue; + } + num++; + + ThisNode.Text = str; + this.treeView1.Nodes.Add(ThisNode); + } + } + + //Make Undefined Nodes + DarkTreeNode ThisNodeUnDefined = new DarkTreeNode(); + ThisNodeUnDefined.Text = "Undefined parameters"; + if (AllUndefininedNodes.Count > 0) this.treeView1.Nodes.Add(ThisNodeUnDefined); + for (int i = 0; i < AllUndefininedNodes.Count; i++) + { + string str = AllUndefininedNodes[i]; DarkTreeNode ThisNode = new DarkTreeNode(); if (str.ToString().Contains("--")) { ThisNode.Text = str.Replace("--", ""); this.treeView1.Nodes[this.treeView1.Nodes.Count - 1].Nodes.Add(ThisNode); + //this.treeView1.Nodes[this.treeView1.Nodes.Count - 1].Nodes[this.treeView1.Nodes[this.treeView1.Nodes.Count - 1].Nodes.Count - 1].Nodes.Add(ThisNode); continue; } num++; ThisNode.Text = str; - this.treeView1.Nodes.Add(ThisNode); + this.treeView1.Nodes[this.treeView1.Nodes.Count - 1].Nodes.Add(ThisNode); } + //Make Untested Nodes + DarkTreeNode ThisNodeUnTested = new DarkTreeNode(); + ThisNodeUnTested.Text = "Untested parameters"; + if (AllUntestedNodes.Count > 0) this.treeView1.Nodes.Add(ThisNodeUnTested); + for (int i = 0; i < AllUntestedNodes.Count; i++) + { + string str = AllUntestedNodes[i]; + DarkTreeNode ThisNode = new DarkTreeNode(); + if (str.ToString().Contains("--")) + { + ThisNode.Text = str.Replace("--", ""); + this.treeView1.Nodes[this.treeView1.Nodes.Count - 1].Nodes.Add(ThisNode); + //this.treeView1.Nodes[this.treeView1.Nodes.Count - 1].Nodes[this.treeView1.Nodes[this.treeView1.Nodes.Count - 1].Nodes.Count - 1].Nodes.Add(ThisNode); + continue; + } + num++; + + ThisNode.Text = str; + this.treeView1.Nodes[this.treeView1.Nodes.Count - 1].Nodes.Add(ThisNode); + } + + //Make ReadOnly Nodes + DarkTreeNode ThisNodeReadOnly = new DarkTreeNode(); + ThisNodeReadOnly.Text = "ReadOnly parameters"; + if (AllUntestedNodes.Count > 0) this.treeView1.Nodes.Add(ThisNodeReadOnly); + for (int i = 0; i < AllReadOnlyNodes.Count; i++) + { + string str = AllReadOnlyNodes[i]; + DarkTreeNode ThisNode = new DarkTreeNode(); + if (str.ToString().Contains("--")) + { + ThisNode.Text = str.Replace("--", ""); + this.treeView1.Nodes[this.treeView1.Nodes.Count - 1].Nodes.Add(ThisNode); + //this.treeView1.Nodes[this.treeView1.Nodes.Count - 1].Nodes[this.treeView1.Nodes[this.treeView1.Nodes.Count - 1].Nodes.Count - 1].Nodes.Add(ThisNode); + continue; + } + num++; + + ThisNode.Text = str; + this.treeView1.Nodes[this.treeView1.Nodes.Count - 1].Nodes.Add(ThisNode); + } + + //#################################################################################### /*foreach (DarkTreeNode node in this.treeView1.Nodes) { if (node.Nodes.Count > 0) @@ -458,11 +739,7 @@ public void SetNodesImages() node.SelectedImageKey = "Degree"; }//... }*/ - } - - private void method_3(object sender, EventArgs e) - { - dataGridView_0.ReadOnly = false; + //#################################################################################### } private void method_4(object sender, KeyEventArgs e) @@ -569,16 +846,15 @@ private void treeView1_AfterSelect(object sender, EventArgs e) { if (this.treeView1.SelectedNodes.Count == 0) return; - if ((this.treeView1.SelectedNode != null) && ClassEditor_0.bool_1) + if ((this.treeView1.SelectedNode != null) && ClassEditor_0.CanReloadTablesValues) { - ClassEditor_0.bool_1 = false; + ClassEditor_0.CanReloadTablesValues = false; //################################################################################## - if (ClassEditor_0.bool_2 && ClassEditor_0.SelectedTableSize != 0 && ClassEditor_0.SelectedROMLocation != 0) + if (ClassEditor_0.ValuesChanged && ClassEditor_0.SelectedTableSize != 0 && ClassEditor_0.SelectedROMLocation != 0) { ClassEditor_0.GetChanges(); - ClassEditor_0.string_2 = ClassEditor_0.string_2 + ClassEditor_0.string_3 + Environment.NewLine; } - ClassEditor_0.bool_2 = false; + ClassEditor_0.ValuesChanged = false; //################################################################################## this.groupBox1.Text = "Table: " + this.treeView1.SelectedNode.Text; @@ -592,7 +868,7 @@ private void treeView1_AfterSelect(object sender, EventArgs e) if (NodeIndex == -1) { Editortable_0.GForm_Main_0.method_1("ROM Indexing error with Nodes!"); - ClassEditor_0.bool_1 = true; + ClassEditor_0.CanReloadTablesValues = true; return; } @@ -601,7 +877,7 @@ private void treeView1_AfterSelect(object sender, EventArgs e) { try { - ClassEditor_0.bool_1 = true; + ClassEditor_0.CanReloadTablesValues = true; this.treeView1.SelectNode(this.treeView1.SelectedNode.Nodes[0]); } catch { } @@ -649,15 +925,29 @@ private void treeView1_AfterSelect(object sender, EventArgs e) textArray1 = ClassEditor_0.GetAdvancedHeader(TableSizze[0], ParamHeaderLocation, ClassEditor_0.DefinitionsMathY[NodeIndex], ClassEditor_0.DefinitionsFormatY[NodeIndex]); } + this.groupBox1.Text = "Table: " + this.treeView1.SelectedNode.Text + " (" + ClassEditor_0.DefinitionsLocationsTable[NodeIndex] + ")"; + + ClassEditor_0.SelectedTableIndexInDefinitions = NodeIndex; + //Show Value in Datagridview - ClassEditor_0.SetTableValues(TableSizze, ParamLocation, ClassEditor_0.DefinitionsUnit1[NodeIndex], ClassEditor_0.DefinitionsUnit2[NodeIndex], textArray1, ClassEditor_0.DefinitionsMathX[NodeIndex], ClassEditor_0.DefinitionsFormatX[NodeIndex], ClassEditor_0.DefinitionsIsXYInverted[NodeIndex], ClassEditor_0.HexStringToInt(ClassEditor_0.DefinitionsLocationsTable[NodeIndex]), ClassEditor_0.DefinitionsMathTable[NodeIndex], ClassEditor_0.DefinitionsFormatTable[NodeIndex], ClassEditor_0.DefinitionsIsTableInverted[NodeIndex]); + ClassEditor_0.SetTableValues(TableSizze, + ParamLocation, + ClassEditor_0.DefinitionsUnit1[NodeIndex], + ClassEditor_0.DefinitionsUnit2[NodeIndex], + textArray1, ClassEditor_0.DefinitionsMathX[NodeIndex], + ClassEditor_0.DefinitionsFormatX[NodeIndex], + ClassEditor_0.DefinitionsIsXYInverted[NodeIndex], + ClassEditor_0.HexStringToInt(ClassEditor_0.DefinitionsLocationsTable[NodeIndex]), + ClassEditor_0.DefinitionsMathTable[NodeIndex], ClassEditor_0.DefinitionsFormatTable[NodeIndex], + ClassEditor_0.DefinitionsIsTableInverted[NodeIndex], + ClassEditor_0.DefinitionsIsReadOnly[NodeIndex]); } } - ClassEditor_0.bool_1 = true; + ClassEditor_0.CanReloadTablesValues = true; } - private int CheckForBootLoaderSum(string ThisECUName) + public int CheckForBootLoaderSum(string ThisECUName) { string BLSumPath = Application.StartupPath + @"\BootLoaderSumBytesList.txt"; if (File.Exists(BLSumPath)) @@ -714,63 +1004,62 @@ public string ExtractECUNameFromThisFile(byte[] ThisFileBytes) return ECUName; } - private void button1_Click(object sender, EventArgs e) + public void LoadThisFile(string ThisFilePath) { - DialogResult result = openFileDialog1.ShowDialog(); - if (result == DialogResult.OK) + this.Text = "Honda Rom Tables Editor (" + this.GForm_Main_0.Version + ") | " + Path.GetFileName(ThisFilePath); + + string LastOpenFilePath = Application.StartupPath + @"\LastFileOpened.txt"; + File.Create(LastOpenFilePath).Dispose(); + File.WriteAllText(LastOpenFilePath, ThisFilePath); + + byte[] FilesBytes = File.ReadAllBytes(ThisFilePath); + this.Editortable_0.LoadedFilename = ThisFilePath; + if ((FilesBytes.Length - 1) == 0xFFFFF) this.IsFullBinary = true; + + //Load BootLoader Sum byte for decrypted firmware (not a full binary rom) + if ((FilesBytes.Length - 1) == 0xF7FFF) { - if (openFileDialog1.FilterIndex == 1) + this.IsFullBinary = false; + + int BtSumInt = CheckForBootLoaderSum(ExtractECUNameFromThisFile(FilesBytes)); + if (BtSumInt == -1) { - byte[] FilesBytes = File.ReadAllBytes(openFileDialog1.FileName); - if ((FilesBytes.Length - 1) == 0xFFFFF) - { - this.Editortable_0.LoadedFilename = openFileDialog1.FileName; - this.IsFullBinary = true; + DarkMessageBox.Show(this, "Since this decompressed firmware .bin file is missing the bootloader section\nSelect the firmware .rwd file from which is as been decompressed from", "MISSING BOOTLOADER SECTION FOR CHECKSUMS VERIFICATIONS", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - //Load Binary into ROM Table Editor - this.Editortable_0.method_1(); - } - else + //Open RWD firmware + openFileDialog1.Filter = "Honda Compressed RWD Firmware|*.gz;*.rwd"; + openFileDialog1.DefaultExt = "*.gz"; + DialogResult result = openFileDialog1.ShowDialog(); + if (result == DialogResult.OK) { - DarkMessageBox.Show(this, "This file is not compatible!"); + Class_RWD.LoadRWD(openFileDialog1.FileName, true, false); } } - if (openFileDialog1.FilterIndex == 2) + else { - byte[] FilesBytes = File.ReadAllBytes(openFileDialog1.FileName); - if ((FilesBytes.Length - 1) == 0xF7FFF) - { - this.Editortable_0.LoadedFilename = openFileDialog1.FileName; - this.IsFullBinary = false; - - int BtSumInt = CheckForBootLoaderSum(ExtractECUNameFromThisFile(FilesBytes)); - if (BtSumInt == -1) - { - DarkMessageBox.Show(this, "Since this decompressed firmware .bin file is missing the bootloader section\nSelect the firmware .rwd file from which is as been decompressed from", "MISSING BOOTLOADER SECTION FOR CHECKSUMS VERIFICATIONS", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + Class_RWD.BootloaderSum = (byte)BtSumInt; + } + } - //Open RWD firmware - openFileDialog1.Filter = "Honda Compressed RWD Firmware|*.gz;*.rwd"; - openFileDialog1.DefaultExt = "*.gz"; - result = openFileDialog1.ShowDialog(); - if (result == DialogResult.OK) - { - Class_RWD.LoadRWD(openFileDialog1.FileName, true, false); - } - } - else - { - Class_RWD.BootloaderSum = (byte) BtSumInt; - } + //Load File + if ((FilesBytes.Length - 1) == 0xF7FFF || (FilesBytes.Length - 1) == 0xFFFFF) + { + //Load Binary into ROM Table Editor + this.Editortable_0.method_1(); + } + else + { + Console.WriteLine((FilesBytes.Length - 1).ToString("X")); + DarkMessageBox.Show(this, "This file is not compatible!"); + } + } - //Load Binary into ROM Table Editor - this.Editortable_0.method_1(); - } - else - { - Console.WriteLine((FilesBytes.Length - 1).ToString("X")); - DarkMessageBox.Show(this, "This file is not compatible!"); - } - } + private void button1_Click(object sender, EventArgs e) + { + DialogResult result = openFileDialog1.ShowDialog(); + if (result == DialogResult.OK) + { + LoadThisFile(openFileDialog1.FileName); } } @@ -821,5 +1110,207 @@ private void fixChecksumsToolStripMenuItem_Click(object sender, EventArgs e) { ClassEditor_0.FixChecksums(); } + + + + private void generateDefinitionsFilesToolStripMenuItem_Click(object sender, EventArgs e) + { + DarkMessageBox.Show(this, "Select the folder where all decrypted firmwares .bin are located.", "Select firmwares folder", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + + DialogResult result = folderBrowserDialog1.ShowDialog(); + if (result == DialogResult.OK) + { + GForm_Main_0.Class_DefinitionMaker_0.FirmwareFolder = folderBrowserDialog1.SelectedPath; + GForm_Main_0.Class_DefinitionMaker_0.CreateDefinitionsFiles(); + } + } + + private void getDifferencesInAllFirmwaresFilesToolStripMenuItem_Click(object sender, EventArgs e) + { + DarkMessageBox.Show(this, "Select the folder where all decrypted firmwares .bin are located.", "Select firmwares folder", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + + DialogResult result = folderBrowserDialog1.ShowDialog(); + if (result == DialogResult.OK) + { + GForm_Main_0.Class_DefinitionMaker_0.FirmwareFolder = folderBrowserDialog1.SelectedPath; + GForm_Main_0.Class_DefinitionMaker_0.GetFilesDifferenceCount(); + } + } + + private void extractAllBootloadersumByteFromAllFirmwaresFilesToolStripMenuItem_Click(object sender, EventArgs e) + { + DarkMessageBox.Show(this, "Select the folder where all decrypted firmwares .bin are located.", "Select firmwares folder", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + + DialogResult result = folderBrowserDialog1.ShowDialog(); + if (result == DialogResult.OK) + { + GForm_Main_0.Class_DefinitionMaker_0.FirmwareFolder = folderBrowserDialog1.SelectedPath; + GForm_Main_0.Class_DefinitionMaker_0.ExtractAllBootLoaderSum_1Mb(); + } + } + + private void extractDefinitionToolStripMenuItem_Click(object sender, EventArgs e) + { + GForm_Main_0.Class_DefinitionMaker_0.Extract(); + if (GForm_Main_0.Class_DefinitionMaker_0.CurrentExtractedDumps > 1) GForm_Main_0.Class_DefinitionMaker_0.CreateExtractedDefinition(); + } + + [CompilerGenerated] + private sealed class Class5 + { + + public Class5() + { + } + + + internal void method_0() + { + this.Editortable_0.darkTextBox_0.AppendText(this.string_0 + Environment.NewLine); + } + + + public Editortable Editortable_0; + + + public string string_0; + } + + private void undoToolStripMenuItem_Click(object sender, EventArgs e) + { + //this.ClassEditor_0.AllROMDifferences.Contains(Environment.NewLine) + if (this.ClassEditor_0.AllROMDifferences != "") + { + string[] lines = this.ClassEditor_0.AllROMDifferences.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); + if (lines.Length > 0) + { + for (int i = lines.Length - 1; i >= 0; i--) + { + if (lines[i] != "") + { + string CommandsLine = lines[i].Replace(" ", ""); + if (CommandsLine.Contains(":")) + { + string[] CmdsSpli1 = CommandsLine.Split(':'); + int Index = int.Parse(CmdsSpli1[1].Split('[')[0]); + string RemainingCmds = CmdsSpli1[1].Split('[')[1].Replace("->", ";"); + int num1 = int.Parse(RemainingCmds.Split(';')[0]); + int num2 = int.Parse(RemainingCmds.Split(';')[1].Split(']')[0]); + int intLocationnValue = int.Parse(CmdsSpli1[2].Replace("0x", ""), System.Globalization.NumberStyles.HexNumber); + + //Apply Changes + this.ClassEditor_0.ROM_Bytes[intLocationnValue] = (byte)num1; + + //Send Logs + string BufText = "Undo change at line: " + Index.ToString() + "[" + num2.ToString("X2") + "->" + num1.ToString("X2") + "] | At: 0x" + (intLocationnValue).ToString("X") + Environment.NewLine; + GForm_Main_0.method_1(BufText); + + //Remove from rom differences (string list) + string BufferROMDiff = ""; + if (i > 0) + { + for (int i2 = 0; i2 < i; i2++) BufferROMDiff = BufferROMDiff + lines[i2]; + this.ClassEditor_0.AllROMDifferences = BufferROMDiff; + } + + //add to Redo list + this.ClassEditor_0.AllROMDifferencesRedo = this.ClassEditor_0.AllROMDifferencesRedo + lines[i] + Environment.NewLine; + redoToolStripMenuItem.Enabled = true; + + //return + i = -1; + } + } + } + } + } + } + + private void redoToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.ClassEditor_0.AllROMDifferencesRedo != "") + { + string[] lines = this.ClassEditor_0.AllROMDifferencesRedo.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); + if (lines.Length > 0) + { + for (int i = lines.Length - 1; i >= 0; i--) + { + if (lines[i] != "") + { + string CommandsLine = lines[i].Replace(" ", ""); + if (CommandsLine.Contains(":")) + { + string[] CmdsSpli1 = CommandsLine.Split(':'); + int Index = int.Parse(CmdsSpli1[1].Split('[')[0]); + string RemainingCmds = CmdsSpli1[1].Split('[')[1].Replace("->", ";"); + int num1 = int.Parse(RemainingCmds.Split(';')[0]); + int num2 = int.Parse(RemainingCmds.Split(';')[1].Split(']')[0]); + int intLocationnValue = int.Parse(CmdsSpli1[2].Replace("0x", ""), System.Globalization.NumberStyles.HexNumber); + + //Apply Changes + this.ClassEditor_0.ROM_Bytes[intLocationnValue] = (byte)num2; + + //Send Logs + string BufText = "Redo change at line: " + Index.ToString() + "[" + num1.ToString("X2") + "->" + num2.ToString("X2") + "] | At: 0x" + (intLocationnValue).ToString("X") + Environment.NewLine; + GForm_Main_0.method_1(BufText); + + //Remove from Redo list + string BufferROMDiff = ""; + if (i > 0) + { + for (int i2 = 0; i2 < i; i2++) BufferROMDiff = BufferROMDiff + lines[i2]; + this.ClassEditor_0.AllROMDifferencesRedo = BufferROMDiff; + } + + //add to rom differences (string list) + this.ClassEditor_0.AllROMDifferences = this.ClassEditor_0.AllROMDifferences + lines[i] + Environment.NewLine; + + if (this.ClassEditor_0.AllROMDifferencesRedo == "") redoToolStripMenuItem.Enabled = false; + + //return + i = -1; + } + } + } + } + } + } + + private void removeBootloaderInbinToolStripMenuItem_Click(object sender, EventArgs e) + { + DarkMessageBox.Show(this, "Select the file to remove the Bootloader(Start) section from\nThe created .bin with removed bootloader can now be used as a 'decrypted firmware .bin'\nYou can also remake a firmware .rwd update file from this .bin and use it to flash on the ECU!", "Select full binary rom .bin", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + + DialogResult result = openFileDialog1.ShowDialog(); + if (result == DialogResult.OK) + { + byte[] FilesBytes = File.ReadAllBytes(openFileDialog1.FileName); + if ((FilesBytes.Length - 1) == 0xFFFFF) + { + //remove 0x0000 to 0x8000 + byte[] FilesBytesRWD = new byte[FilesBytes.Length - 0x8000]; + for (int i = 0; i < FilesBytesRWD.Length; i++) + { + FilesBytesRWD[i] = FilesBytes[i + 0x8000]; + } + + string SaveeePath = Path.GetDirectoryName(openFileDialog1.FileName) + @"\" + Path.GetFileNameWithoutExtension(openFileDialog1.FileName) + "_NoBootloader.bin"; + File.Create(SaveeePath).Dispose(); + File.WriteAllBytes(SaveeePath, FilesBytesRWD); + + GForm_Main_0.method_1("Removed Bootloader file created: " + SaveeePath); + } + else + { + Console.WriteLine((FilesBytes.Length - 1).ToString("X")); + DarkMessageBox.Show(this, "This file is not compatible!"); + } + } + } + + private void generateDefinitionFileFromExtractedDefinitionToolStripMenuItem_Click(object sender, EventArgs e) + { + GForm_Main_0.Class_DefinitionMaker_0.CurrentExtractedDumps = 2; + GForm_Main_0.Class_DefinitionMaker_0.CreateExtractedDefinition(); + } } diff --git a/Editortable.resx b/Editortable.resx index c236d6e..f0f7ff9 100644 --- a/Editortable.resx +++ b/Editortable.resx @@ -157,6 +157,24 @@ TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + 424, 17 + AAABAAEAAAAAAAEAIAAokQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAEAAAABAAgGAAAAXHKoZgAAgABJ diff --git a/GForm_Main.cs b/GForm_Main.cs index 428b472..0a48bf6 100644 --- a/GForm_Main.cs +++ b/GForm_Main.cs @@ -21,7 +21,7 @@ public class GForm_Main : DarkForm private DarkButton darkButton2; private OpenFileDialog openFileDialog1; byte Unlocking_Mode = 0x41; - bool WritingBinaryMode = true; //if false we are in writing firmware mode + bool WritingBinaryMode = true; //if false we are in writing firmware mode, this is set later anyway private DarkButton darkButton_FlashFW; private GForm_Main GForm_Main_0; private DarkGroupBox DarkgroupBox1; @@ -30,7 +30,12 @@ public class GForm_Main : DarkForm private DarkButton darkButton6; private DarkButton darkButton3; public Editortable Editortable_0; - public string Version = "v1.1.1"; + public string Version = "v1.1.2"; + private DarkTextBox darkTextBoxJ2534Command; + private DarkLabel darkLabel1; + private DarkButton darkButtonJ2534Command; + public Class_DefinitionMaker Class_DefinitionMaker_0; + private bool BadResponceReceived = false; public GForm_Main() { @@ -49,10 +54,7 @@ public GForm_Main() this.Text = this.Text + " (" + Version + ")"; - Class_DefinitionMaker Class_DefinitionMaker_0 = new Class_DefinitionMaker(); - //Class_DefinitionMaker_0.CreateDefinitionsFiles(); - //Class_DefinitionMaker_0.GetFilesDifferenceCount(); //may not be used anymore - //Class_DefinitionMaker_0.ExtractAllBootLoaderSum_1Mb(); //may not be used anymore + Class_DefinitionMaker_0 = new Class_DefinitionMaker(ref GForm_Main_0); } @@ -75,6 +77,9 @@ public void method_Log(string string_3) { this.darkTextBox_0.Text += string_3; //Console.Write(string_3); + + //Send to ROM Editor logs + Editortable_0.method_Log(string_3); } @@ -88,6 +93,9 @@ public void method_1(string string_3) @class.gform0_0 = this; @class.string_0 = string_3; this.darkTextBox_0.BeginInvoke(new MethodInvoker(@class.method_0)); + + //Send to ROM Editor logs + Editortable_0.method_1(string_3); } catch { } } @@ -120,6 +128,20 @@ private void method_3(object sender, EventArgs e) } } + private void SetCommandText(byte[] CommandArray) + { + try + { + darkTextBoxJ2534Command.Text = ""; + for (int i = 0; i < CommandArray.Length; i++) + { + darkTextBoxJ2534Command.Text = darkTextBoxJ2534Command.Text + CommandArray[i].ToString("X2"); + if (i < CommandArray.Length - 1) darkTextBoxJ2534Command.Text = darkTextBoxJ2534Command.Text + ","; + } + } + catch { } + } + private void darkButton1_Click(object sender, EventArgs e) { @@ -130,52 +152,18 @@ private void darkButton1_Click(object sender, EventArgs e) this.darkButton_Unlock01.Enabled = false; this.darkButton_FlashRom.Enabled = false; this.darkButton_FlashFW.Enabled = false; + this.darkButtonJ2534Command.Enabled = false; using (API api = APIFactory.GetAPI(GForm_Main.string_0)) { try { - Device device = api.GetDevice(""); - Channel channel = device.GetChannel(Protocol.ISO15765, Baud.CAN, ConnectFlag.CAN_29BIT_ID, false); - //using (Device device = api.GetDevice("")) - //{ - // using (Channel channel = device.GetChannel(Protocol.ISO15765, Baud.CAN, ConnectFlag.CAN_29BIT_ID, false)) - // { - channel = LoadJ2534Channel(channel); - /*MessageFilter messageFilter = new MessageFilter(); - messageFilter.FilterType = Filter.FLOW_CONTROL_FILTER; - messageFilter.Mask = new byte[] - { - byte.MaxValue, - byte.MaxValue, - byte.MaxValue, - byte.MaxValue - }; - messageFilter.Pattern = new byte[] - { - 24, //0x18 - 218, //0xDA - 241, //0xF1 - GForm_Main.byte_3 //0x00 - }; - messageFilter.FlowControl = new byte[] - { - 24, //0x18 - 218, //0xDA - GForm_Main.byte_3, //0x00 -> 0x10|0x11 - 241 //0xF1 - }; - MessageFilter filter = messageFilter; - channel.StartMsgFilter(filter); - SConfig[] config = new SConfig[] - { - new SConfig(Parameter.LOOP_BACK, 1), - new SConfig(Parameter.DATA_RATE, 500000) - }; - channel.SetConfig(config);*/ + using (Device device = api.GetDevice("")) + { + using (Channel channel = device.GetChannel(Protocol.ISO15765, Baud.CAN, ConnectFlag.CAN_29BIT_ID, false)) + { + LoadJ2534Channel(channel); - //############################################################# - //############################################################# int num2 = 0; byte[] arraySend1 = new byte[] { @@ -183,7 +171,8 @@ private void darkButton1_Click(object sender, EventArgs e) 241, //0xF1 144 //0x90 }; - byte[] Received = SendJ2534Message(channel, arraySend1); + byte[] Received = SendJ2534Message(channel, arraySend1, 5); + if (BadResponceReceived) return; int num4 = GForm_Main.smethod_0(Received, byte_1); if (num4 != -1) @@ -202,7 +191,9 @@ private void darkButton1_Click(object sender, EventArgs e) 241, //0xF1 129 //0x81 }; - Received = SendJ2534Message(channel, arraySend1); + Received = SendJ2534Message(channel, arraySend1, 5); + if (BadResponceReceived) return; + int num6 = GForm_Main.smethod_0(Received, byte_0); if (num6 != -1) { @@ -227,9 +218,10 @@ private void darkButton1_Click(object sender, EventArgs e) { this.darkButton_Unlock41.Enabled = true; this.darkButton_Unlock01.Enabled = true; + this.darkButtonJ2534Command.Enabled = true; } - //} - //} + } + } } catch (Exception ex) { @@ -271,7 +263,30 @@ private void method_6(object sender, ProgressChangedEventArgs e) private void method_7_Nothing(object sender, RunWorkerCompletedEventArgs e) { + if (!ECU_Unlocked) + { + ECU_Unlocked = false; + this.darkButton_DownloadROM.Enabled = false; + this.darkButton_FlashRom.Enabled = false; + this.darkButton_FlashFW.Enabled = false; + DarkMessageBox.Show("Failed to Unlock ECU, Check Log"); + } + if (ECU_Unlocked) + { + if (Unlocking_Mode == 0x41) + { + //Unlock ALL buttons (Read&Writes) for 0x27,0x41 Unlock + this.darkButton_DownloadROM.Enabled = true; + this.darkButton_FlashRom.Enabled = true; + this.darkButton_FlashFW.Enabled = true; + } + else + { + //Unlock FlashFW button (Write FW ONLY) for 0x27,0x01 Unlock + this.darkButton_FlashFW.Enabled = true; + } + } } private void method_7(object sender, RunWorkerCompletedEventArgs e) @@ -355,189 +370,152 @@ public void method_UnlockECU(object sender, DoWorkEventArgs e) { ECU_Unlocked = false; - API api = APIFactory.GetAPI(GForm_Main.string_0); - //using (API api = APIFactory.GetAPI(GForm_Main.string_0)) - //{ - Device device = api.GetDevice(""); - Channel channel = device.GetChannel(Protocol.ISO15765, Baud.CAN, ConnectFlag.CAN_29BIT_ID, false); - //using (Device device = api.GetDevice("")) - //{ - // using (Channel channel = device.GetChannel(Protocol.ISO15765, Baud.CAN, ConnectFlag.CAN_29BIT_ID, false)) - // { - channel = LoadJ2534Channel(channel); - /*MessageFilter messageFilter = new MessageFilter(); - messageFilter.FilterType = Filter.FLOW_CONTROL_FILTER; - messageFilter.Mask = new byte[] - { - byte.MaxValue, - byte.MaxValue, - byte.MaxValue, - byte.MaxValue - }; - messageFilter.Pattern = new byte[] - { - 24, //0x18 - 218, //0xDA - 241, //0xF1 - GForm_Main.byte_3 //0x00 - }; - messageFilter.FlowControl = new byte[] - { - 24, //0x18 - 218, //0xDA - GForm_Main.byte_3, //0x00 -> 0x10|0x11 - 241 //0xF1 - }; - MessageFilter filter = messageFilter; - channel.StartMsgFilter(filter); - SConfig[] config = new SConfig[] - { - new SConfig(Parameter.LOOP_BACK, 1), - new SConfig(Parameter.DATA_RATE, 500000) - }; - channel.SetConfig(config);*/ - - device.SetProgrammingVoltage(Pin.PIN_12, 5000); - - byte[] arraySend1 = new byte[] - { - 16, //0x10 - 3 //0x03 Not supposed to be 02 or FB?? ########################################## - }; - byte[] Received = SendJ2534Message(channel, arraySend1); - if (Received != null) - { - this.method_1("Diag Mode Set"); - } - //################################################################ - arraySend1 = new byte[] + using (API api = APIFactory.GetAPI(GForm_Main.string_0)) + { + try + { + using (Device device = api.GetDevice("")) + { + using (Channel channel = device.GetChannel(Protocol.ISO15765, Baud.CAN, ConnectFlag.CAN_29BIT_ID, false)) { - 39, //0x27 - 65 //0x41 Not supposed to be 05?? -> could be 0x01 0x03 0x05 0x07 or 0x41 - }; - byte SeedSendByte = this.Unlocking_Mode; - arraySend1[1] = SeedSendByte; - this.method_1("Requesting Seed"); - Received = SendJ2534Message(channel, arraySend1); + LoadJ2534Channel(channel); - byte[] byte_ = new byte[] - { - 103, //0x67 - 65 //0x41 - }; - byte_[1] = SeedSendByte; - byte[] array6 = new byte[4]; - bool TwoBytesMode = false; - byte b = 1; + device.SetProgrammingVoltage(Pin.PIN_12, 5000); - if (Received != null) - { - int num = GForm_Main.smethod_2(Received, byte_, 0); - if (num > 0) + byte[] arraySend1 = new byte[] { - if (Received.Length < 10) - { - array6 = new byte[2]; - TwoBytesMode = true; - } - int index = 0; - while (true) - { - if ((!TwoBytesMode && index >= 4) || (TwoBytesMode && index >= 2)) - { - if (!TwoBytesMode) - { - b = Received[(index + num) + 2]; - Array.Reverse(array6); - } + 16, //0x10 + 3 //0x03 Not supposed to be 02 or FB?? ########################################## + }; + byte[] Received = SendJ2534Message(channel, arraySend1, 3); + if (BadResponceReceived) return; - this.method_1("Security Request - Seed Bytes:" + GForm_Main.smethod_1(array6)); - if (!TwoBytesMode) this.method_1("Security Request - Algorithm:" + b.ToString("X2")); - break; - } - array6[index] = Received[(index + num) + 2]; - index++; - } + if (Received != null) + { + this.method_1("Diag Mode Set"); } - } - - if (array6[0] != 0) - { - uint value = 0; - if (!TwoBytesMode) value = Class_Cypher.GetKey41(BitConverter.ToUInt32(array6, 0), b); - else value = Class_Cypher.GetKey01(array6, darkTextBox_2.Text); - - byte[] bytes = BitConverter.GetBytes(value); - this.method_1("Security Request - Key to Send:" + GForm_Main.smethod_1(bytes)); - + //################################################################ arraySend1 = new byte[] { 39, //0x27 - 66 //0x42 + 65 //0x41 Not supposed to be 05?? -> could be 0x01 0x03 0x05 0x07 or 0x41 }; - arraySend1[1] = (byte)(SeedSendByte + 1); - byte[] array8 = arraySend1; - if (!TwoBytesMode) Array.Resize(ref array8, array8.Length + 5); - if (TwoBytesMode) Array.Resize(ref array8, array8.Length + 2); - array8[6] = bytes[0]; //SecurityKey Byte1 - array8[7] = bytes[1]; //SecurityKey Byte2 - if (!TwoBytesMode) - { - array8[8] = bytes[2]; //SecurityKey Byte3 - array8[9] = bytes[3]; //SecurityKey Byte4 - array8[10] = b; //Algorithm Byte - } - byte[] byte_2 = new byte[] + byte SeedSendByte = this.Unlocking_Mode; + arraySend1[1] = SeedSendByte; + this.method_1("Requesting Seed"); + Received = SendJ2534Message(channel, arraySend1, 3); + if (BadResponceReceived) return; + + byte[] byte_ = new byte[] { 103, //0x67 - 66 //0x42 + 65 //0x41 }; - byte_2[1] = (byte)(SeedSendByte + 1); - - Received = SendJ2534Message(channel, array8); + byte_[1] = SeedSendByte; + byte[] array6 = new byte[4]; + bool TwoBytesMode = false; + byte b = 1; if (Received != null) { - int num = GForm_Main.smethod_2(Received, byte_2, 0); //looking for 0x67, 0x42 + int num = GForm_Main.smethod_2(Received, byte_, 0); if (num > 0) { - this.method_1("Security Authorized: ECU Unlocked"); - ECU_Unlocked = true; - if (!TwoBytesMode) + if (Received.Length < 10) { - //Unlock ALL buttons (Read&Writes) for 0x27,0x41 Unlock - this.darkButton_DownloadROM.Enabled = true; - this.darkButton_FlashRom.Enabled = true; - this.darkButton_FlashFW.Enabled = true; + array6 = new byte[2]; + TwoBytesMode = true; } - else + int index = 0; + while (true) { - //Unlock FlashFW button (Write FW ONLY) for 0x27,0x01 Unlock - this.darkButton_FlashFW.Enabled = true; + if ((!TwoBytesMode && index >= 4) || (TwoBytesMode && index >= 2)) + { + if (!TwoBytesMode) + { + b = Received[(index + num) + 2]; + Array.Reverse(array6); + } + + this.method_1("Security Request - Seed Bytes:" + GForm_Main.smethod_1(array6)); + if (!TwoBytesMode) this.method_1("Security Request - Algorithm:" + b.ToString("X2")); + break; + } + array6[index] = Received[(index + num) + 2]; + index++; } } - else + } + + if (array6[0] != 0) + { + uint value = 0; + if (!TwoBytesMode) value = Class_Cypher.GetKey41(BitConverter.ToUInt32(array6, 0), b); + else value = Class_Cypher.GetKey01(array6, darkTextBox_2.Text); + + byte[] bytes = BitConverter.GetBytes(value); + this.method_1("Security Request - Key to Send:" + GForm_Main.smethod_1(bytes)); + + arraySend1 = new byte[] + { + 39, //0x27 + 66 //0x42 + }; + arraySend1[1] = (byte)(SeedSendByte + 1); + byte[] array8 = new byte[arraySend1.Length + 5]; + if (TwoBytesMode) array8 = new byte[arraySend1.Length + 2]; + for (int i = 0; i < arraySend1.Length; i++) array8[i] = arraySend1[i]; + array8[2] = bytes[0]; //SecurityKey Byte1 + array8[3] = bytes[1]; //SecurityKey Byte2 + if (!TwoBytesMode) + { + array8[2] = bytes[2]; //SecurityKey Byte3 + array8[3] = bytes[3]; //SecurityKey Byte4 + array8[4] = b; //Algorithm Byte + } + byte[] byte_2 = new byte[] { - this.method_1("Recv:" + GForm_Main.smethod_1(Received)); - ECU_Unlocked = false; - this.darkButton_DownloadROM.Enabled = false; - this.darkButton_FlashRom.Enabled = false; - this.darkButton_FlashFW.Enabled = false; - MessageBox.Show("Failed to Unlock ECU, Check Log"); + 103, //0x67 + 66 //0x42 + }; + byte_2[1] = (byte)(SeedSendByte + 1); + + Received = SendJ2534Message(channel, array8, 3); + if (BadResponceReceived) return; + + if (Received != null) + { + int num = GForm_Main.smethod_2(Received, byte_2, 0); //looking for 0x67, 0x42 + if (num > 0) + { + this.method_1("Security Authorized: ECU Unlocked"); + ECU_Unlocked = true; + } + else + { + this.method_1("Recv:" + GForm_Main.smethod_1(Received)); + ECU_Unlocked = false; + } } } + else + { + this.method_1("Result NOT OK!!"); + } } - else - { - this.method_1("Result NOT OK!!"); - } - //} - //} - //} + } + } + catch (Exception ex) + { + DarkMessageBox.Show(ex.Message); + } + } } - public byte[] SendJ2534Message(Channel channel, byte[] MessageBytes) + public byte[] SendJ2534Message(Channel channel, byte[] MessageBytes, int receivelenght) { + BadResponceReceived = false; + byte[] arrayCommand = new byte[] { 24, //0x18 @@ -546,6 +524,8 @@ public byte[] SendJ2534Message(Channel channel, byte[] MessageBytes) 241 //0xF1 }; + SetCommandText(MessageBytes); + //Add the rest of the messages bytes to the final array byte[] arrayCommandFinal = new byte[arrayCommand.Length + MessageBytes.Length]; int MessageIndex = 0; @@ -561,12 +541,12 @@ public byte[] SendJ2534Message(Channel channel, byte[] MessageBytes) } //Send message - SAE.J2534.Message messageCommands = new SAE.J2534.Message(arrayCommand, TxFlag.CAN_29BIT_ID | TxFlag.ISO15765_FRAME_PAD); + SAE.J2534.Message messageCommands = new SAE.J2534.Message(arrayCommandFinal, TxFlag.CAN_29BIT_ID | TxFlag.ISO15765_FRAME_PAD); channel.SendMessage(messageCommands); this.method_1("Send:" + GForm_Main.smethod_1(messageCommands.Data)); //Receive message - GetMessageResults messagesReceived = channel.GetMessages(3, 1000); + GetMessageResults messagesReceived = channel.GetMessages(receivelenght, 1000); if (messagesReceived.Result.IsOK()) { //this.method_1("Programming Mode Set!"); @@ -585,8 +565,9 @@ public byte[] SendJ2534Message(Channel channel, byte[] MessageBytes) string str2 = mode.ToString(); Class_ODB.NegativeResponse negativeResponse = (Class_ODB.NegativeResponse)this.byte_6[1]; this.method_1("BAD Response: " + str2 + "|" + negativeResponse.ToString()); + BadResponceReceived = true; } - if (IndexReceived >= 3) + if (IndexReceived >= receivelenght) { this.method_1("Recv:" + GForm_Main.smethod_1(message3.Data)); return message3.Data; //after 3messages received, return the last messages bytes @@ -597,55 +578,22 @@ public byte[] SendJ2534Message(Channel channel, byte[] MessageBytes) else { this.method_1("Result NOT OK!!"); + BadResponceReceived = true; } return null; } public void method_ReadROM(object sender, DoWorkEventArgs e) { - API api = APIFactory.GetAPI(GForm_Main.string_0); - //using (API api = APIFactory.GetAPI(GForm_Main.string_0)) - //{ + using (API api = APIFactory.GetAPI(GForm_Main.string_0)) + { try { - Device device = api.GetDevice(""); - Channel channel = device.GetChannel(Protocol.ISO15765, Baud.CAN, ConnectFlag.CAN_29BIT_ID, false); - //using (Device device = api.GetDevice("")) - //{ - // using (Channel channel = device.GetChannel(Protocol.ISO15765, Baud.CAN, ConnectFlag.CAN_29BIT_ID, false)) - // { - channel = LoadJ2534Channel(channel); - /*MessageFilter messageFilter = new MessageFilter(); - messageFilter.FilterType = Filter.FLOW_CONTROL_FILTER; - messageFilter.Mask = new byte[] - { - byte.MaxValue, - byte.MaxValue, - byte.MaxValue, - byte.MaxValue - }; - messageFilter.Pattern = new byte[] - { - 24, //0x18 - 218, //0xDA - 241, //0xF1 - GForm_Main.byte_3 //0x00 - }; - messageFilter.FlowControl = new byte[] - { - 24, //0x18 - 218, //0xDA - GForm_Main.byte_3, //0x00 -> 0x10|0x11 - 241 //0xF1 - }; - MessageFilter filter = messageFilter; - channel.StartMsgFilter(filter); - SConfig[] config = new SConfig[] - { - new SConfig(Parameter.LOOP_BACK, 1), - new SConfig(Parameter.DATA_RATE, 500000) - }; - channel.SetConfig(config);*/ + using (Device device = api.GetDevice("")) + { + using (Channel channel = device.GetChannel(Protocol.ISO15765, Baud.CAN, ConnectFlag.CAN_29BIT_ID, false)) + { + LoadJ2534Channel(channel); device.SetProgrammingVoltage(Pin.PIN_12, 5000); @@ -663,19 +611,20 @@ public void method_ReadROM(object sender, DoWorkEventArgs e) this.backgroundWorker_1.ReportProgress(0, "Successfully read " + this.byte_7.Length + "bytes of flash memory in " + timeSpan.Minutes + ":" + timeSpan.Seconds); device.SetProgrammingVoltage(Pin.PIN_12, -1); } - //} - //} + } + } } catch (Exception ex) { - DarkMessageBox.Show(this, ex.Message); + DarkMessageBox.Show(ex.Message); } - //} + } } public static int smethod_0(byte[] byte_12, byte[] byte_13) { + if (byte_12 == null) return -1; if (byte_13.Length > byte_12.Length) { return -1; @@ -837,7 +786,9 @@ public void method_12(uint uint_0, uint uint_1, out byte[] byte_12, Channel chan 99 }; - byte[] Received = SendJ2534Message(channel_0, arraySend1); + byte[] Received = SendJ2534Message(channel_0, arraySend1, 3); + if (BadResponceReceived) return; + if (Received != null) { //if (messages.Result != ResultCode.DEVICE_NOT_CONNECTED) @@ -1141,7 +1092,7 @@ private void darkButton3_Click(object sender, EventArgs e) WritingBinaryMode = false; //Decrypt firmware file and get needed variable (Decryption byte) - Class_RWD.LoadRWD(openFileDialog1.FileName, false, false); + Class_RWD.LoadRWD(dialog.FileName, false, false); //############################### //Get Checksum and Fix it @@ -1207,54 +1158,19 @@ private Channel LoadJ2534Channel(Channel channel) return channel; } - //private unsafe void backgroundWorker_0_DoWork_1(object sender, DoWorkEventArgs e) private void backgroundWorker_0_DoWork_1(object sender, DoWorkEventArgs e) { - API api = APIFactory.GetAPI(GForm_Main.string_0); - //using (API api = APIFactory.GetAPI(GForm_Main.string_0)) - //{ - try + using (API api = APIFactory.GetAPI(GForm_Main.string_0)) { - Device device = api.GetDevice(""); - Channel channel = device.GetChannel(Protocol.ISO15765, Baud.CAN, ConnectFlag.CAN_29BIT_ID, false); - //using (Device device = api.GetDevice("")) - //{ - // using (Channel channel = device.GetChannel(Protocol.ISO15765, Baud.CAN, ConnectFlag.CAN_29BIT_ID, false)) - // { - channel = LoadJ2534Channel(channel); - /*MessageFilter messageFilter = new MessageFilter(); - messageFilter.FilterType = Filter.FLOW_CONTROL_FILTER; - messageFilter.Mask = new byte[] - { - byte.MaxValue, - byte.MaxValue, - byte.MaxValue, - byte.MaxValue - }; - messageFilter.Pattern = new byte[] - { - 24, //0x18 - 218, //0xDA - 241, //0xF1 - GForm_Main.byte_3 //0x00 - }; - messageFilter.FlowControl = new byte[] - { - 24, //0x18 - 218, //0xDA - GForm_Main.byte_3, //0x00 -> 0x10|0x11 - 241 //0xF1 - }; - MessageFilter filter = messageFilter; - channel.StartMsgFilter(filter); - SConfig[] config = new SConfig[] + try + { + using (Device device = api.GetDevice("")) + { + using (Channel channel = device.GetChannel(Protocol.ISO15765, Baud.CAN, ConnectFlag.CAN_29BIT_ID, false)) { - new SConfig(Parameter.LOOP_BACK, 1), - new SConfig(Parameter.DATA_RATE, 500000) - }; - channel.SetConfig(config);*/ + LoadJ2534Channel(channel); - if (!ECU_Unlocked) + if (!ECU_Unlocked) { MessageBox.Show("ECU is NOT Unlocked!"); } @@ -1273,7 +1189,9 @@ private void backgroundWorker_0_DoWork_1(object sender, DoWorkEventArgs e) 2 //0x02 }; - byte[] Received = SendJ2534Message(channel, arraySend1); + byte[] Received = SendJ2534Message(channel, arraySend1, 3); + if (BadResponceReceived) return; + if (Received != null) { this.method_1("Programming Mode Set!"); @@ -1285,11 +1203,13 @@ private void backgroundWorker_0_DoWork_1(object sender, DoWorkEventArgs e) { 0x31, //0x31 0x01, //0x01 - 0xFF, //0xFF - 0x00 //0x00 + 0x00, //0xFF ################################### + 0xFF //0x00 ################################### }; - Received = SendJ2534Message(channel, arraySend1); + Received = SendJ2534Message(channel, arraySend1, 3); + if (BadResponceReceived) return; + if (Received != null) { this.method_1("Memory Erased!"); @@ -1298,29 +1218,32 @@ private void backgroundWorker_0_DoWork_1(object sender, DoWorkEventArgs e) //Set WRITE_DATA_BY_IDENTIFIER arraySend1 = new byte[] { - 0x2E, //0x22 -> Write Data by ID (F101) - 0xF1, //0xF1 - 0x01, //0x01 + 0x2E, //0x2E -> Write Data by ID (F101) + 0x01, //0xF1 ################################### + 0xF1, //0x01 ################################### Class_RWD._keys[0], //Key1 Class_RWD._keys[1], //Key2 Class_RWD._keys[2] //Key3 }; - Received = SendJ2534Message(channel, arraySend1); + Received = SendJ2534Message(channel, arraySend1, 3); + if (BadResponceReceived) return; + if (Received != null) { this.method_1("WRITE_DATA_BY_IDENTIFIER Set!"); } //################### //Request Download - byte Addrr = 0x04; + byte memory_address_bytes = 0x04; + byte memory_size_bytes = 0x04; uint memory_address = Class_RWD.start; uint memory_size = Class_RWD.size; arraySend1 = new byte[] { 0x34, //0x34 - 0x00, //0x00 - Addrr, //0x04 + 0x00, //0x00 data_format=0x00 + memory_address_bytes, //0x04 0x00, //0x00 -> Set later 0x00, //0x00 -> Set later 0x00, //0x00 -> Set later @@ -1330,30 +1253,45 @@ private void backgroundWorker_0_DoWork_1(object sender, DoWorkEventArgs e) 0x00, //0x00 -> Set later 0x00 //0x00 -> Set later }; - arraySend1[2] = (byte) ((Addrr << 4) | Addrr); - if (memory_address >= Math.Pow(2, Addrr * 8)) throw new Exception(string.Format("invalid memory_address: 0x{0}", memory_address.ToString("X4"))); - for (int i = 0; i < Addrr; i++) + arraySend1[2] = (byte) ((memory_size_bytes << 4) | memory_address_bytes); + if (memory_address >= Math.Pow(2, memory_address_bytes * 8)) throw new Exception(string.Format("invalid memory_address: 0x{0}", memory_address.ToString("X4"))); + for (int i = 0; i < memory_address_bytes; i++) { - uint b = (memory_address >> ((Addrr - i - 1) * 8)) & 0xFF; + uint b = (memory_address >> ((memory_address_bytes - i - 1) * 8)) & 0xFF; arraySend1[3 + i] = (byte) b; } - if (memory_size >= Math.Pow(2, Addrr * 8)) throw new Exception(string.Format("invalid memory_size: 0x{0}", memory_size.ToString("X4"))); - for (int i = 0; i < Addrr; i++) + if (memory_size >= Math.Pow(2, memory_size_bytes * 8)) throw new Exception(string.Format("invalid memory_size: 0x{0}", memory_size.ToString("X4"))); + for (int i = 0; i < memory_size_bytes; i++) { - uint b = (memory_size >> ((Addrr - i - 1) * 8)) & 0xFF; - arraySend1[3 + Addrr + i] = (byte)b; + uint b = (memory_size >> ((memory_size_bytes - i - 1) * 8)) & 0xFF; + arraySend1[3 + memory_size_bytes + i] = (byte)b; } - Received = SendJ2534Message(channel, arraySend1); + Received = SendJ2534Message(channel, arraySend1, 3); + if (BadResponceReceived) return; + if (Received != null) { this.method_1("Request download started"); stopwatch.Start(); - var block_size = (Received[Received.Length - 2] + Received[Received.Length - 1]); //Get the two last bytes + //if (max_num_bytes_len >= 1 && max_num_bytes_len <= 4) + //{ + var max_num_bytes = 0; + for (int i = 0; i < 4; i++) + { + max_num_bytes = (max_num_bytes << 8) | Received[Received.Length - 5 + i]; + } + //} + + // account for service id and block sequence count (one byte each) + //var block_size = (Received[Received.Length - 2] + Received[Received.Length - 1]); //Get the two last bytes + var block_size = max_num_bytes; var chunk_size = block_size - 2; var cnt = 0; + + //Perform Write firmware to ECU for (int i = 0; i < Class_RWD._firmware_encrypted.Length; i += chunk_size) { cnt += 1; @@ -1380,8 +1318,7 @@ private void backgroundWorker_0_DoWork_1(object sender, DoWorkEventArgs e) MessageIndex++; } - Received = SendJ2534Message(channel, arrayCommandFinal); - //int Percent = (i / Class_RWD._firmware_encrypted.Length * 100); + Received = SendJ2534Message(channel, arrayCommandFinal, 3); int Percent = ((i * 100) / Class_RWD._firmware_encrypted.Length); this.method_5(Percent); /*if (Received != null) @@ -1410,14 +1347,14 @@ private void backgroundWorker_0_DoWork_1(object sender, DoWorkEventArgs e) this.backgroundWorker_0.ReportProgress(0, "Successfully write " + this.byte_7.Length + "bytes of flash memory in " + timeSpan.Minutes + ":" + timeSpan.Seconds); device.SetProgrammingVoltage(Pin.PIN_12, -1); //Set 0V on Pin12 } - //} - //} + } + } } catch (Exception ex) { - DarkMessageBox.Show(this, ex.Message); + DarkMessageBox.Show(ex.Message); } - //} + } } public void WriteROMtoECU(Channel channel_0, byte[] byte_5, BackgroundWorker backgroundWorker_X = null) @@ -1432,7 +1369,7 @@ public void WriteROMtoECU(Channel channel_0, byte[] byte_5, BackgroundWorker bac int num = 256; for (int i = 0; i < 1015808; i += num) { - this.method_14(channel_0, byte_5, i, b, num, -1); + this.method_14_Write(channel_0, byte_5, i, b, num, -1); if (b == 255) { b = 0; @@ -1457,7 +1394,9 @@ public void method_13_Close(Channel channel_0) }; byte[] buffer2 = new byte[] { GForm_Main.byte_3, 0x77 }; - byte[] Received = SendJ2534Message(channel_0, arraySend1); + byte[] Received = SendJ2534Message(channel_0, arraySend1, 3); + if (BadResponceReceived) return; + if (Received != null) { int num3 = GForm_Main.smethod_2(Received, buffer2, 0); @@ -1473,7 +1412,9 @@ public void method_13_Close(Channel channel_0) 0xff, //0xff 1 //0x01 }; - Received = SendJ2534Message(channel_0, arraySend1); + Received = SendJ2534Message(channel_0, arraySend1, 3); + if (BadResponceReceived) return; + if (Received != null) { this.method_1("Routine control check dependencies"); @@ -1481,7 +1422,7 @@ public void method_13_Close(Channel channel_0) } } - public void method_14(Channel channel_0, byte[] byte_5X, int int_23, byte byte_6X, int int_24, int int_25 = -1) + public void method_14_Write(Channel channel_0, byte[] byte_5X, int int_23, byte byte_6X, int int_24, int int_25 = -1) { if (int_25 == -1) { @@ -1610,6 +1551,9 @@ private void InitializeComponent() this.DarkgroupBox1 = new DarkUI.Controls.DarkGroupBox(); this.darkButton6 = new DarkUI.Controls.DarkButton(); this.darkButton4 = new DarkUI.Controls.DarkButton(); + this.darkTextBoxJ2534Command = new DarkUI.Controls.DarkTextBox(); + this.darkLabel1 = new DarkUI.Controls.DarkLabel(); + this.darkButtonJ2534Command = new DarkUI.Controls.DarkButton(); this.darkGroupBox_0.SuspendLayout(); this.DarkgroupBox1.SuspendLayout(); this.SuspendLayout(); @@ -1619,7 +1563,7 @@ private void InitializeComponent() this.darkTextBox_0.Location = new System.Drawing.Point(218, 63); this.darkTextBox_0.Multiline = true; this.darkTextBox_0.Name = "darkTextBox_0"; - this.darkTextBox_0.Size = new System.Drawing.Size(399, 443); + this.darkTextBox_0.Size = new System.Drawing.Size(399, 408); this.darkTextBox_0.TabIndex = 55; this.darkTextBox_0.Text = "Honda CANBUS Tools"; // @@ -1956,11 +1900,42 @@ private void InitializeComponent() this.darkButton4.Text = "Fix Checksums"; this.darkButton4.Click += new System.EventHandler(this.darkButton4_Click); // + // darkTextBoxJ2534Command + // + this.darkTextBoxJ2534Command.Location = new System.Drawing.Point(313, 477); + this.darkTextBoxJ2534Command.Name = "darkTextBoxJ2534Command"; + this.darkTextBoxJ2534Command.Size = new System.Drawing.Size(230, 20); + this.darkTextBoxJ2534Command.TabIndex = 72; + // + // darkLabel1 + // + this.darkLabel1.AutoSize = true; + this.darkLabel1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); + this.darkLabel1.Location = new System.Drawing.Point(218, 480); + this.darkLabel1.Name = "darkLabel1"; + this.darkLabel1.Size = new System.Drawing.Size(89, 13); + this.darkLabel1.TabIndex = 71; + this.darkLabel1.Text = "J2534 Command:"; + // + // darkButtonJ2534Command + // + this.darkButtonJ2534Command.Checked = false; + this.darkButtonJ2534Command.Enabled = false; + this.darkButtonJ2534Command.Location = new System.Drawing.Point(549, 475); + this.darkButtonJ2534Command.Name = "darkButtonJ2534Command"; + this.darkButtonJ2534Command.Size = new System.Drawing.Size(53, 23); + this.darkButtonJ2534Command.TabIndex = 70; + this.darkButtonJ2534Command.Text = "Send"; + this.darkButtonJ2534Command.Click += new System.EventHandler(this.darkButtonJ2534Command_Click); + // // GForm_Main // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(629, 571); + this.Controls.Add(this.darkButtonJ2534Command); + this.Controls.Add(this.darkTextBoxJ2534Command); + this.Controls.Add(this.darkLabel1); this.Controls.Add(this.DarkgroupBox1); this.Controls.Add(this.darkLabel_8); this.Controls.Add(this.darkLabel_7); @@ -2353,10 +2328,33 @@ private void darkButton4_Click(object sender, EventArgs e) else { this.method_1("This file is not compatible!"); + if ((FilesBytes.Length - 1) == 0xF7FFF) this.method_1("Try changing the file extention filter in the 'OpenFileDialog' box"); } } if (openFileDialog1.FilterIndex == 2) { + /*byte[] FilesBytes = File.ReadAllBytes(openFileDialog1.FileName); + + int BtSumInt = this.Editortable_0.CheckForBootLoaderSum(this.Editortable_0.ExtractECUNameFromThisFile(FilesBytes)); + if (BtSumInt == -1) + { + DarkMessageBox.Show(this, "Since this decompressed firmware .bin file is missing the bootloader section\nSelect the firmware .rwd file from which is as been decompressed from", "MISSING BOOTLOADER SECTION FOR CHECKSUMS VERIFICATIONS", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + + //Open RWD firmware + openFileDialog1.Filter = "Honda Compressed RWD Firmware|*.gz;*.rwd"; + openFileDialog1.DefaultExt = "*.gz"; + DialogResult result = openFileDialog1.ShowDialog(); + if (result == DialogResult.OK) + { + Class_RWD.LoadRWD(openFileDialog1.FileName, true, false); + } + } + else + { + Class_RWD.BootloaderSum = (byte)BtSumInt; + }*/ + + GForm_FWChkSum gform = new GForm_FWChkSum(); gform.FileBIN = openFileDialog1.FileName; if (gform.ShowDialog() == DialogResult.OK) @@ -2380,6 +2378,7 @@ private void darkButton4_Click(object sender, EventArgs e) else { this.method_1("This file is not compatible!"); + if ((FilesBytes.Length - 1) == 0xFFFFF) this.method_1("Try changing the file extention filter in the 'OpenFileDialog' box"); } } } @@ -2403,6 +2402,7 @@ private void darkButton6_Click(object sender, EventArgs e) try { this.Editortable_0.Show(); + this.Editortable_0.Loadingg(); } catch (Exception ex) { @@ -2411,6 +2411,7 @@ private void darkButton6_Click(object sender, EventArgs e) this.Editortable_0 = null; this.Editortable_0 = new Editortable(ref GForm_Main_0); this.Editortable_0.Show(); + this.Editortable_0.Loadingg(); } catch { @@ -2418,4 +2419,50 @@ private void darkButton6_Click(object sender, EventArgs e) } } } + + private byte[] GetBytesArrayFromCommandText() + { + string CMDText = darkTextBoxJ2534Command.Text; + byte[] ReturnArray = new byte[0]; + + if (CMDText != "") + { + if (CMDText.Contains(",")) + { + string[] SplittedBytes = CMDText.Split(','); + ReturnArray = new byte[SplittedBytes.Length]; + + for (int i = 0; i < SplittedBytes.Length; i++) + { + + ReturnArray[i] = (byte) int.Parse(SplittedBytes[i], System.Globalization.NumberStyles.HexNumber); + } + } + } + + return ReturnArray; + } + + private void darkButtonJ2534Command_Click(object sender, EventArgs e) + { + using (API api = APIFactory.GetAPI(GForm_Main.string_0)) + { + try + { + using (Device device = api.GetDevice("")) + { + using (Channel channel = device.GetChannel(Protocol.ISO15765, Baud.CAN, ConnectFlag.CAN_29BIT_ID, false)) + { + LoadJ2534Channel(channel); + + SendJ2534Message(channel, GetBytesArrayFromCommandText(), 3); + } + } + } + catch (Exception ex) + { + DarkMessageBox.Show(ex.Message); + } + } + } } diff --git a/frmOBD2Scan.cs b/frmOBD2Scan.cs index fe684ca..a651e4d 100644 --- a/frmOBD2Scan.cs +++ b/frmOBD2Scan.cs @@ -3398,231 +3398,203 @@ private void method_3() string text = this.listViewLive.Items[num].SubItems[0].Text; if (text != null) { - uint num2 = ClassDecryptString.DecryptThisString(text); - if (num2 <= 0x1ded6c01) + if (text == "06") { - if (num2 <= 0x1bed68db) + try { - if (num2 != 0x17eb23f8) + this.listViewLive.Items[num].SubItems[2].Text = this.string_17; + if ((this.listViewLive.Items[num].SubItems[3].Text == "000") || (this.listViewLive.Items[num].SubItems[3].Text == "")) { - if ((num2 == 0x1bed68db) && (text == "06")) - { - try - { - this.listViewLive.Items[num].SubItems[2].Text = this.string_17; - if ((this.listViewLive.Items[num].SubItems[3].Text == "000") || (this.listViewLive.Items[num].SubItems[3].Text == "")) - { - this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) <= int.Parse(this.listViewLive.Items[num].SubItems[3].Text)) - { - this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) >= int.Parse(this.listViewLive.Items[num].SubItems[4].Text)) - { - this.listViewLive.Items[num].SubItems[4].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - } - catch - { - } - } + this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; + } + if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) <= int.Parse(this.listViewLive.Items[num].SubItems[3].Text)) + { + this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; } - else if (text == "14") + if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) >= int.Parse(this.listViewLive.Items[num].SubItems[4].Text)) { - try - { - this.listViewLive.Items[num].SubItems[2].Text = this.string_12; - if ((this.listViewLive.Items[num].SubItems[3].Text == "000") || (this.listViewLive.Items[num].SubItems[3].Text == "")) - { - this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) <= int.Parse(this.listViewLive.Items[num].SubItems[3].Text)) - { - this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) >= int.Parse(this.listViewLive.Items[num].SubItems[4].Text)) - { - this.listViewLive.Items[num].SubItems[4].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - } - catch - { - } + this.listViewLive.Items[num].SubItems[4].Text = this.listViewLive.Items[num].SubItems[2].Text; } } - else if (num2 == 0x1ceb2bd7) + catch + { + } + } + else if (text == "14") + { + try { - if (text == "11") + this.listViewLive.Items[num].SubItems[2].Text = this.string_12; + if ((this.listViewLive.Items[num].SubItems[3].Text == "000") || (this.listViewLive.Items[num].SubItems[3].Text == "")) { - try - { - this.listViewLive.Items[num].SubItems[2].Text = this.string_9; - if ((this.listViewLive.Items[num].SubItems[3].Text == "000") || (this.listViewLive.Items[num].SubItems[3].Text == "")) - { - this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) <= int.Parse(this.listViewLive.Items[num].SubItems[3].Text)) - { - this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) >= int.Parse(this.listViewLive.Items[num].SubItems[4].Text)) - { - this.listViewLive.Items[num].SubItems[4].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - } - catch - { - } + this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; + } + if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) <= int.Parse(this.listViewLive.Items[num].SubItems[3].Text)) + { + this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; + } + if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) >= int.Parse(this.listViewLive.Items[num].SubItems[4].Text)) + { + this.listViewLive.Items[num].SubItems[4].Text = this.listViewLive.Items[num].SubItems[2].Text; } } - else if (num2 != 0x1ced6a6e) + catch { - if ((num2 == 0x1ded6c01) && (text == "04")) + } + } + else if (text == "11") + { + try + { + this.listViewLive.Items[num].SubItems[2].Text = this.string_9; + if ((this.listViewLive.Items[num].SubItems[3].Text == "000") || (this.listViewLive.Items[num].SubItems[3].Text == "")) { - try - { - this.listViewLive.Items[num].SubItems[2].Text = this.string_16; - if ((this.listViewLive.Items[num].SubItems[3].Text == "000") || (this.listViewLive.Items[num].SubItems[3].Text == "")) - { - this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) <= int.Parse(this.listViewLive.Items[num].SubItems[3].Text)) - { - this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) >= int.Parse(this.listViewLive.Items[num].SubItems[4].Text)) - { - this.listViewLive.Items[num].SubItems[4].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - } - catch - { - } + this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; + } + if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) <= int.Parse(this.listViewLive.Items[num].SubItems[3].Text)) + { + this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; + } + if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) >= int.Parse(this.listViewLive.Items[num].SubItems[4].Text)) + { + this.listViewLive.Items[num].SubItems[4].Text = this.listViewLive.Items[num].SubItems[2].Text; } } - else if (text == "05") + catch { - try + } + } + else if (text == "04") + { + try + { + this.listViewLive.Items[num].SubItems[2].Text = this.string_16; + if ((this.listViewLive.Items[num].SubItems[3].Text == "000") || (this.listViewLive.Items[num].SubItems[3].Text == "")) { - this.listViewLive.Items[num].SubItems[2].Text = this.string_14; - if ((this.listViewLive.Items[num].SubItems[3].Text == "000") || (this.listViewLive.Items[num].SubItems[3].Text == "")) - { - this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) <= int.Parse(this.listViewLive.Items[num].SubItems[3].Text)) - { - this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) >= int.Parse(this.listViewLive.Items[num].SubItems[4].Text)) - { - this.listViewLive.Items[num].SubItems[4].Text = this.listViewLive.Items[num].SubItems[2].Text; - } + this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; } - catch + if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) <= int.Parse(this.listViewLive.Items[num].SubItems[3].Text)) { + this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; + } + if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) >= int.Parse(this.listViewLive.Items[num].SubItems[4].Text)) + { + this.listViewLive.Items[num].SubItems[4].Text = this.listViewLive.Items[num].SubItems[2].Text; } } + catch + { + } } - else if (num2 <= 0x6cede85e) + else if (text == "05") { - if (num2 != 0x6bede6cb) + try { - if ((num2 == 0x6cede85e) && (text == "0E")) + this.listViewLive.Items[num].SubItems[2].Text = this.string_14; + if ((this.listViewLive.Items[num].SubItems[3].Text == "000") || (this.listViewLive.Items[num].SubItems[3].Text == "")) { - try - { - this.listViewLive.Items[num].SubItems[2].Text = this.string_15; - if ((this.listViewLive.Items[num].SubItems[3].Text == "000") || (this.listViewLive.Items[num].SubItems[3].Text == "")) - { - this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) <= int.Parse(this.listViewLive.Items[num].SubItems[3].Text)) - { - this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) >= int.Parse(this.listViewLive.Items[num].SubItems[4].Text)) - { - this.listViewLive.Items[num].SubItems[4].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - } - catch - { - } + this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; + } + if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) <= int.Parse(this.listViewLive.Items[num].SubItems[3].Text)) + { + this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; + } + if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) >= int.Parse(this.listViewLive.Items[num].SubItems[4].Text)) + { + this.listViewLive.Items[num].SubItems[4].Text = this.listViewLive.Items[num].SubItems[2].Text; } } - else if (text == "0F") + catch { - try + } + } + else if (text == "0E") + { + try + { + this.listViewLive.Items[num].SubItems[2].Text = this.string_15; + if ((this.listViewLive.Items[num].SubItems[3].Text == "000") || (this.listViewLive.Items[num].SubItems[3].Text == "")) { - this.listViewLive.Items[num].SubItems[2].Text = this.string_13; - if ((this.listViewLive.Items[num].SubItems[3].Text == "000") || (this.listViewLive.Items[num].SubItems[3].Text == "")) - { - this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) <= int.Parse(this.listViewLive.Items[num].SubItems[3].Text)) - { - this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) >= int.Parse(this.listViewLive.Items[num].SubItems[4].Text)) - { - this.listViewLive.Items[num].SubItems[4].Text = this.listViewLive.Items[num].SubItems[2].Text; - } + this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; } - catch + if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) <= int.Parse(this.listViewLive.Items[num].SubItems[3].Text)) { + this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; + } + if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) >= int.Parse(this.listViewLive.Items[num].SubItems[4].Text)) + { + this.listViewLive.Items[num].SubItems[4].Text = this.listViewLive.Items[num].SubItems[2].Text; } } + catch + { + } } - else if (num2 == 0x6dede9f1) + else if (text == "0F") { - if (text == "0D") + try { - try + this.listViewLive.Items[num].SubItems[2].Text = this.string_13; + if ((this.listViewLive.Items[num].SubItems[3].Text == "000") || (this.listViewLive.Items[num].SubItems[3].Text == "")) { - this.listViewLive.Items[num].SubItems[2].Text = this.string_10; - if ((this.listViewLive.Items[num].SubItems[3].Text == "000") || (this.listViewLive.Items[num].SubItems[3].Text == "")) - { - this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) <= int.Parse(this.listViewLive.Items[num].SubItems[3].Text)) - { - this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) >= int.Parse(this.listViewLive.Items[num].SubItems[4].Text)) - { - this.listViewLive.Items[num].SubItems[4].Text = this.listViewLive.Items[num].SubItems[2].Text; - } + this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; } - catch + if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) <= int.Parse(this.listViewLive.Items[num].SubItems[3].Text)) + { + this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; + } + if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) >= int.Parse(this.listViewLive.Items[num].SubItems[4].Text)) { + this.listViewLive.Items[num].SubItems[4].Text = this.listViewLive.Items[num].SubItems[2].Text; } } + catch + { + } } - else if (num2 != 0x6eedeb84) + else if (text == "0D") { - if ((num2 == 0x6feded17) && (text == "0B")) + try { - try + this.listViewLive.Items[num].SubItems[2].Text = this.string_10; + if ((this.listViewLive.Items[num].SubItems[3].Text == "000") || (this.listViewLive.Items[num].SubItems[3].Text == "")) { - this.listViewLive.Items[num].SubItems[2].Text = this.string_7; - if ((this.listViewLive.Items[num].SubItems[3].Text == "000") || (this.listViewLive.Items[num].SubItems[3].Text == "")) - { - this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) <= int.Parse(this.listViewLive.Items[num].SubItems[3].Text)) - { - this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; - } - if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) >= int.Parse(this.listViewLive.Items[num].SubItems[4].Text)) - { - this.listViewLive.Items[num].SubItems[4].Text = this.listViewLive.Items[num].SubItems[2].Text; - } + this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; } - catch + if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) <= int.Parse(this.listViewLive.Items[num].SubItems[3].Text)) + { + this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; + } + if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) >= int.Parse(this.listViewLive.Items[num].SubItems[4].Text)) { + this.listViewLive.Items[num].SubItems[4].Text = this.listViewLive.Items[num].SubItems[2].Text; } } + catch + { + } + } + else if (text == "0B") + { + try + { + this.listViewLive.Items[num].SubItems[2].Text = this.string_7; + if ((this.listViewLive.Items[num].SubItems[3].Text == "000") || (this.listViewLive.Items[num].SubItems[3].Text == "")) + { + this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; + } + if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) <= int.Parse(this.listViewLive.Items[num].SubItems[3].Text)) + { + this.listViewLive.Items[num].SubItems[3].Text = this.listViewLive.Items[num].SubItems[2].Text; + } + if (int.Parse(this.listViewLive.Items[num].SubItems[2].Text) >= int.Parse(this.listViewLive.Items[num].SubItems[4].Text)) + { + this.listViewLive.Items[num].SubItems[4].Text = this.listViewLive.Items[num].SubItems[2].Text; + } + } + catch + { + } } else if (text == "0C") { @@ -4689,99 +4661,59 @@ private double method_42(string string_21) } else { - uint num2 = ClassDecryptString.DecryptThisString(string_21); - if (num2 > 0x44a7f051) + if (string_21 == "Load%") { - if (num2 > 0xce8f3e48) - { - if (num2 > 0xeef6e76e) - { - if (num2 == 0xf87c4b44) - { - if (string_21 == "Load%") - { - return (double.TryParse(this.string_16, out result) ? result : 0.0); - } - } - else if ((num2 == 0xfd283657) && (string_21 == "ECT")) - { - return (double.TryParse(this.string_14, out result) ? result : 0.0); - } - } - else if (num2 == 0xd0b33ab6) - { - if (string_21 == "RPM") - { - return (double.TryParse(this.string_8, out result) ? result : 0.0); - } - } - else if ((num2 == 0xeef6e76e) && (string_21 == "BATTERY")) - { - return (double.TryParse(this.string_11, out result) ? result : 0.0); - } - } - else if (num2 == 0x670409f2) - { - if (string_21 == "BTDC") - { - return (double.TryParse(this.string_15, out result) ? result : 0.0); - } - } - else if (num2 == 0x840ae12e) - { - if (string_21 == "Battery") - { - return (double.TryParse(this.string_11, out result) ? result : 0.0); - } - } - else if ((num2 == 0xce8f3e48) && (string_21 == "STFT")) - { - return (double.TryParse(this.string_17, out result) ? result : 0.0); - } + return (double.TryParse(this.string_16, out result) ? result : 0.0); } - else if (num2 > 0x1ce412e4) + else if (string_21 == "ECT") { - if (num2 > 0x2f6e59dd) - { - if (num2 == 0x345d4ece) - { - if (string_21 == "TPS") - { - goto TR_000C; - } - } - else if ((num2 == 0x44a7f051) && (string_21 == "Map")) - { - goto TR_000F; - } - } - else if (num2 == 0x24599f11) - { - if (string_21 == "MAP") - { - goto TR_000F; - } - } - else if ((num2 == 0x2f6e59dd) && (string_21 == "TPlate")) - { - goto TR_000C; - } + return (double.TryParse(this.string_14, out result) ? result : 0.0); } - else if (num2 == 0xa6b8020) + else if (string_21 == "RPM") { - if (string_21 == "Speed") - { - return (double.TryParse(this.string_10, out result) ? result : 0.0); - } + return (double.TryParse(this.string_8, out result) ? result : 0.0); } - else if (num2 == 0x1ab73171) + else if (string_21 == "BATTERY") { - if (string_21 == "IAT") - { - return (double.TryParse(this.string_13, out result) ? result : 0.0); - } + return (double.TryParse(this.string_11, out result) ? result : 0.0); + } + else if (string_21 == "BTDC") + { + return (double.TryParse(this.string_15, out result) ? result : 0.0); + } + else if (string_21 == "Battery") + { + return (double.TryParse(this.string_11, out result) ? result : 0.0); + } + else if (string_21 == "STFT") + { + return (double.TryParse(this.string_17, out result) ? result : 0.0); + } + else if (string_21 == "TPS") + { + goto TR_000C; + } + else if (string_21 == "Map") + { + goto TR_000F; + } + else if (string_21 == "MAP") + { + goto TR_000F; + } + else if (string_21 == "TPlate") + { + goto TR_000C; + } + else if (string_21 == "Speed") + { + return (double.TryParse(this.string_10, out result) ? result : 0.0); + } + else if (string_21 == "IAT") + { + return (double.TryParse(this.string_13, out result) ? result : 0.0); } - else if ((num2 == 0x1ce412e4) && (string_21 == "O2")) + else if (string_21 == "O2") { return (double.TryParse(this.string_12, out result) ? result : 0.0); } diff --git a/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/obj/Debug/DesignTimeResolveAssemblyReferences.cache index c33c56f95a4b48861ca02dab1862807bde835e71..001ae2a458405590b67f9255be9d3b2bbee807d5 100644 GIT binary patch literal 6723 zcmeHM&2!sC6xZ68tX0~kg;H85V7^-#WV>mak7?+nPC_!!Q0g>2)Wxi&wWC^=JiAib z^ir;zxbSauh66JUy}$)7FvGwM%y4S|0FK<@J;`?B4`@wk2WI?c^enA*-@e`bz4v}f z6rw1~A0YUPvL^xRgY%9heCbyM^IYh-wzU1@qx2JM!lBqb^i-YGVZp(l-iUA8a z_M%nC<f0_A1__xRW7(^@yvphya9*EWvO#crDf>Pulu52GS`;Ycb>LRnNy|Kt}Jp1Yl&u} zFq8Y}X1dHP=F*LTdx%CE&1k@kl}9%t;y;>a>=EtZf@N_jor>c+!8XpcAJG%RXb;@b zy{Pt~8b`Gsl!`A-bk3+NUU$XP2|VT~j&P5X4c|_|RZlQ4W%H)gB*vLkMX<$1qUxzt z55gi<^;T`I+5o6j5yTo%l7vuwqIbIDCPa;Gwm`GJ1~BQI3`V9o%z!IbaR}Mh0#qwJ zvF*+$OSk8L|5c9?Llj|8Kr4L`ly(r50YJ=|lex+KETKmg8kyTGbFjqL?Mwil?l zpTq1OhU0zrPEitx1W~9?&}Ze-+ZTRueu#WF3`08%O}qS5R6Ned?8A{>9}rEC*@tI( zeLyfjW*?sI@nO$VXjp6EuDjSFupX?|O;58aYwC1NFZ*R6%vY8?4#nwn7qVETT#>NdU(X_$1L2jJi(rsm?xm zRi_pTh84M;0-$cRZ?{)s?|k6|n~gIMI;s`+@p@Vrkr47Z=@{5y0dI4U3&)DsK#>O@ z=C52CCgDtEdVBx7bm!_-#8s5kwCCVXi>t9gpN9wf0w|Q|{Vljj-2*!I&vqA2E4_tm zrCe6@)JI_KE*N{bP4BXaGiWb?x`YK|E}P93=CTnx$wurX+hHf!es+>=vy*HWJIU^_ z6GM9$Y|qCHJ5=)|#2#?X`!h{1bX_n&UjdcIKvK|QETE~OVh|65zKZHKRIj5thUz$| z16XiSQdnbpLIateRzAdf?ZMIgd!P7JfI{9f&z`B zA1JsA6crct|BL}lDQ&K;cSv)AHJJruM@cDqU-lnBE7}8bV{{BF6#7Q|tEhNnLml*g zDA@vQ0Pjc179!*!zAbkr+Y_*#dP7>iaGi=lC*YC3392mw(=GW4f)7(Jwvr#=<}O?q za6s2U(;O%j)4&K=Zf#V>0VG-;&@k2^B7z(ABqC)JR9j+feGgFTVC%bnY@LSgDpr>f zwno^(^iQ;D&{~WwgU-MModwmF7*^lzhSfLyusQ?XRpcupSdCy6!)hMT(59-3f?apK znnB-!MtT-hTVi;9y&GO%^~38NbXSoHkKi?eR}8NLpy6PvB3^bp+rKW&WnVO;K^Nf_ zT>{mX7-V;LgY3(GkgY&>6^Z>Yp9M(U4qNc&V8`a-A`h6Tfr9@Jzz1gy{;&bB$vE;r z9j?R|H%l8wPTl*MASuMpt@alg+(tr>`{5@S3SEtVm2oWg-3GAo4>W)UzTW_*^=<>0 z;|ChRRNij@12;18+1c`~13w#c1fzJM0SwlD1B-0~ojt%48fai;kO6|5fu}>p{scEa B;U)k8 delta 128 zcmX?XvYBmzKO>U^!{k6lPc9|~1_m~EAdxaTktvGJCABy+J#X?`#@NYy%whr{Sx!z6 z!388(IVUfW5ScumEzXJ?$mJ?C(KFC9HZV4{WMBlzgA_7MSsQRI^E?M5NC6iY8xM#^ HQpgPefKwM- diff --git a/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache index 020a89de0ed90931138abf1f99b8d7fe685b667f..870166badf6d7a0d5611607820aa108147fea391 100644 GIT binary patch delta 716 zcmaiy+iDX*9LBTS8Exrqn@tLC)*M>v*~D~Pn`$kX1BudN+bmj8Yu&n&bjTh;c0vsy zeFE?1HAD)%^~&ea7w{EC@IO-m1utBf;s1T#@0*>4oWZT-5hu#3rA9D*AxeIfnPhBGMMfifI za+7zpJ#-7IZLTD2o}HOPw?Q39^?61`cR(G2dZSgt9x1qxBcK1WXnmK(H^1r|}7t2StQZYdzspM6hUMy3Vv_=#hf6j*o}HXBNICVpk?t-vr*?|Ytd6($60(&D?uoMQ2|ktwZ$ zacx+20++fDBjqR}{-HOhQ;$R=T!K^|KBocOaoAD47y2(4@ke-#e>1YmWB$WvB%c7I q4x7%g=)81%GQ#WP=in!)Bzg*=yb;D5FuoO+<5g2vth3kV#-+cO$g(d0 delta 395 zcmYk2+e!ja6oy^m9#b1-)S1XRWOmk^^3+WPf}znxhz3TYutVuIT8R-M(kle(JtVN# z=>d9(sO8i^8}{Po`#)Hl{ZYjIx5>Oe>~gt;MH*Fn5KGt=gAl`>cn&J|gB{Qi^a{p8 z0nqJaN&#k&U7OkRakh}lr|VaIaBp@jOIV`j61iT-Pf3P2eoGy;OzgsDhT;vD?gm|3 zO%NVB7?Tl|t^61LhkVFwaTO<#9$TZb<>+j-YaL&rH?V=G(#9iMWSeB%ItISWVYWqt z|B(4Rgr0`XhVH;a|1HV*%GEI`F{AgJ)M~Tt(rD!+@e3X7EW;6qKu&U{>i+ydu zo1rQ;I>n+}@jQ=(EH(m_XpW#bs`01twbec0z3y1Z)6X@bKr7GK9@S0zO`;Ko)HH4! GxPJf=yH@7_ diff --git a/obj/Debug/Editortable.resources b/obj/Debug/Editortable.resources new file mode 100644 index 0000000000000000000000000000000000000000..a92ca8e24bc18f2d42b325271c42760600b1cf8d GIT binary patch literal 40395 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 S2L8+gf98Qd^T2=aLjMD+=M%vI literal 0 HcmV?d00001 diff --git a/obj/Debug/FlashToolTest.Properties.Resources.resources b/obj/Debug/FlashToolTest.Properties.Resources.resources index a0011feb919a580946648f0d3febc1d2c6d9c0a9..e377b779602588567e5ddfe4c4c418ffc3ffcfd9 100644 GIT binary patch literal 132056 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%0ASRQ=!_aTOWyQ9KJ8AYqS1mPe;sG~{ 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 z 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 delta 387 zcmeysx07o_D-)yaU@kendM?I0isawrH0f?Ndxf*>b=fFQ^|5D)~J4FZB7gFt{A E0FmE0kN^Mx diff --git a/obj/Debug/FlashToolTest.csprojAssemblyReference.cache b/obj/Debug/FlashToolTest.csprojAssemblyReference.cache index fcecd703f0e10f5cf9cd2040081c6055abd8b7e9..827a277f2570be63cb9d19e7c17ef3003cf45e94 100644 GIT binary patch delta 14 VcmZ3%yn=ayKO@tB?#Y3S;Q%D;1fKu^ delta 14 VcmZ3%yn=ayKO@t6rpbYf;Q%7v1V#V= diff --git a/obj/Debug/FlashToolTest.exe b/obj/Debug/FlashToolTest.exe index 3fa687c5cc1d3764adb0f60cde96848cc6512326..b226c51d9a9371d2efc1cc279f8cf95b391cd1c8 100644 GIT binary patch literal 549888 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 z zV>6=w873MVe%%aBAO92$0Oy%eGyn)D%xhC8KboAJ`tqk!U;ga11UCE!iQgN;swU8j z>l_~b&X{aqY-W-<%qA5C4U(@*8B_dc<{kcZ9k^NfXZri^Om9x#=i`Udjn{y&9}>hT zzfcnRxxo7`u&c4j$&m{~ipRf9*l}1sMzp;?i9ch&CBQTD4u|=^4)8CrHEv@naTzVS zdiM{|IW~fAjg1hT7-e>7WNa+)`UILxP9Qfq_I6@wl0-MbKO@?g7{WhFhv+&4Wa94? zGxnQ_H>CB5bg`|6hesxcC#Mr{5MumC9)RIY;_Zpyk;w@ZuxN6GEu+& ztp2x#Ub`?nHahXf(9lfO6+j-HOk4mNC~07PfDk17H=vFLhy@Q&&e#=f2@D6~k$