Example #1
0
        private void PresentDiagServices()
        {
            DataTable dt = new DataTable();

            dt.Columns.Add("Index", typeof(String));
            dt.Columns.Add("Name", typeof(String));
            dt.Columns.Add("Function Type", typeof(String));
            dt.Columns.Add("Access Level", typeof(String));
            dt.Columns.Add("Security Access Level", typeof(String));
            dt.Columns.Add("Input Parameters", typeof(String));
            dt.Columns.Add("Output Parameters", typeof(String));
            dt.Columns.Add("Command", typeof(String));

            string namePartialMatch = txtFilter.Text.ToLower();

            for (int i = 0; i < DiagServices.Length; i++)
            {
                DiagService diag = DiagServices[i];

                if (diag.Qualifier.ToLower().Contains(namePartialMatch))
                {
                    dt.Rows.Add(new string[]
                    {
                        i.ToString(),
                        diag.Qualifier,
                        diag.IsExecutable == 1 ? "User" : "System",
                        diag.ClientAccessLevel.ToString(),
                        diag.SecurityAccessLevel.ToString(),
                        diag.InputPreparations.Count.ToString(),
                        diag.OutputPreparations.Count.ToString(),
                        BitUtility.BytesToHex(diag.RequestBytes, true),
                    });
                }
            }

            dgvMain.DataSource = dt;

            // apparently resize+sort is really expensive
            if (dgvMain.Columns[dgvMain.Columns.Count - 1].AutoSizeMode != DataGridViewAutoSizeColumnMode.Fill)
            {
                dgvMain.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                dgvMain.Columns[dgvMain.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                dgvMain.Columns[0].Visible = false;
            }

            /*
             * int colIndex = 0;
             * dgvMain.Columns[colIndex++].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
             * dgvMain.Columns[colIndex++].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
             * dgvMain.Columns[colIndex++].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
             * dgvMain.Columns[colIndex++].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
             * dgvMain.Columns[colIndex++].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
             * dgvMain.Columns[colIndex++].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
             * dgvMain.Columns[colIndex++].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
             * dgvMain.Columns[colIndex++].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
             */
            // dgvMain.Sort(dgvMain.Columns[0], ListSortDirection.Ascending);
        }
Example #2
0
        private void PresentRunDiagDialog(DiagService ds)
        {
            RunDiagForm runDiagForm = new RunDiagForm(ds);

            if (runDiagForm.ShowDialog() == DialogResult.OK)
            {
                Connection.ExecUserDiagJob(runDiagForm.Result, ds);
            }
        }
Example #3
0
 private void dgvMain_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
 {
     if (dgvMain.SelectedRows.Count == 1)
     {
         int selectedDiagIndex = int.Parse(dgvMain.SelectedRows[0].Cells[0].Value.ToString());
         SelectedDiagService = DiagServices[selectedDiagIndex];
         this.DialogResult   = DialogResult.OK;
         this.Close();
     }
 }
Example #4
0
        private void TreeViewDoubleClickCheckIfVariantDiag(TreeNode node)
        {
            string validNodePrefix = $"Exec{nameof(DiagService)}:";

            if (node.Parent is null)
            {
                return;
            }
            if (node.Parent.Tag.ToString().StartsWith(validNodePrefix))
            {
                string variantName = node.Parent.Tag.ToString().Substring(validNodePrefix.Length);

                ECUVariant foundVariant = null;
                foreach (CaesarContainer container in Containers)
                {
                    foreach (ECU ecu in container.CaesarECUs)
                    {
                        foreach (ECUVariant variant in ecu.ECUVariants)
                        {
                            if (variant.Qualifier == variantName)
                            {
                                foundVariant = variant;
                            }
                        }
                    }
                }
                // variant found, exec the diag service
                if (foundVariant != null)
                {
                    DiagService ds = foundVariant.DiagServices[int.Parse(node.Tag.ToString())];

                    bool connectionSupportsUnlocking = Connection?.ConnectionProtocol?.SupportsUnlocking() ?? false;

                    // can we help to skip the modal if the ds doesn't require additional user input? common for data, stored data
                    if ((ds.DataClass_ServiceType == (int)DiagService.ServiceType.StoredData) || (ds.DataClass_ServiceType == (int)DiagService.ServiceType.Data))
                    {
                        Connection?.ExecUserDiagJob(ds.RequestBytes, ds);
                    }
                    else if (connectionSupportsUnlocking && (ds.RequestBytes.Length == 2) && (ds.RequestBytes[0] == 0x27))
                    {
                        // request seed, no need to prompt
                        Connection?.ExecUserDiagJob(ds.RequestBytes, ds);
                    }
                    else
                    {
                        PresentRunDiagDialog(ds);
                    }
                }
            }
        }
Example #5
0
        private static void ExecVCWrite(byte[] request, DiagService service, ECUConnection connection, bool writesEnabled)
        {
            bool allowVcWrite = writesEnabled; // allowWriteVariantCodingToolStripMenuItem.Checked;

            if (allowVcWrite)
            {
                connection.ExecUserDiagJob(request, service);
                Console.WriteLine("VC Write completed");
            }
            else
            {
                MessageBox.Show("This VC write action has to be manually enabled under \r\nFile >  Allow Write Variant Coding\r\nPlease make sure that you understand the risks before doing so.",
                                "Accidental Brick Protection");
            }
        }
 public void ExecUserDiagJob(byte[] request, DiagService diagService)
 {
     Console.WriteLine($"\r\n{diagService.Qualifier}");
     byte[] response = SendMessage(request);
     foreach (List <DiagPreparation> wtf in diagService.OutputPreparations)
     {
         foreach (DiagPreparation outputPreparation in wtf)
         {
             //outputPreparation.PrintDebug();
             DiagPresentation presentation = outputPreparation.ParentECU.GlobalPresentations[outputPreparation.PresPoolIndex];
             // presentation.PrintDebug();
             Console.WriteLine($"{presentation.InterpretData(response, outputPreparation)}");
         }
     }
     // check if the response was an ECU seed
     if ((ConnectionProtocol?.SupportsUnlocking() ?? false) && (response.Length >= 2) && (response[0] == 0x67))
     {
         SecurityAutoLogin.ReceiveSecurityResponse(response, diagService.ParentECU, this);
     }
 }
Example #7
0
        private void TreeViewDoubleClickCheckIfSession(TreeNode node)
        {
            if (node.Parent != null && node.Parent.Tag.ToString() == "Session")
            {
                string ecuName     = node.Parent.Parent.Text;
                string serviceName = node.Tag.ToString();

                foreach (CaesarContainer container in Containers)
                {
                    ECU ecu = container.CaesarECUs.Find(x => x.Qualifier == ecuName);
                    if (ecu != null)
                    {
                        DiagService ds = ecu.GlobalDiagServices.Find(x => x.Qualifier == serviceName);
                        if (ds != null)
                        {
                            PresentRunDiagDialog(ds);
                            break;
                        }
                    }
                }
            }
        }
 public byte[] SendDiagRequest(DiagService diag)
 {
     Console.WriteLine($"Running diagnostic request : {diag.Qualifier} ({BitUtility.BytesToHex(diag.RequestBytes, true)})");
     byte[] response = SendMessage(diag.RequestBytes);
     return(response);
 }
Example #9
0
        public VCForm(CaesarContainer container, string ecuName, string variantName, string vcDomain, ECUConnection connection)
        {
            InitializeComponent();

            ECUName      = ecuName;
            VariantName  = variantName;
            VCDomainName = vcDomain;

            SelectedECU         = container.GetECUByName(ecuName);
            ECUVariant          = container.GetECUVariantByName(variantName);
            VariantCodingDomain = ECUVariant.GetVCDomainByName(VCDomainName);

            ReadService  = ECUVariant.GetDiagServiceByName(VariantCodingDomain.ReadServiceName);
            WriteService = ECUVariant.GetDiagServiceByName(VariantCodingDomain.WriteServiceName);
            if ((ReadService is null) || (WriteService is null))
            {
                Console.WriteLine("VC Dialog: Unable to proceed - could not find referenced diagnostic services");
                this.Close();
            }

            //Console.WriteLine(ReadService.Qualifier);
            //Console.WriteLine(WriteService.Qualifier);

            VCValue             = new byte[VariantCodingDomain.DumpSize];
            UnfilteredReadValue = new byte[] { };

            foreach (Tuple <string, byte[]> row in VariantCodingDomain.DefaultData)
            {
                if (row.Item1.ToLower() == "default" && (row.Item2.Length == VariantCodingDomain.DumpSize))
                {
                    VCValue = row.Item2;
                    Console.WriteLine("Default CBF variant coding data is available");
                    break;
                }
            }

            if (connection.State >= ECUConnection.ConnectionState.ChannelConnectedPendingEcuContact)
            {
                // Console.WriteLine($"Requesting variant coding read: {ReadService.Qualifier} : ({BitUtility.BytesToHex(ReadService.RequestBytes)})");
                byte[] response = connection.SendDiagRequest(ReadService);

                DiagPreparation largestPrep = GetLargestPreparation(ReadService.OutputPreparations);
                if (largestPrep.PresPoolIndex > -1)
                {
                    // DiagPresentation pres = SelectedECU.GlobalPresentations[largestPrep.PresPoolIndex];
                    // pres.PrintDebug();
                }
                // Console.WriteLine($"Variant coding received: {BitUtility.BytesToHex(response)}");

                VCValue = response.Skip(largestPrep.BitPosition / 8).Take(largestPrep.SizeInBits / 8).ToArray();
                // store the received VC: when writing back, we might need the previous author's fingerprints
                UnfilteredReadValue = response;
            }
            else
            {
                Console.WriteLine("Please check for connectivity to the target ECU (could not read variant coding data)");
                MessageBox.Show("Variant Coding dialog will operate as a simulation using default values.", "Unable to read ECU variant coding data", MessageBoxButtons.OK);
                btnApply.Enabled = false;
            }

            // VCSanityCheck();
            IntepretVC();
            PresentVC();
        }
Example #10
0
        private void AddDiagServicesToNode(TreeNode parentNode, ECUVariant variant)
        {
            string newTag = $"Exec{nameof(DiagService)}:{variant.Qualifier}";

            TreeNode diagUnlockingOptions = new TreeNode($"Security Access", 19, 19);

            diagUnlockingOptions.Tag = newTag;

            TreeNode diagStoredData = new TreeNode($"Diagnostics: Stored Data", 24, 24);

            diagStoredData.Tag = newTag;

            TreeNode diagData = new TreeNode($"Diagnostics: Data", 24, 24);

            diagData.Tag = newTag;

            TreeNode diagFunction = new TreeNode($"Diagnostics: Function", 24, 24);

            diagFunction.Tag = newTag;

            TreeNode diagRoutine = new TreeNode($"Diagnostics: Routine", 24, 24);

            diagRoutine.Tag = newTag;

            TreeNode diagIO = new TreeNode($"Diagnostics: IO", 24, 24);

            diagIO.Tag = newTag;

            TreeNode diagDownload = new TreeNode($"Diagnostics: Download", 24, 24);

            diagDownload.Tag = newTag;


            for (int i = 0; i < variant.DiagServices.Length; i++)
            {
                DiagService currentDiagService = variant.DiagServices[i];

                TreeNode diagNode = new TreeNode(currentDiagService.Qualifier, 9, 9);
                diagNode.Tag = i.ToString();

                if ((currentDiagService.RequestBytes.Length > 1) && (currentDiagService.RequestBytes[0] == 0x27))
                {
                    diagUnlockingOptions.Nodes.Add(diagNode);
                    continue;
                }

                if (currentDiagService.DataClass_ServiceType == (int)DiagService.ServiceType.StoredData)
                {
                    diagStoredData.Nodes.Add(diagNode);
                }
                else if (currentDiagService.DataClass_ServiceType == (int)DiagService.ServiceType.DiagnosticFunction)
                {
                    diagFunction.Nodes.Add(diagNode);
                }
                else if (currentDiagService.DataClass_ServiceType == (int)DiagService.ServiceType.Data)
                {
                    diagData.Nodes.Add(diagNode);
                }
                else if (currentDiagService.DataClass_ServiceType == (int)DiagService.ServiceType.Routine)
                {
                    diagRoutine.Nodes.Add(diagNode);
                }
                else if (currentDiagService.DataClass_ServiceType == (int)DiagService.ServiceType.IoControl)
                {
                    diagIO.Nodes.Add(diagNode);
                }
                else if (currentDiagService.DataClass_ServiceType == (int)DiagService.ServiceType.Download)
                {
                    diagDownload.Nodes.Add(diagNode);
                }
            }

            parentNode.Nodes.Add(diagUnlockingOptions);
            parentNode.Nodes.Add(diagStoredData);
            parentNode.Nodes.Add(diagData);
            parentNode.Nodes.Add(diagFunction);
            parentNode.Nodes.Add(diagRoutine);
            parentNode.Nodes.Add(diagIO);
            parentNode.Nodes.Add(diagDownload);
        }
Example #11
0
        public static void treeViewSelectVariantCodingBackup(TreeNode node, ECUConnection connection, List <CaesarContainer> containers)
        {
            if (connection is null)
            {
                return;
            }

            Cursor.Current = Cursors.WaitCursor;

            string variantName = node.Parent.Text;
            string ecuName     = node.Parent.Parent.Text;
            string reportDate  = $"{DateTime.Now.ToShortDateString()} {DateTime.Now.ToLongTimeString()}";

            StringBuilder report = new StringBuilder();

            CaesarContainer container = containers.Find(x => x.GetECUVariantByName(variantName) != null);
            ECU             ecu       = container.GetECUByName(ecuName);
            ECUVariant      variant   = container.GetECUVariantByName(variantName);

            string containerChecksum = container.FileChecksum.ToString("X8");
            string dVersion          = MainForm.GetVersion();
            string cVersion          = CaesarContainer.GetCaesarVersionString();
            string connectionData    = connection is null ? "(Unavailable)" : connection.FriendlyProfileName;
            string ecuCbfVersion     = ecu.EcuXmlVersion;

            report.Append($"ECU Variant: {variant.Qualifier}\r\n");

            StringBuilder tableBuilder = new StringBuilder();

            // back up every domain since some have overlaps
            foreach (VCDomain domain in variant.VCDomains)
            {
                report.Append($"\r\nCoding Service: {domain.Qualifier}\r\n");
                // find the read service, then execute it as-is
                DiagService readService = variant.GetDiagServiceByName(domain.ReadServiceName);
                byte[]      response    = connection.SendDiagRequest(readService);

                // isolate the traditional vc string
                DiagPreparation largestPrep = VCForm.GetLargestPreparation(readService.OutputPreparations);
                byte[]          vcValue     = response.Skip(largestPrep.BitPosition / 8).Take(largestPrep.SizeInBits / 8).ToArray();

                StringBuilder tableRowBuilder = new StringBuilder();

                // explain the vc string's settings
                for (int i = 0; i < domain.VCFragments.Count; i++)
                {
                    VCFragment    currentFragment = domain.VCFragments[i];
                    VCSubfragment subfragment     = currentFragment.GetSubfragmentConfiguration(vcValue);

                    string fragmentValue         = subfragment is null ? "(?)" : subfragment.NameCTFResolved;
                    string fragmentSupplementKey = subfragment is null ? "(?)" : subfragment.SupplementKey;

                    string tableRowBlock = $@"
        <tr>
            <td>{currentFragment.Qualifier}</td>
            <td>{fragmentValue}</td>
            <td>{fragmentSupplementKey}</td>
        </tr>
";
                    tableRowBuilder.Append(tableRowBlock);
                }

                string tableBlock = $@"
    <hr>

    <h2>{domain.Qualifier}</h2>

    <table class=""coding-data"">
        <tr>
            <td class=""fifth"">Coding String (Hex)</td>
            <td class=""monospace"">{BitUtility.BytesToHex(vcValue, true)}</td>
        </tr>
        <tr>
            <td class=""fifth"">Raw Coding String (Hex)</td>
            <td class=""monospace"">{BitUtility.BytesToHex(response, true)}</td>
        </tr>
    </table>

    <table>
        <tr>
            <th>Fragment</th>
            <th>Value</th>
            <th>Supplement Key</th>
        </tr>
        {tableRowBuilder}
    </table>
";
                tableBuilder.Append(tableBlock);
            }


            string document = $@"
<!DOCTYPE html>
<html lang=""en"">
<head>
    <meta charset=""UTF-8"">
    <title>{ecuName} : Backup</title>
    <style>
        body
        {{
            padding: 10px 20% 15px 15%;
            font-family: sans-serif;
        }}
        .pull-right
        {{
            float: right;
        }}
        hr
        {{
            border-bottom: 0;
            opacity: 0.2;
        }}
        table
        {{
            width: 100%;
            margin: 20px 0;
        }}
        #eof
        {{
            text-transform: uppercase;
            font-weight: bold;
            opacity: 0.15;
            letter-spacing: 0.4em;
        }}
        .coding-data
        {{
            opacity: 0.8;
        }}
        .monospace
        {{
            font-family: monospace;
        }}
        .fifth
        {{
            width: 20%;
        }}
        th
        {{
            text-align: left;
        }}
    </style>
</head>
<body>
    <h1 class=""pull-right"">Diogenes</h1>
    <h1>{ecuName}</h1>
    <hr>
    <table>
        <tr>
            <td>CBF Checksum</td>
            <td>{containerChecksum}</td>
        </tr>
        <tr>
            <td>Date</td>
            <td>{reportDate}</td>
        </tr>
        <tr>
            <td>Client Version</td>
            <td>Diogenes: {dVersion}, Caesar: {cVersion}</td>
        </tr>
        <tr>
            <td>ECU CBF Version</td>
            <td>{ecuCbfVersion}</td>
        </tr>
        <tr>
            <td>ECU Variant</td>
            <td>{variantName}</td>
        </tr>
        <tr>
            <td>Connection Info</td>
            <td>{connectionData}</td>
        </tr>
    </table>

    {tableBuilder}

    <hr>

    <span id=""eof"">End of report</span>
</body>
</html>";


            Cursor.Current = Cursors.Default;

            SaveFileDialog sfd = new SaveFileDialog();

            sfd.Title    = "Specify a location to save your new VC backup";
            sfd.Filter   = "HTML file (*.html)|*.html|All files (*.*)|*.*";
            sfd.FileName = $"VC_{variantName}_{DateTime.Now.ToString("yyyyMMdd_HHmm")}.html";
            if (sfd.ShowDialog() == DialogResult.OK)
            {
                File.WriteAllText(sfd.FileName, document.ToString());
                MessageBox.Show($"Backup successfully saved to {sfd.FileName}", "Export complete");
            }
        }
Example #12
0
 public RunDiagForm(DiagService diagService)
 {
     CurrentDiagService = diagService;
     Result             = CurrentDiagService.RequestBytes;
     InitializeComponent();
 }