VAGSuite.EDC15VM_checksum.tdi41_checksum_search_256kb C# (CSharp) Method

tdi41_checksum_search_256kb() private method

private tdi41_checksum_search_256kb ( byte file_buffer, UInt32 file_size, bool debug ) : ChecksumResult
file_buffer byte
file_size System.UInt32
debug bool
return ChecksumResult
        private ChecksumResult tdi41_checksum_search_256kb(byte[] file_buffer, UInt32 file_size, bool debug)
        {
            bool first_pass = true;
            UInt32 chk_oldvalue, chk_value, chk_start_addr, chk_end_addr;
            UInt32[] chk_array = new UInt32[5] { 0x000B80, 0x008000, 0x014000, 0x038B80, 0x040000 };
            UInt16 seed_a = 0, seed_b = 0;

            chk_found = 0;
            chk_fixed = 0;
            chk_match = 0;

            for (; chk_found < chk_array.Length - 1; chk_found++)
            {
                chk_start_addr = chk_array[chk_found];
                chk_end_addr = chk_array[chk_found + 1];
                //DumpChecksum("chks " + chk_start_addr.ToString("X8") + "-" + chk_end_addr.ToString("X8"), file_buffer, debug);
                if (!first_pass)
                {
                    seed_a |= 0x8631;
                    seed_b |= 0xEFCD;
                }

                //if (CheckEmpty(file_buffer, chk_start_addr, chk_end_addr)) continue;

                chk_oldvalue = ((UInt32)file_buffer[chk_end_addr - 1] << 24)
                             + ((UInt32)file_buffer[chk_end_addr - 2] << 16)
                             + ((UInt32)file_buffer[chk_end_addr - 3] << 8)
                             + (UInt32)file_buffer[chk_end_addr - 4];

                chk_value = tdi41_checksum_calculate(file_buffer, chk_start_addr, chk_end_addr - 4, seed_a, seed_b);

                if (chk_oldvalue != chk_value && chk_oldvalue != 0xC3C3C3C3)
                {
                    file_buffer[chk_end_addr - 4] = Convert.ToByte(chk_value & 0x000000ff);
                    file_buffer[chk_end_addr - 3] = Convert.ToByte((chk_value >> 8) & 0x000000ff);
                    file_buffer[chk_end_addr - 2] = Convert.ToByte((chk_value >> 16) & 0x000000ff);
                    file_buffer[chk_end_addr - 1] = Convert.ToByte((chk_value >> 24) & 0x000000ff);
                    Console.WriteLine("Checksum at address " + chk_end_addr.ToString("X8") + " failed");
                    chk_fixed++;
                }
                else if (chk_oldvalue == chk_value) chk_match++;

                first_pass = false;
            }
            Console.WriteLine("edc15v41_chkfixed: " + chk_fixed.ToString() + " / " + chk_found.ToString());
            Console.WriteLine("edc15v41_chkmatch: " + chk_match.ToString() + " / " + chk_found.ToString());
            if (chk_fixed == 0) return ChecksumResult.ChecksumOK;
            else if (chk_match > 3) return ChecksumResult.ChecksumFail;
            else if (chk_fixed >= 6) return ChecksumResult.ChecksumTypeError;
            return ChecksumResult.ChecksumFail;
        }