コード例 #1
0
		ResourceData ReadResourceData(int i) {
#if THREAD_SAFE
			resources.theLock.EnterWriteLock(); try {
#endif
			var info = dataInfos[i];
			var reader = resources.ResourceReader;
			var oldPos = reader.Position;
			reader.Position = info.offset;

			ResourceData data;
			if (reader.CanRead(16)) {
				RVA rva = (RVA)reader.ReadUInt32();
				uint size = reader.ReadUInt32();
				uint codePage = reader.ReadUInt32();
				uint reserved = reader.ReadUInt32();
				var dataReader = resources.CreateDataReader_NoLock(rva, size);
				data = new ResourceData(info.name, dataReader, codePage, reserved);
			}
			else
				data = new ResourceData(info.name, MemoryImageStream.CreateEmpty());

			reader.Position = oldPos;
			return data;
#if THREAD_SAFE
			} finally { resources.theLock.ExitWriteLock(); }
#endif
		}
コード例 #2
0
		uint WriteTo(BinaryWriter writer, ResourceData dataHeader) {
			writer.Write((uint)rva + dataDict[dataHeader.Data]);
			writer.Write((uint)dataHeader.Data.Length);
			writer.Write(dataHeader.CodePage);
			writer.Write(dataHeader.Reserved);
			return 16;
		}
コード例 #3
0
		/// <summary>
		/// Returns the <see cref="RVA"/> of a <see cref="ResourceData"/>.
		/// <see cref="SetOffset"/> must have been called.
		/// </summary>
		/// <param name="dataHeader">A <see cref="ResourceData"/></param>
		/// <returns>The RVA or 0 if <paramref name="dataHeader"/> is invalid</returns>
		public RVA GetRVA(ResourceData dataHeader) {
			FileOffset fileOffset;
			RVA rva;
			GetFileOffsetAndRvaOf(dataHeader, out fileOffset, out rva);
			return rva;
		}
コード例 #4
0
		/// <summary>
		/// Returns the <see cref="FileOffset"/> and <see cref="RVA"/> of a
		/// <see cref="ResourceData"/>. <see cref="SetOffset"/> must have been called.
		/// </summary>
		/// <param name="dataHeader">A <see cref="ResourceData"/></param>
		/// <param name="fileOffset">Updated with the file offset</param>
		/// <param name="rva">Updated with the RVA</param>
		/// <returns><c>true</c> if <paramref name="dataHeader"/> is valid and
		/// <paramref name="fileOffset"/> and <paramref name="rva"/> have been updated. <c>false</c>
		/// if <paramref name="dataHeader"/> is not part of the Win32 resources.</returns>
		public bool GetFileOffsetAndRvaOf(ResourceData dataHeader, out FileOffset fileOffset, out RVA rva) {
			uint offs;
			if (dataHeader == null || !dataHeaderDict.TryGetValue(dataHeader, out offs)) {
				fileOffset = 0;
				rva = 0;
				return false;
			}

			fileOffset = offset + offs;
			rva = this.rva + offs;
			return true;
		}
コード例 #5
0
        private static void SaveVersions(ModuleDefMD moduleDef, IEnumerable<VS_VERSIONINFO> versions)
        {
            var versionResourceName = new ResourceName(16);
            var resourceDirectory = moduleDef.MetaData.PEImage.Win32Resources.Root.FindDirectory(versionResourceName);
            if (resourceDirectory == null)
            {
                resourceDirectory = new ResourceDirectoryUser(versionResourceName);
                moduleDef.MetaData.PEImage.Win32Resources.Root.Directories.Add(resourceDirectory);
            }
            resourceDirectory.Directories.Clear();
            foreach (var version in versions)
            {
                var resourceEntry = (ResourceDirectoryUser)resourceDirectory.FindDirectory(version.DirectoryName);
                if (resourceEntry == null)
                {
                    resourceEntry = new ResourceDirectoryUser(version.DirectoryName);
                    resourceDirectory.Directories.Add(resourceEntry);
                }

                using (var memoryStream = new MemoryStream())
                {
                    ResourceSerializer.Serialize(version, memoryStream);
                    var versionEntry = new ResourceData(version.DataName, MemoryImageStream.Create(memoryStream.ToArray()));
                    resourceEntry.Data.Add(versionEntry);
                }
            }
        }
コード例 #6
0
		ResourceData ReadResourceData(int i) {
			var info = dataInfos[i];
			var reader = resources.ResourceReader;
			var oldPos = reader.Position;
			reader.Position = info.offset;

			ResourceData data;
			if (reader.CanRead(16)) {
				RVA rva = (RVA)reader.ReadUInt32();
				uint size = reader.ReadUInt32();
				uint codePage = reader.ReadUInt32();
				uint reserved = reader.ReadUInt32();
				var dataReader = resources.CreateDataReader(rva, size);
				data = new ResourceData(info.name, dataReader, codePage, reserved);
			}
			else
				data = new ResourceData(info.name, MemoryImageStream.CreateEmpty());

			reader.Position = oldPos;
			return data;
		}