PERWAPI.PEReader.ReadFileHeader C# (CSharp) Метод

ReadFileHeader() приватный Метод

private ReadFileHeader ( ) : void
Результат void
        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");
            }
        }