private void CreateVCDomains(BinaryReader reader, ECU parentEcu, CTFLanguage language) { VCDomains = new List <VCDomain>(); foreach (int variantCodingDomainEntry in VCDomainPoolOffsets) { VCDomain vcDomain = new VCDomain(reader, parentEcu, language, variantCodingDomainEntry); VCDomains.Add(vcDomain); } }
public void Restore(ECU parentEcu, VCDomain parentDomain, CTFLanguage language) { ParentECU = parentEcu; ParentDomain = parentDomain; foreach (VCSubfragment subfragment in Subfragments) { subfragment.Restore(language); } }
public void CreateVCDomains(BinaryReader reader, CTFLanguage language) { byte[] vcPool = ReadVarcodingPool(reader); VCDomain[] globalVCDs = new VCDomain[VcDomain_EntryCount]; using (BinaryReader poolReader = new BinaryReader(new MemoryStream(vcPool))) { for (int vcdIndex = 0; vcdIndex < VcDomain_EntryCount; vcdIndex++) { int entryOffset = poolReader.ReadInt32(); int entrySize = poolReader.ReadInt32(); uint entryCrc = poolReader.ReadUInt32(); long vcdBlockAddress = entryOffset + VcDomain_BlockOffset; VCDomain vcd = new VCDomain(reader, language, vcdBlockAddress, vcdIndex, this); globalVCDs[vcdIndex] = vcd; } } GlobalVCDs = new List <VCDomain>(globalVCDs); }
public VCFragment(BinaryReader reader, VCDomain parentDomain, long fragmentTable, int fragmentIndex, CTFLanguage language, ECU parentEcu) { // see DIOpenVarCodeFrag ParentDomain = parentDomain; ParentECU = parentEcu; long fragmentTableEntry = fragmentTable + (10 * fragmentIndex); reader.BaseStream.Seek(fragmentTableEntry, SeekOrigin.Begin); // no bitflag required for 10-byte table entry since it is mandatory int fragmentNewBaseOffset = reader.ReadInt32(); ByteBitPos = reader.ReadInt32(); ImplementationType = reader.ReadUInt16(); // Console.WriteLine($"Fragment new base @ 0x{fragmentNewBaseOffset:X}, byteBitPos 0x{fragmentByteBitPos:X}, implementationType: 0x{implementationType:X}"); long fragmentBaseAddress = fragmentTable + fragmentNewBaseOffset; reader.BaseStream.Seek(fragmentBaseAddress, SeekOrigin.Begin); ulong fragmentBitflags = reader.ReadUInt32(); // Console.WriteLine($"Fragment new bitflag @ 0x{fragmentBitflags:X}"); Name_CTF = CaesarReader.ReadBitflagInt32(ref fragmentBitflags, reader, -1); Description_CTF = CaesarReader.ReadBitflagInt32(ref fragmentBitflags, reader, -1); ReadAccessLevel = CaesarReader.ReadBitflagUInt8(ref fragmentBitflags, reader); WriteAccessLevel = CaesarReader.ReadBitflagUInt8(ref fragmentBitflags, reader); ByteOrder = CaesarReader.ReadBitflagUInt16(ref fragmentBitflags, reader); RawBitLength = CaesarReader.ReadBitflagInt32(ref fragmentBitflags, reader); IttOffset = CaesarReader.ReadBitflagInt32(ref fragmentBitflags, reader); InfoPoolIndex = CaesarReader.ReadBitflagInt32(ref fragmentBitflags, reader, -1); MeaningB = CaesarReader.ReadBitflagInt32(ref fragmentBitflags, reader, -1); MeaningC = CaesarReader.ReadBitflagInt32(ref fragmentBitflags, reader, -1); CCFHandle = CaesarReader.ReadBitflagInt16(ref fragmentBitflags, reader, -1); VarcodeDumpSize = CaesarReader.ReadBitflagInt32(ref fragmentBitflags, reader); VarcodeDump = CaesarReader.ReadBitflagDumpWithReader(ref fragmentBitflags, reader, VarcodeDumpSize, fragmentBaseAddress); SubfragmentCount = CaesarReader.ReadBitflagInt32(ref fragmentBitflags, reader); SubfragmentFileOffset = CaesarReader.ReadBitflagInt32(ref fragmentBitflags, reader); Qualifier = CaesarReader.ReadBitflagStringWithReader(ref fragmentBitflags, reader, fragmentBaseAddress); // Console.WriteLine($"{nameof(fragmentName)} : {fragmentName}, child {fragmentNoOfSubFragments} @ 0x{fragmentSubfragmentFileOffset:X} base {fragmentBaseAddress:X}"); if ((ByteOrder != 0) && (BitLength > 0)) { //throw new Exception("Currently assumes everything is little-endian"); Console.WriteLine($"WARNING: {Qualifier} (Size: {BitLength}) has an unsupported byte order. Please proceed with caution"); //PrintDebug(true); } long subfragmentTableAddress = SubfragmentFileOffset + fragmentBaseAddress; Subfragments.Clear(); for (int subfragmentIndex = 0; subfragmentIndex < SubfragmentCount; subfragmentIndex++) { reader.BaseStream.Seek(subfragmentTableAddress + (subfragmentIndex * 4), SeekOrigin.Begin); long subfragmentAddress = reader.ReadInt32() + subfragmentTableAddress; VCSubfragment subfragment = new VCSubfragment(reader, this, language, subfragmentAddress); Subfragments.Add(subfragment); } // PrintDebug(); // Console.WriteLine($"implementation-default : {implementationType:X4} upper: {(implementationType & 0xFF0):X4} lower: {(implementationType & 0xF):X4}"); FindFragmentSize(reader); }