Exemplo n.º 1
0
        public static DebugInterfaceSlot Parse(DebugBytecodeReader reader, DebugBytecodeReader interfaceSlotReader)
        {
            var slotSpan = interfaceSlotReader.ReadUInt32("slotSpan");

            var count = interfaceSlotReader.ReadUInt32("count");

            var typeIDsOffset = interfaceSlotReader.ReadUInt32("typeIDsOffset");
            var typeIDsReader = reader.CopyAtOffset("typeIDsReader", interfaceSlotReader, (int)typeIDsOffset);

            var tableIDsOffset = interfaceSlotReader.ReadUInt32("tableIDsOffset");
            var tableIDsReader = reader.CopyAtOffset("tableIDsReader", interfaceSlotReader, (int)tableIDsOffset);

            var result = new DebugInterfaceSlot
            {
                SlotSpan = slotSpan
            };

            for (int i = 0; i < count; i++)
            {
                result.TypeIDs.Add(typeIDsReader.ReadUInt16($"TypeIDs[{i}]"));
                result.TableIDs.Add(tableIDsReader.ReadUInt32($"TableIDs[{i}]"));
            }

            return(result);
        }
        public static DebugInterfacesChunk Parse(DebugBytecodeReader reader, uint sizeInBytes)
        {
            var headerReader = reader.CopyAtCurrentPosition("InterfaceHeaderReader", reader);

            var result = new DebugInterfacesChunk();

            var classInstanceCount       = headerReader.ReadUInt32("classInstanceCount");
            var classTypeCount           = headerReader.ReadUInt32("classTypeCount");
            var interfaceSlotRecordCount = headerReader.ReadUInt32("interfaceSlotRecordCount");

            // Will be same as interfaceSlotRecordCount unless there are interface arrays.
            result.InterfaceSlotCount = headerReader.ReadUInt32("InterfaceSlotCount");

            headerReader.ReadUInt32("Think this is offset to start of interface slot info, but we don't need it.");             // Think this is offset to start of interface slot info, but we don't need it.

            var classTypeOffset      = headerReader.ReadUInt32("classTypeOffset");
            var availableClassReader = reader.CopyAtOffset("availableClassReader", headerReader, (int)classTypeOffset);

            var interfaceSlotOffset = headerReader.ReadUInt32("interfaceSlotOffset");
            var interfaceSlotReader = reader.CopyAtOffset("interfaceSlotReader", headerReader, (int)interfaceSlotOffset);

            var unknown1 = headerReader.ReadBytes("InterfaceChunkUnknown1", 4);
            var unknown2 = headerReader.ReadUInt16("InterfaceChunkUnknown2");
            var unknown3 = headerReader.ReadUInt16("InterfaceChunkUnknown3");

            for (uint i = 0; i < classTypeCount; i++)
            {
                var classType = DebugClassType.Parse(reader, availableClassReader);
                classType.ID = i;                 // Really??
                result.AvailableClassTypes.Add(classType);
            }

            for (uint i = 0; i < classInstanceCount; i++)
            {
                var classInstance = DebugClassInstance.Parse(reader, availableClassReader);
                result.AvailableClassInstances.Add(classInstance);
            }

            uint startSlot = 0;

            for (uint i = 0; i < interfaceSlotRecordCount; i++)
            {
                var interfaceSlot = DebugInterfaceSlot.Parse(reader, interfaceSlotReader);
                interfaceSlot.StartSlot = startSlot;                 // Really??
                result.InterfaceSlots.Add(interfaceSlot);

                startSlot += interfaceSlot.SlotSpan;
            }

            return(result);
        }