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