private void DumpCcmRom(IKW1281Dialog kwp1281) { if (_controllerAddress != (int)ControllerAddress.CCM && _controllerAddress != (int)ControllerAddress.CentralLocking) { Logger.WriteLine("Only supported for CCM and Central Locking"); return; } kwp1281.Login(19283, 222); var dumpFileName = _filename ?? "ccm_rom_dump.bin"; const byte blockSize = 8; Logger.WriteLine($"Saving CCM ROM to {dumpFileName}"); bool succeeded = true; using (var fs = File.Create(dumpFileName, blockSize, FileOptions.WriteThrough)) { for (int seg = 0; seg < 16; seg++) { for (int msb = 0; msb < 16; msb++) { for (int lsb = 0; lsb < 256; lsb += blockSize) { var blockBytes = kwp1281.ReadCcmRom((byte)seg, (byte)msb, (byte)lsb, blockSize); if (blockBytes == null) { blockBytes = Enumerable.Repeat((byte)0, blockSize).ToList(); succeeded = false; } else if (blockBytes.Count < blockSize) { blockBytes.AddRange(Enumerable.Repeat((byte)0, blockSize - blockBytes.Count)); succeeded = false; } fs.Write(blockBytes.ToArray(), 0, blockBytes.Count); fs.Flush(); } } } } if (!succeeded) { Logger.WriteLine(); Logger.WriteLine("**********************************************************************"); Logger.WriteLine("*** Warning: Some bytes could not be read and were replaced with 0 ***"); Logger.WriteLine("**********************************************************************"); Logger.WriteLine(); } }