Example #1
0
        public byte[] SetSubfragmentConfiguration(byte[] variantCodingValue, VCSubfragment subfragment)
        {
            byte[]      variantBits = BitUtility.ByteArrayToBitArray(variantCodingValue);
            List <byte> result      = new List <byte>(variantBits.Take(ByteBitPos));

            variantBits = variantBits.Skip(BitLength + ByteBitPos).ToArray();
            byte[] sfToSet = BitUtility.ByteArrayToBitArray(subfragment.Dump).Take(BitLength).ToArray();
            result.AddRange(sfToSet);
            result.AddRange(variantBits);
            return(BitUtility.BitArrayToByteArray(result.ToArray()));
        }
Example #2
0
        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);
        }