diff --git a/BurnOutSharp.Builder/PortableExecutable.cs b/BurnOutSharp.Builder/PortableExecutable.cs
index d97e7c14..b64bfd39 100644
--- a/BurnOutSharp.Builder/PortableExecutable.cs
+++ b/BurnOutSharp.Builder/PortableExecutable.cs
@@ -55,6 +55,18 @@ namespace BurnOutSharp.Builder
#endregion
+ #region COFF File Header
+
+ // Try to parse the COFF file header
+ var coffFileHeader = ParseCOFFFileHeader(data, ref offset);
+ if (coffFileHeader == null)
+ return null;
+
+ // Set the COFF file header
+ executable.COFFFileHeader = coffFileHeader;
+
+ #endregion
+
// TODO: Implement PE parsing
return null;
}
@@ -65,10 +77,20 @@ namespace BurnOutSharp.Builder
/// Byte array to parse
/// Offset into the byte array
/// Filled COFF file header on success, null on error
- private static COFFFileHeader ParseCOFFFileHeader(byte[] data, int offset)
+ private static COFFFileHeader ParseCOFFFileHeader(byte[] data, ref int offset)
{
- // TODO: Implement PE COFF file header parsing
- return null;
+ // TODO: Use marshalling here instead of building
+ var fileHeader = new COFFFileHeader();
+
+ fileHeader.Machine = (MachineType)data.ReadUInt16(ref offset);
+ fileHeader.NumberOfSections = data.ReadUInt16(ref offset);
+ fileHeader.TimeDateStamp = data.ReadUInt32(ref offset);
+ fileHeader.PointerToSymbolTable = data.ReadUInt32(ref offset);
+ fileHeader.NumberOfSymbols = data.ReadUInt32(ref offset);
+ fileHeader.SizeOfOptionalHeader = data.ReadUInt16(ref offset);
+ fileHeader.Characteristics = (Characteristics)data.ReadUInt16(ref offset);
+
+ return fileHeader;
}
#endregion
@@ -121,6 +143,18 @@ namespace BurnOutSharp.Builder
#endregion
+ #region COFF File Header
+
+ // Try to parse the COFF file header
+ var coffFileHeader = ParseCOFFFileHeader(data);
+ if (coffFileHeader == null)
+ return null;
+
+ // Set the COFF file header
+ executable.COFFFileHeader = coffFileHeader;
+
+ #endregion
+
// TODO: Implement PE parsing
return null;
}
@@ -132,8 +166,18 @@ namespace BurnOutSharp.Builder
/// Filled executable header on success, null on error
private static COFFFileHeader ParseCOFFFileHeader(Stream data)
{
- // TODO: Implement PE COFF file header parsing
- return null;
+ // TODO: Use marshalling here instead of building
+ var fileHeader = new COFFFileHeader();
+
+ fileHeader.Machine = (MachineType)data.ReadUInt16();
+ fileHeader.NumberOfSections = data.ReadUInt16();
+ fileHeader.TimeDateStamp = data.ReadUInt32();
+ fileHeader.PointerToSymbolTable = data.ReadUInt32();
+ fileHeader.NumberOfSymbols = data.ReadUInt32();
+ fileHeader.SizeOfOptionalHeader = data.ReadUInt16();
+ fileHeader.Characteristics = (Characteristics)data.ReadUInt16();
+
+ return fileHeader;
}
#endregion