private StructureValueCollection SerializeDefinitionFixup(ResourceDefinitionFixup fixup) { var result = new StructureValueCollection(); result.SetInteger("offset", (uint)fixup.Offset); result.SetInteger("type index", (uint)fixup.Type); return(result); }
private static ResourceDefinitionFixup FinalizeDefinitionFixup(ResourceDefinitionFixup fixup, uint dataOffset) { return(new ResourceDefinitionFixup { Address = fixup.Address, DefinitionDataOffset = dataOffset + fixup.DefinitionDataOffset }); }
private static ExtractedResourceInfo ReadResource(IReader reader, byte version) { if (version != 1) { throw new InvalidOperationException("Unrecognized \"rsrc\" block version"); } var originalIndex = new DatumIndex(reader.ReadUInt32()); var resource = new ExtractedResourceInfo(originalIndex); resource.Flags = reader.ReadUInt32(); resource.Type = reader.ReadAscii(); if (string.IsNullOrEmpty(resource.Type)) { resource.Type = null; } resource.Info = ReadByteArray(reader); resource.OriginalParentTagIndex = new DatumIndex(reader.ReadUInt32()); byte hasLocation = reader.ReadByte(); if (hasLocation != 0) { resource.Location = new ExtractedResourcePointer(); resource.Location.OriginalPrimaryPageIndex = reader.ReadInt32(); resource.Location.PrimaryOffset = reader.ReadInt32(); resource.Location.PrimaryUnknown = reader.ReadInt32(); resource.Location.OriginalSecondaryPageIndex = reader.ReadInt32(); resource.Location.SecondaryOffset = reader.ReadInt32(); resource.Location.SecondaryUnknown = reader.ReadInt32(); } resource.Unknown1 = reader.ReadInt32(); resource.Unknown2 = reader.ReadInt32(); resource.Unknown3 = reader.ReadInt32(); int numResourceFixups = reader.ReadInt32(); for (int i = 0; i < numResourceFixups; i++) { var fixup = new ResourceFixup(); fixup.Offset = reader.ReadInt32(); fixup.Address = reader.ReadUInt32(); resource.ResourceFixups.Add(fixup); } int numDefinitionFixups = reader.ReadInt32(); for (int i = 0; i < numDefinitionFixups; i++) { var fixup = new ResourceDefinitionFixup(); fixup.Offset = reader.ReadInt32(); fixup.Type = reader.ReadInt32(); resource.DefinitionFixups.Add(fixup); } return(resource); }
private static ExtractedResourceInfo ReadResource(IReader reader, byte version) { if (version > 2) { throw new InvalidOperationException("Unrecognized \"rsrc\" block version"); } var originalIndex = new DatumIndex(reader.ReadUInt32()); var resource = new ExtractedResourceInfo(originalIndex); resource.Flags = reader.ReadUInt32(); resource.Type = reader.ReadAscii(); if (string.IsNullOrEmpty(resource.Type)) { resource.Type = null; } resource.Info = ReadByteArray(reader); resource.OriginalParentTagIndex = new DatumIndex(reader.ReadUInt32()); byte hasLocation = reader.ReadByte(); if (hasLocation != 0) { resource.Location = new ExtractedResourcePointer(); resource.Location.OriginalPrimaryPageIndex = reader.ReadInt32(); resource.Location.PrimaryOffset = reader.ReadInt32(); if (version > 1) { var size = reader.ReadInt32(); if (size != -1) { ResourceSize newSize = new ResourceSize(); newSize.Size = size; byte partCount = reader.ReadByte(); for (int i = 0; i < partCount; i++) { ResourceSizePart newPart = new ResourceSizePart(); newPart.Offset = reader.ReadInt32(); newPart.Size = reader.ReadInt32(); newSize.Parts.Add(newPart); } resource.Location.PrimarySize = newSize; } else { resource.Location.PrimarySize = null; } } else { resource.Location.PrimarySize = null; reader.Skip(4); } resource.Location.OriginalSecondaryPageIndex = reader.ReadInt32(); resource.Location.SecondaryOffset = reader.ReadInt32(); if (version > 1) { var size = reader.ReadInt32(); if (size != -1) { ResourceSize newSize = new ResourceSize(); newSize.Size = size; byte partCount = reader.ReadByte(); for (int i = 0; i < partCount; i++) { ResourceSizePart newPart = new ResourceSizePart(); newPart.Offset = reader.ReadInt32(); newPart.Size = reader.ReadInt32(); newSize.Parts.Add(newPart); } resource.Location.SecondarySize = newSize; } else { resource.Location.SecondarySize = null; } } else { resource.Location.SecondarySize = null; reader.Skip(4); } if (version > 1) { resource.Location.OriginalTertiaryPageIndex = reader.ReadInt32(); resource.Location.TertiaryOffset = reader.ReadInt32(); var size = reader.ReadInt32(); if (size != -1) { ResourceSize newSize = new ResourceSize(); newSize.Size = size; byte partCount = reader.ReadByte(); for (int i = 0; i < partCount; i++) { ResourceSizePart newPart = new ResourceSizePart(); newPart.Offset = reader.ReadInt32(); newPart.Size = reader.ReadInt32(); newSize.Parts.Add(newPart); } resource.Location.TertiarySize = newSize; } else { resource.Location.TertiarySize = null; } } } if (version == 1) { reader.BaseStream.Position += 4; resource.ResourceBits = reader.ReadUInt16(); reader.BaseStream.Position += 2; } else { resource.ResourceBits = reader.ReadInt32(); } resource.BaseDefinitionAddress = reader.ReadInt32(); int numResourceFixups = reader.ReadInt32(); for (int i = 0; i < numResourceFixups; i++) { var fixup = new ResourceFixup(); fixup.Offset = reader.ReadInt32(); fixup.Address = reader.ReadUInt32(); resource.ResourceFixups.Add(fixup); } int numDefinitionFixups = reader.ReadInt32(); for (int i = 0; i < numDefinitionFixups; i++) { var fixup = new ResourceDefinitionFixup(); fixup.Offset = reader.ReadInt32(); fixup.Type = reader.ReadInt32(); resource.DefinitionFixups.Add(fixup); } return(resource); }