Пример #1
0
 ResourceWriter(ModuleDefMD module, Stream stream, ResourceElementSet resources)
 {
     this.module = module;
     this.typeCreator = new ResourceDataCreator(module);
     this.writer = new BinaryWriter(stream);
     this.resources = resources;
 }
Пример #2
0
 ResourceWriter(ModuleDefMD module, Stream stream, ResourceElementSet resources)
 {
     this.module      = module;
     this.typeCreator = new ResourceDataCreator(module);
     this.writer      = new BinaryWriter(stream);
     this.resources   = resources;
 }
Пример #3
0
		ResourceElementSet Read() {
			ResourceElementSet resources = new ResourceElementSet();

			uint sig = reader.ReadUInt32();
			if (sig != 0xBEEFCACE)
				throw new ResourceReaderException(string.Format("Invalid resource sig: {0:X8}", sig));
			if (!CheckReaders())
				throw new ResourceReaderException("Invalid resource reader");
			int version = reader.ReadInt32();
			if (version != 2)
				throw new ResourceReaderException(string.Format("Invalid resource version: {0}", version));
			int numResources = reader.ReadInt32();
			if (numResources < 0)
				throw new ResourceReaderException(string.Format("Invalid number of resources: {0}", numResources));
			int numUserTypes = reader.ReadInt32();
			if (numUserTypes < 0)
				throw new ResourceReaderException(string.Format("Invalid number of user types: {0}", numUserTypes));

			var userTypes = new List<UserResourceType>();
			for (int i = 0; i < numUserTypes; i++)
				userTypes.Add(new UserResourceType(reader.ReadString(), ResourceTypeCode.UserTypes + i));
			reader.Position = (reader.Position + 7) & ~7;

			var hashes = new int[numResources];
			for (int i = 0; i < numResources; i++)
				hashes[i] = reader.ReadInt32();
			var offsets = new int[numResources];
			for (int i = 0; i < numResources; i++)
				offsets[i] = reader.ReadInt32();

			long baseOffset = reader.Position;
			long dataBaseOffset = reader.ReadInt32();
			long nameBaseOffset = reader.Position;
			long end = reader.Length;

			var infos = new List<ResourceInfo>(numResources);

			for (int i = 0; i < numResources; i++) {
				reader.Position = nameBaseOffset + offsets[i];
				var name = reader.ReadString(Encoding.Unicode);
				long offset = dataBaseOffset + reader.ReadInt32();
				infos.Add(new ResourceInfo(name, offset));
			}

			infos.Sort((a, b) => a.offset.CompareTo(b.offset));
			for (int i = 0; i < infos.Count; i++) {
				var info = infos[i];
				var element = new ResourceElement();
				element.Name = info.name;
				reader.Position = info.offset;
				long nextDataOffset = i == infos.Count - 1 ? end : infos[i + 1].offset;
				int size = (int)(nextDataOffset - info.offset);
				element.ResourceData = ReadResourceData(userTypes, size);

				resources.Add(element);
			}

			return resources;
		}
Пример #4
0
		public byte[] Convert() {
			var resources = new ResourceElementSet();
			foreach (var info in infos)
				resources.Add(Convert(info));

			var memStream = new MemoryStream();
			ResourceWriter.Write(module, memStream, resources);
			return memStream.ToArray();
		}
Пример #5
0
 public static void Write(ModuleDefMD module, Stream stream, ResourceElementSet resources)
 {
     new ResourceWriter(module, stream, resources).Write();
 }
Пример #6
0
 public static void Write(ModuleDefMD module, Stream stream, ResourceElementSet resources)
 {
     new ResourceWriter(module, stream, resources).Write();
 }
Пример #7
0
        ResourceElementSet Read()
        {
            ResourceElementSet resources = new ResourceElementSet();

            uint sig = reader.ReadUInt32();

            if (sig != 0xBEEFCACE)
            {
                throw new ResourceReaderException(string.Format("Invalid resource sig: {0:X8}", sig));
            }
            if (!CheckReaders())
            {
                throw new ResourceReaderException("Invalid resource reader");
            }
            int version = reader.ReadInt32();

            if (version != 2)
            {
                throw new ResourceReaderException(string.Format("Invalid resource version: {0}", version));
            }
            int numResources = reader.ReadInt32();

            if (numResources < 0)
            {
                throw new ResourceReaderException(string.Format("Invalid number of resources: {0}", numResources));
            }
            int numUserTypes = reader.ReadInt32();

            if (numUserTypes < 0)
            {
                throw new ResourceReaderException(string.Format("Invalid number of user types: {0}", numUserTypes));
            }

            var userTypes = new List <UserResourceType>();

            for (int i = 0; i < numUserTypes; i++)
            {
                userTypes.Add(new UserResourceType(reader.ReadString(), ResourceTypeCode.UserTypes + i));
            }
            reader.Position = (reader.Position + 7) & ~7;

            var hashes = new int[numResources];

            for (int i = 0; i < numResources; i++)
            {
                hashes[i] = reader.ReadInt32();
            }
            var offsets = new int[numResources];

            for (int i = 0; i < numResources; i++)
            {
                offsets[i] = reader.ReadInt32();
            }

            long baseOffset     = reader.Position;
            long dataBaseOffset = reader.ReadInt32();
            long nameBaseOffset = reader.Position;
            long end            = reader.Length;

            var infos = new List <ResourceInfo>(numResources);

            for (int i = 0; i < numResources; i++)
            {
                reader.Position = nameBaseOffset + offsets[i];
                var  name   = reader.ReadString(Encoding.Unicode);
                long offset = dataBaseOffset + reader.ReadInt32();
                infos.Add(new ResourceInfo(name, offset));
            }

            infos.Sort((a, b) => a.offset.CompareTo(b.offset));
            for (int i = 0; i < infos.Count; i++)
            {
                var info    = infos[i];
                var element = new ResourceElement();
                element.Name    = info.name;
                reader.Position = info.offset;
                long nextDataOffset = i == infos.Count - 1 ? end : infos[i + 1].offset;
                int  size           = (int)(nextDataOffset - info.offset);
                element.ResourceData = ReadResourceData(userTypes, size);

                resources.Add(element);
            }

            return(resources);
        }
Пример #8
0
 public static void write(ModuleDefinition module, Stream stream, ResourceElementSet resources)
 {
     new ResourceWriter(module, stream, resources).write();
 }
Пример #9
0
 public static void write(ModuleDefinition module, Stream stream, ResourceElementSet resources)
 {
     new ResourceWriter(module, stream, resources).write();
 }