#ifndef _IMAGE_IMAGEOPTIONALHEADER_HPP_ #define _IMAGE_IMAGEOPTIONALHEADER_HPP_ #ifndef _IMAGE_IMAGEDATADIRECTORY_HPP_ #include #endif #ifndef _IMAGE_DIRECTORYENTRYKEY_HPP_ #include #endif #ifndef _IMAGE_NTSUBSYS_HPP_ #include #endif #ifndef _COMMON_ASSERT_HPP_ #include #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()