285 lines
6.6 KiB
C++
285 lines
6.6 KiB
C++
#ifndef _IMAGE_IMAGEOPTIONALHEADER_HPP_
|
|
#define _IMAGE_IMAGEOPTIONALHEADER_HPP_
|
|
#ifndef _IMAGE_IMAGEDATADIRECTORY_HPP_
|
|
#include <image/imagedir.hpp>
|
|
#endif
|
|
#ifndef _IMAGE_DIRECTORYENTRYKEY_HPP_
|
|
#include <image/keydir.hpp>
|
|
#endif
|
|
#ifndef _IMAGE_NTSUBSYS_HPP_
|
|
#include <image/ntsubsys.hpp>
|
|
#endif
|
|
#ifndef _COMMON_ASSERT_HPP_
|
|
#include <common/assert.hpp>
|
|
#endif
|
|
|
|
class ImageOptionalHeader : private _IMAGE_OPTIONAL_HEADER
|
|
{
|
|
public:
|
|
enum{NTMagic=0x010B,ROMMagic=0x0107};
|
|
ImageOptionalHeader(void);
|
|
ImageOptionalHeader(const ImageOptionalHeader &someImageOptionalHeader);
|
|
~ImageOptionalHeader();
|
|
ImageOptionalHeader &operator=(const ImageOptionalHeader &someImageOptionalHeader);
|
|
WORD operator==(const ImageOptionalHeader &someImageOptionalHeader);
|
|
WORD operator<<(PureViewOfFile &pureView);
|
|
ImageDataDirectory operator[](DirectoryEntryKey entryKey);
|
|
WORD magic(void)const;
|
|
BYTE majorLinkerVersion(void)const;
|
|
BYTE minorLinkerVersion(void)const;
|
|
DWORD sizeofCode(void)const;
|
|
DWORD sizeofInitializedData(void)const;
|
|
DWORD sizeofUninitializedData(void)const;
|
|
DWORD entryPointAddress(void)const;
|
|
DWORD codeBase(void)const;
|
|
DWORD dataBase(void)const;
|
|
DWORD imageBase(void)const;
|
|
DWORD sectionAlignment(void)const;
|
|
DWORD fileAlignment(void)const;
|
|
WORD majorOSVersion(void)const;
|
|
WORD minorOSVersion(void)const;
|
|
WORD majorImageVersion(void)const;
|
|
WORD minorImageVersion(void)const;
|
|
WORD majorSubsystemVersion(void)const;
|
|
WORD minorSubsystemVersion(void)const;
|
|
DWORD sizeofImage(void)const;
|
|
DWORD sizeofHeaders(void)const;
|
|
DWORD checksum(void)const;
|
|
NTSubSystem subsystem(void)const;
|
|
WORD dllCharacteristics(void)const;
|
|
DWORD sizeofStackReserve(void)const;
|
|
DWORD sizeofStackCommit(void)const;
|
|
DWORD sizeofHeapReserve(void)const;
|
|
DWORD sizeofHeapCommit(void)const;
|
|
DWORD loaderFlags(void)const;
|
|
DWORD numberOfRvaAndSizes(void)const;
|
|
WORD isOkay(void)const;
|
|
private:
|
|
enum{NumberOfDirectoryEntries=IMAGE_NUMBEROF_DIRECTORY_ENTRIES};
|
|
};
|
|
|
|
inline
|
|
ImageOptionalHeader::ImageOptionalHeader(void)
|
|
{
|
|
::memset((char*)&((_IMAGE_OPTIONAL_HEADER&)*this),0,sizeof(_IMAGE_OPTIONAL_HEADER));
|
|
}
|
|
|
|
inline
|
|
ImageOptionalHeader::ImageOptionalHeader(const ImageOptionalHeader &someImageOptionalHeader)
|
|
{
|
|
*this=someImageOptionalHeader;
|
|
}
|
|
|
|
inline
|
|
ImageOptionalHeader::~ImageOptionalHeader()
|
|
{
|
|
}
|
|
|
|
inline
|
|
ImageOptionalHeader &ImageOptionalHeader::operator=(const ImageOptionalHeader &someImageOptionalHeader)
|
|
{
|
|
::memcpy((char*)&((_IMAGE_OPTIONAL_HEADER&)*this),(char*)&((_IMAGE_OPTIONAL_HEADER&)someImageOptionalHeader),sizeof(_IMAGE_OPTIONAL_HEADER));
|
|
return *this;
|
|
}
|
|
|
|
inline
|
|
WORD ImageOptionalHeader::operator==(const ImageOptionalHeader &someImageOptionalHeader)
|
|
{
|
|
return ::memcmp((char*)&((_IMAGE_OPTIONAL_HEADER&)*this),(char*)&((_IMAGE_OPTIONAL_HEADER&)someImageOptionalHeader),sizeof(_IMAGE_OPTIONAL_HEADER));
|
|
}
|
|
|
|
inline
|
|
WORD ImageOptionalHeader::operator<<(PureViewOfFile &pureView)
|
|
{
|
|
if(sizeof(_IMAGE_OPTIONAL_HEADER)!=pureView.read((char*)&((_IMAGE_OPTIONAL_HEADER&)*this),sizeof(_IMAGE_OPTIONAL_HEADER)))return FALSE;
|
|
return isOkay();
|
|
}
|
|
|
|
inline
|
|
ImageDataDirectory ImageOptionalHeader::operator[](DirectoryEntryKey entryKey)
|
|
{
|
|
assert(entryKey.entryKey()<numberOfRvaAndSizes());
|
|
return ImageDataDirectory(_IMAGE_OPTIONAL_HEADER::DataDirectory[entryKey.entryKey()]);
|
|
}
|
|
|
|
inline
|
|
WORD ImageOptionalHeader::magic(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::Magic;
|
|
}
|
|
|
|
inline
|
|
BYTE ImageOptionalHeader::majorLinkerVersion(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::MajorLinkerVersion;
|
|
}
|
|
|
|
inline
|
|
BYTE ImageOptionalHeader::minorLinkerVersion(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::MinorLinkerVersion;
|
|
}
|
|
|
|
inline
|
|
DWORD ImageOptionalHeader::sizeofCode(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::SizeOfCode;
|
|
}
|
|
|
|
inline
|
|
DWORD ImageOptionalHeader::sizeofInitializedData(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::SizeOfInitializedData;
|
|
}
|
|
|
|
inline
|
|
DWORD ImageOptionalHeader::sizeofUninitializedData(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::SizeOfUninitializedData;
|
|
}
|
|
|
|
inline
|
|
DWORD ImageOptionalHeader::entryPointAddress(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::AddressOfEntryPoint;
|
|
}
|
|
|
|
inline
|
|
DWORD ImageOptionalHeader::codeBase(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::BaseOfCode;
|
|
}
|
|
|
|
inline
|
|
DWORD ImageOptionalHeader::dataBase(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::BaseOfData;
|
|
}
|
|
|
|
inline
|
|
DWORD ImageOptionalHeader::imageBase(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::ImageBase;
|
|
}
|
|
|
|
inline
|
|
DWORD ImageOptionalHeader::sectionAlignment(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::SectionAlignment;
|
|
}
|
|
|
|
inline
|
|
DWORD ImageOptionalHeader::fileAlignment(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::FileAlignment;
|
|
}
|
|
|
|
inline
|
|
WORD ImageOptionalHeader::majorOSVersion(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::MajorOperatingSystemVersion;
|
|
}
|
|
|
|
inline
|
|
WORD ImageOptionalHeader::minorOSVersion(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::MinorOperatingSystemVersion;
|
|
}
|
|
|
|
inline
|
|
WORD ImageOptionalHeader::majorImageVersion(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::MajorImageVersion;
|
|
}
|
|
|
|
inline
|
|
WORD ImageOptionalHeader::minorImageVersion(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::MinorImageVersion;
|
|
}
|
|
|
|
inline
|
|
WORD ImageOptionalHeader::majorSubsystemVersion(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::MajorSubsystemVersion;
|
|
}
|
|
|
|
inline
|
|
WORD ImageOptionalHeader::minorSubsystemVersion(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::MinorSubsystemVersion;
|
|
}
|
|
|
|
inline
|
|
DWORD ImageOptionalHeader::sizeofImage(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::SizeOfImage;
|
|
}
|
|
|
|
inline
|
|
DWORD ImageOptionalHeader::sizeofHeaders(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::SizeOfHeaders;
|
|
}
|
|
|
|
inline
|
|
DWORD ImageOptionalHeader::checksum(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::CheckSum;
|
|
}
|
|
|
|
inline
|
|
NTSubSystem ImageOptionalHeader::subsystem(void)const
|
|
{
|
|
return NTSubSystem(_IMAGE_OPTIONAL_HEADER::Subsystem);
|
|
}
|
|
|
|
inline
|
|
WORD ImageOptionalHeader::dllCharacteristics(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::DllCharacteristics;
|
|
}
|
|
|
|
inline
|
|
DWORD ImageOptionalHeader::sizeofStackReserve(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::SizeOfStackReserve;
|
|
}
|
|
|
|
inline
|
|
DWORD ImageOptionalHeader::sizeofStackCommit(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::SizeOfStackCommit;
|
|
}
|
|
|
|
inline
|
|
DWORD ImageOptionalHeader::sizeofHeapReserve(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::SizeOfHeapReserve;
|
|
}
|
|
|
|
inline
|
|
DWORD ImageOptionalHeader::sizeofHeapCommit(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::SizeOfHeapCommit;
|
|
}
|
|
|
|
inline
|
|
DWORD ImageOptionalHeader::loaderFlags(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::LoaderFlags;
|
|
}
|
|
|
|
inline
|
|
DWORD ImageOptionalHeader::numberOfRvaAndSizes(void)const
|
|
{
|
|
return _IMAGE_OPTIONAL_HEADER::NumberOfRvaAndSizes;
|
|
}
|
|
|
|
inline
|
|
WORD ImageOptionalHeader::isOkay(void)const
|
|
{
|
|
return (NTMagic==magic()||ROMMagic==magic());
|
|
}
|
|
#endif
|