// void __cdecl DiagServiceReadPresentation(int *inBase, DECODED_PRESENTATION *outPresentation) // Looks like its actually a presentation // See DIDiagservice* functions public DiagPreparation(BinaryReader reader, CTFLanguage language, long baseAddress, int bitPosition, ushort modeConfig, ECU parentEcu, DiagService parentDiagService) { BitPosition = bitPosition; ModeConfig = modeConfig; Language = language; BaseAddress = baseAddress; ParentECU = parentEcu; ParentDiagService = parentDiagService; reader.BaseStream.Seek(baseAddress, SeekOrigin.Begin); ulong bitflags = reader.ReadUInt32(); Qualifier = CaesarReader.ReadBitflagStringWithReader(ref bitflags, reader, baseAddress); Name_CTF = CaesarReader.ReadBitflagInt32(ref bitflags, reader, -1); Unk1 = CaesarReader.ReadBitflagUInt8(ref bitflags, reader); Unk2 = CaesarReader.ReadBitflagUInt8(ref bitflags, reader); AlternativeBitWidth = CaesarReader.ReadBitflagInt32(ref bitflags, reader); IITOffset = CaesarReader.ReadBitflagInt32(ref bitflags, reader); InfoPoolIndex = CaesarReader.ReadBitflagInt32(ref bitflags, reader); PresPoolIndex = CaesarReader.ReadBitflagInt32(ref bitflags, reader); Field1E = CaesarReader.ReadBitflagInt32(ref bitflags, reader); SystemParam = CaesarReader.ReadBitflagInt16(ref bitflags, reader, -1); DumpMode = CaesarReader.ReadBitflagInt16(ref bitflags, reader); DumpSize = CaesarReader.ReadBitflagInt32(ref bitflags, reader); if (DumpMode == 5) { // dump is actually a string, use // CaesarReader.ReadBitflagDumpWithReaderAsString } Dump = CaesarReader.ReadBitflagDumpWithReader(ref bitflags, reader, DumpSize, baseAddress); SizeInBits = GetSizeInBits(reader); // PrintDebug(); }
public VCSubfragment(BinaryReader reader, VCFragment parentFragment, CTFLanguage language, long baseAddress) { // see DIOpenCBF_FragValHandle reader.BaseStream.Seek(baseAddress, SeekOrigin.Begin); ulong bitflags = reader.ReadUInt16(); Name_CTF = CaesarReader.ReadBitflagInt32(ref bitflags, reader, -1); if (parentFragment.CCFHandle == 5) { // fragment should be parsed as PBSGetDumpAsStringFn, though internally we perceive this as the same } Dump = CaesarReader.ReadBitflagDumpWithReader(ref bitflags, reader, parentFragment.VarcodeDumpSize, baseAddress); Description_CTF = CaesarReader.ReadBitflagInt32(ref bitflags, reader, -1); QualifierUsuallyDisabled = CaesarReader.ReadBitflagStringWithReader(ref bitflags, reader, baseAddress); Unk3 = CaesarReader.ReadBitflagInt32(ref bitflags, reader, -1); Unk4 = CaesarReader.ReadBitflagInt16(ref bitflags, reader, -1); SupplementKey = CaesarReader.ReadBitflagStringWithReader(ref bitflags, reader, baseAddress); NameCTFResolved = language.GetString(Description_CTF); //int subfragmentIdk2 = reader.ReadInt32(); //int subfragmentName = reader.ReadInt32(); //int subfragmentIdkIncremented = reader.ReadInt32(); //Console.WriteLine($"Subfragment: {subfragmentIdk1:X} {subfragmentIdk2:X} {language.GetString(subfragmentName)} {subfragmentIdkIncremented:X}"); //PrintDebug(); }
// looks exactly like the definition in DIOpenDiagService (#T) public ComParameter(BinaryReader reader, long baseAddress, List <ECUInterface> parentEcuInterfaceList, CTFLanguage language) { BaseAddress = baseAddress; reader.BaseStream.Seek(baseAddress, SeekOrigin.Begin); ulong bitflags = reader.ReadUInt16(); ComParamIndex = CaesarReader.ReadBitflagInt16(ref bitflags, reader); ParentInterfaceIndex = CaesarReader.ReadBitflagInt16(ref bitflags, reader); SubinterfaceIndex = CaesarReader.ReadBitflagInt16(ref bitflags, reader, 0); Unk5 = CaesarReader.ReadBitflagInt16(ref bitflags, reader); Unk_CTF = CaesarReader.ReadBitflagInt32(ref bitflags, reader); // no -1? ctf strings should have -1 Phrase = CaesarReader.ReadBitflagInt16(ref bitflags, reader); DumpSize = CaesarReader.ReadBitflagInt32(ref bitflags, reader); Dump = CaesarReader.ReadBitflagDumpWithReader(ref bitflags, reader, DumpSize, baseAddress); ComParamValue = 0; if (DumpSize == 4) { ComParamValue = BitConverter.ToInt32(Dump, 0); } ECUInterface parentEcuInterface = parentEcuInterfaceList[ParentInterfaceIndex]; if (ComParamIndex >= parentEcuInterface.ComParameterNames.Count) { // throw new Exception("Invalid communication parameter : parent interface has no matching key"); ParamName = "CP_UNKNOWN_MISSING_KEY"; Console.WriteLine($"Warning: Tried to load a communication parameter without a parent (value: {ComParamValue}), parent: {parentEcuInterface.Qualifier}."); } else { ParamName = parentEcuInterface.ComParameterNames[ComParamIndex]; } }
public ECUVariantPattern(BinaryReader reader, long baseAddress) { BaseAddress = baseAddress; reader.BaseStream.Seek(baseAddress, SeekOrigin.Begin); ulong bitflags = reader.ReadUInt32(); UnkBufferSize = CaesarReader.ReadBitflagInt32(ref bitflags, reader); UnkBuffer = CaesarReader.ReadBitflagDumpWithReader(ref bitflags, reader, UnkBufferSize, baseAddress); Unk3 = CaesarReader.ReadBitflagInt32(ref bitflags, reader); Unk4 = CaesarReader.ReadBitflagInt32(ref bitflags, reader); Unk5 = CaesarReader.ReadBitflagInt32(ref bitflags, reader); VendorName = CaesarReader.ReadBitflagStringWithReader(ref bitflags, reader, baseAddress); KwpVendorID = CaesarReader.ReadBitflagUInt16(ref bitflags, reader); Unk8 = CaesarReader.ReadBitflagInt16(ref bitflags, reader); Unk9 = CaesarReader.ReadBitflagInt16(ref bitflags, reader); Unk10 = CaesarReader.ReadBitflagInt16(ref bitflags, reader); Unk11 = CaesarReader.ReadBitflagUInt8(ref bitflags, reader); Unk12 = CaesarReader.ReadBitflagUInt8(ref bitflags, reader); Unk13 = CaesarReader.ReadBitflagUInt8(ref bitflags, reader); Unk14 = CaesarReader.ReadBitflagUInt8(ref bitflags, reader); Unk15 = CaesarReader.ReadBitflagUInt8(ref bitflags, reader); Unk16 = CaesarReader.ReadBitflagDumpWithReader(ref bitflags, reader, 5, baseAddress); // read with a constant size Unk17 = CaesarReader.ReadBitflagUInt8(ref bitflags, reader); Unk18 = CaesarReader.ReadBitflagUInt8(ref bitflags, reader); Unk19 = CaesarReader.ReadBitflagUInt8(ref bitflags, reader); Unk20 = CaesarReader.ReadBitflagUInt8(ref bitflags, reader); Unk21 = CaesarReader.ReadBitflagStringWithReader(ref bitflags, reader, baseAddress); Unk22 = CaesarReader.ReadBitflagInt32(ref bitflags, reader); Unk23 = CaesarReader.ReadBitflagInt32(ref bitflags, reader); UdsVendorID = CaesarReader.ReadBitflagInt32(ref bitflags, reader); PatternType = CaesarReader.ReadBitflagInt32(ref bitflags, reader); VariantID = UdsVendorID == 0 ? KwpVendorID : UdsVendorID; // type 3 contains a vendor name }
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); }