/// <summary> /// Creates a new blob reader starting at the given offset. /// </summary> /// <param name="offset">The index of the blob to read.</param> /// <returns>The blob reader.</returns> public IBinaryStreamReader CreateBlobReader(uint offset) { var reader = _reader.CreateSubReader(_reader.StartPosition + offset); uint length; reader.TryReadCompressedUInt32(out length); return(reader.CreateSubReader(reader.Position, (int)length)); }
/// <summary> /// Gets the GUID at the given index. /// </summary> /// <param name="offset">The index of the GUID to get.</param> /// <returns>The GUID.</returns> public Guid GetGuidByOffset(uint offset) { if (offset == 0) { return(Guid.Empty); } return(ReadGuid(_reader.CreateSubReader(_reader.StartPosition + offset - 1))); }
/// <summary> /// Gets the string at the given offset. /// </summary> /// <param name="offset">The offset of the string to get.</param> /// <returns>The string.</returns> public string GetStringByOffset(uint offset) { if (offset == 0) { return(string.Empty); } var reader = _reader.CreateSubReader(_reader.StartPosition); reader.Position += offset; return(ReadString(reader)); }
/// <summary> /// Gets the managed resource data at the given offset. /// </summary> /// <param name="offset">The offset of the managed resource to get.</param> /// <returns>The raw data of the managed resource.</returns> public byte[] GetResourceData(uint offset) { if (_reader == null) { return(null); } var reader = _reader.CreateSubReader(_reader.StartPosition + offset); int length = reader.ReadInt32(); return(reader.ReadBytes(length)); }
private Dictionary<ushort, uint> ReadOrdinalRvaTable(IBinaryStreamReader reader, WindowsAssembly application) { var dictionary = new Dictionary<ushort, uint>(); if (NumberOfNames > 0) { var nameOrdinalReader = reader.CreateSubReader(application.RvaToFileOffset(AddressOfNameOrdinals)); var nameRvaReader = reader.CreateSubReader(application.RvaToFileOffset(AddressOfNames)); for (int i = 0; i < NumberOfNames; i++) dictionary.Add(nameOrdinalReader.ReadUInt16(), nameRvaReader.ReadUInt32()); } return dictionary; }
/// <summary> /// Gets the string at the given offset. /// </summary> /// <param name="offset">The offset of the string to get.</param> /// <returns>The string.</returns> public string GetStringByOffset(uint offset) { if (offset == 0 || offset >= _reader.Length) { return(null); } var reader = _reader.CreateSubReader(_reader.StartPosition); reader.Position += offset; lock (_cachedStrings) { return(ReadString(reader)); } }
private Dictionary <uint, uint> ReadOrdinalRvaTable(IBinaryStreamReader reader, IOffsetConverter converter) { var dictionary = new Dictionary <uint, uint>(); if (NumberOfNames > 0) { var nameOrdinalReader = reader.CreateSubReader(converter.RvaToFileOffset(AddressOfNameOrdinals)); var nameRvaReader = reader.CreateSubReader(converter.RvaToFileOffset(AddressOfNames)); for (int i = 0; i < NumberOfNames; i++) { dictionary.Add(nameOrdinalReader.ReadUInt16() + OrdinalBase, nameRvaReader.ReadUInt32()); } } return(dictionary); }
private uint[] ReadAddresses(IBinaryStreamReader reader, WindowsAssembly application) { var addressReader = reader.CreateSubReader(application.RvaToFileOffset(AddressOfFunctions)); var addresses = new uint[NumberOfFunctions]; for (int i = 0; i < NumberOfFunctions; i++) { addresses[i] = addressReader.ReadUInt32(); } return(addresses); }
private uint[] ReadAddresses(IBinaryStreamReader reader, IOffsetConverter converter) { var addressReader = reader.CreateSubReader(converter.RvaToFileOffset(AddressOfFunctions)); var addresses = new uint[NumberOfFunctions]; for (int i = 0; i < NumberOfFunctions; i++) { addresses[i] = addressReader.ReadUInt32(); } return(addresses); }
/// <summary> /// Forks the reader by creating a new instance of a binary stream reader, using the same data source, but a different address. /// </summary> /// <param name="reader">The reader to fork.</param> /// <param name="address">The address of the forked reader to start at.</param> /// <returns>A forked binary stream reader with the same data source, but a different address.</returns> public static IBinaryStreamReader CreateSubReader(this IBinaryStreamReader reader, long address) { return(reader.CreateSubReader(address, (int)(reader.Length - (address - reader.StartPosition)))); }
private uint[] ReadAddresses(IBinaryStreamReader reader, WindowsAssembly application) { var addressReader = reader.CreateSubReader(application.RvaToFileOffset(AddressOfFunctions)); var addresses = new uint[NumberOfFunctions]; for (int i = 0; i < NumberOfFunctions; i++) { addresses[i] = addressReader.ReadUInt32(); } return addresses; }