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);
        }