Files
Work/image/OPTLHDR.HPP
2024-08-07 09:16:27 -04:00

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