internal static IMAGE_SECTION_HEADER FromBinaryReader(BinaryReader reader) { IMAGE_SECTION_HEADER ret = new IMAGE_SECTION_HEADER(); try { bool allZero = true; for (int i = 0; i < IMAGE_SIZEOF_SHORT_NAME; i++) { ret.Name[i] = reader.ReadByte(); allZero &= (ret.Name[i] == 0); } if (allZero) { return(null); } ret.PhysicalAddress = reader.ReadUInt32(); ret.VirtualAddress = reader.ReadUInt32(); ret.SizeOfRawData = reader.ReadUInt32(); ret.PointerToRawData = reader.ReadUInt32(); ret.PointerToRelocations = reader.ReadUInt32(); ret.PointerToLinenumbers = reader.ReadUInt32(); ret.NumberOfRelocations = reader.ReadUInt16(); ret.NumberOfLinenumbers = reader.ReadUInt16(); ret.Characteristics = reader.ReadUInt32(); } catch { return(null); } return(ret); }
internal static Win32ExeHeader FromBinaryReader(BinaryReader reader) { try { long startPosition = reader.BaseStream.Position; long length = reader.BaseStream.Length - startPosition; if (length < 0x1000) { return(null); } Win32ExeHeader ret = new Win32ExeHeader(); ret.DosHeader = IMAGE_DOS_HEADER.FromBinaryReader(reader); if (ret.DosHeader == null) { return(null); } if (ret.DosHeader.e_lfanew <= 0) { return(ret); } reader.BaseStream.Seek(startPosition + ret.DosHeader.e_lfanew, SeekOrigin.Begin); ret.NtHeader = IMAGE_NT_HEADERS.FromBinaryReader(reader); if (ret.NtHeader == null) { return(null); } IMAGE_SECTION_HEADER section = IMAGE_SECTION_HEADER.FromBinaryReader(reader); while (section != null) { ret.SectionHeaders.Add(section); section = IMAGE_SECTION_HEADER.FromBinaryReader(reader); } return(ret); } catch { return(null); } }