private StructureValueCollection SerializeSizePart(ResourceSizePart part) { var result = new StructureValueCollection(); result.SetInteger("offset", (uint)part.Offset); result.SetInteger("size", (uint)part.Size); return(result); }
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); }