private void ReadFileHeader()
{
// already read PE signature
ushort machineid = ReadUInt16();
if (machineid != FileImage.machine && machineid != FileImage.machinex64) InputError();
numSections = ReadUInt16();
uint TimeStamp = ReadUInt32();
ReadZeros(8); /* Pointer to Symbol Table, Number of Symbols */
int optHeadSize = ReadUInt16();
verInfo.characteristics = ReadUInt16();
verInfo.isDLL = (verInfo.characteristics & FileImage.dllFlag) != 0;
/* Now read PE Optional Header */
/* Standard Fields */
ushort magic = ReadUInt16();
if (magic != FileImage.magic && magic != FileImage.magic64) InputError();
x64 = magic == FileImage.magic64;
verInfo.lMajor = ReadByte(); // != FileImage.lMajor) InputError();
verInfo.lMinor = ReadByte(); // != FileImage.lMinor) InputError();
uint codeSize = ReadUInt32();
if (Diag.DiagOn) Console.WriteLine("codeSize = " + Hex.Int(codeSize));
uint initDataSize = ReadUInt32();
if (Diag.DiagOn) Console.WriteLine("initDataSize = " + Hex.Int(initDataSize));
uint uninitDataSize = ReadUInt32();
if (Diag.DiagOn) Console.WriteLine("uninitDataSize = " + Hex.Int(uninitDataSize));
uint entryPointRVA = ReadUInt32();
if (Diag.DiagOn) Console.WriteLine("entryPointRVA = " + Hex.Int(entryPointRVA));
uint baseOfCode = ReadUInt32();
if (Diag.DiagOn) Console.WriteLine("baseOfCode = " + Hex.Int(baseOfCode));
//uint baseOfData = ReadUInt32();
if (!x64) {
uint baseOfData = ReadUInt32();
if (Diag.DiagOn) Console.WriteLine("baseOfData = " + Hex.Int(baseOfData));
}
/* NT-Specific Fields */
ulong imageBase = x64 ? ReadUInt64() : ReadUInt32();
if (Diag.DiagOn) Console.WriteLine("imageBase = " + Hex.Long(imageBase));
uint sectionAlign = ReadUInt32();
if (Diag.DiagOn) Console.WriteLine("sectionAlign = " + Hex.Int(sectionAlign));
verInfo.fileAlign = ReadUInt32();
if (Diag.DiagOn) Console.WriteLine("fileAlign = " + Hex.Int(verInfo.fileAlign));
verInfo.osMajor = ReadUInt16();
if (Diag.DiagOn) Console.WriteLine("osMajor = " + Hex.Int(verInfo.osMajor));
//ReadZeros(6); // osMinor, userMajor, userMinor
verInfo.osMinor = ReadUInt16();
verInfo.userMajor = ReadUInt16();
verInfo.userMinor = ReadUInt16();
verInfo.subSysMajor = ReadUInt16();
if (Diag.DiagOn) Console.WriteLine("subsysMajor = " + Hex.Int(verInfo.subSysMajor));
verInfo.subSysMinor = ReadUInt16();
ReadZeros(4); // Reserved
uint imageSize = ReadUInt32();
if (Diag.DiagOn) Console.WriteLine("imageSize = " + Hex.Int(imageSize));
uint headerSize = ReadUInt32();
if (Diag.DiagOn) Console.WriteLine("headerSize = " + Hex.Int(headerSize));
uint checkSum = ReadUInt32();
if (Diag.DiagOn) Console.WriteLine("checkSum = " + Hex.Int(checkSum));
verInfo.subSystem = (SubSystem)ReadUInt16();
if (Diag.DiagOn) Console.WriteLine("subSystem = " + Hex.Short((int)verInfo.subSystem));
verInfo.DLLFlags = ReadUInt16();
if (Diag.DiagOn) Console.WriteLine("DLLFlags = " + Hex.Short(verInfo.DLLFlags));
ulong stackReserve = x64 ? ReadUInt64() : ReadUInt32(); // if (ReadUInt32() != FileImage.StackReserveSize) InputError();
ulong stackCommit = x64 ? ReadUInt64() : ReadUInt32(); // if (ReadUInt32() != FileImage.StackCommitSize) InputError();
ulong heapReserve = x64 ? ReadUInt64() : ReadUInt32(); // if (ReadUInt32() != FileImage.HeapReserveSize) InputError();
ulong heapCommit = x64 ? ReadUInt64() : ReadUInt32(); // if (ReadUInt32() != FileImage.HeapCommitSize) InputError();
ReadUInt32(); // if (ReadUInt32() != 0) InputError(); // LoaderFlags
uint numdict = ReadUInt32();
if (numdict != FileImage.NumDataDirectories) InputError();
/* Data Directories */
DataDirectoryRVA = new uint[FileImage.NumDataDirectories];
DataDirectorySize = new uint[FileImage.NumDataDirectories];
for (int i = 0; i < FileImage.NumDataDirectories; i++) {
DataDirectoryRVA[i] = ReadUInt32();
DataDirectorySize[i] = ReadUInt32();
}
if (Diag.DiagOn) {
Console.WriteLine("RVA = " + Hex.Int(DataDirectoryRVA[1]) + " Size = " + Hex.Int(DataDirectorySize[1]) + " Import Table");
Console.WriteLine("RVA = " + Hex.Int(DataDirectoryRVA[2]) + " Size = " + Hex.Int(DataDirectorySize[2]) + " Resource Table");
Console.WriteLine("RVA = " + Hex.Int(DataDirectoryRVA[5]) + " Size = " + Hex.Int(DataDirectorySize[5]) + " Base Relocation Table");
Console.WriteLine("RVA = " + Hex.Int(DataDirectoryRVA[12]) + " Size = " + Hex.Int(DataDirectorySize[12]) + " IAT");
Console.WriteLine("RVA = " + Hex.Int(DataDirectoryRVA[14]) + " Size = " + Hex.Int(DataDirectorySize[14]) + " CLI Header");
}
}