#ifndef _ENGINEER_IMAGETHUNKDATA_HPP_ #define _ENGINEER_IMAGETHUNKDATA_HPP_ #ifndef _COMMON_WINDOWS_HPP_ #include #endif #ifndef _COMMON_PUREVIEWOFFILE_HPP_ #include #endif #ifndef _COMMON_STRING_HPP_ #include #endif class ImageThunkData : private IMAGE_THUNK_DATA { public: ImageThunkData(void); ImageThunkData(const ImageThunkData &someImageThunkData); virtual ~ImageThunkData(); ImageThunkData &operator=(const ImageThunkData &someImageThunkData); WORD operator==(const ImageThunkData &someImageThunkData)const; ImageThunkData &operator<<(PureViewOfFile &pureView); operator IMAGE_THUNK_DATA&(void); DWORD forwarderStringRVA(void)const; void forwarderStringRVA(DWORD forwarderStringRVA); DWORD functionRVA(void)const; void functionRVA(DWORD functionRVA); DWORD ordinal(void)const; void ordinal(DWORD ordinal); DWORD addressOfDataRVA(void)const; void addressOfDataRVA(DWORD addressOfDataRVA); WORD isOkay(void)const; WORD isOrdinalImport(void)const; private: void setZero(void); }; inline ImageThunkData::ImageThunkData(void) { setZero(); } inline ImageThunkData::ImageThunkData(const ImageThunkData &someImageThunkData) { *this=someImageThunkData; } inline ImageThunkData::~ImageThunkData() { } inline ImageThunkData::operator IMAGE_THUNK_DATA&(void) { return *this; } inline ImageThunkData &ImageThunkData::operator=(const ImageThunkData &someImageThunkData) { forwarderStringRVA(someImageThunkData.forwarderStringRVA()); functionRVA(someImageThunkData.functionRVA()); ordinal(someImageThunkData.ordinal()); addressOfDataRVA(someImageThunkData.addressOfDataRVA()); return *this; } inline WORD ImageThunkData::operator==(const ImageThunkData &someImageThunkData)const { return (forwarderStringRVA()==someImageThunkData.forwarderStringRVA()&& functionRVA()==someImageThunkData.functionRVA()&& ordinal()==someImageThunkData.ordinal()&& addressOfDataRVA()==someImageThunkData.addressOfDataRVA()); } inline ImageThunkData &ImageThunkData::operator<<(PureViewOfFile &pureView) { pureView.read((char*)&((IMAGE_THUNK_DATA&)*this),sizeof(IMAGE_THUNK_DATA)); return *this; } inline DWORD ImageThunkData::forwarderStringRVA(void)const { return (DWORD)IMAGE_THUNK_DATA::u1.ForwarderString; } inline void ImageThunkData::forwarderStringRVA(DWORD forwarderStringRVA) { IMAGE_THUNK_DATA::u1.ForwarderString=(PBYTE)forwarderStringRVA; } inline DWORD ImageThunkData::functionRVA(void)const { return (DWORD)IMAGE_THUNK_DATA::u1.Function; } inline void ImageThunkData::functionRVA(DWORD functionRVA) { IMAGE_THUNK_DATA::u1.Function=(PDWORD)functionRVA; } inline DWORD ImageThunkData::ordinal(void)const { return IMAGE_ORDINAL(IMAGE_THUNK_DATA::u1.Ordinal); } inline void ImageThunkData::ordinal(DWORD ordinal) { IMAGE_THUNK_DATA::u1.Ordinal=ordinal; } inline DWORD ImageThunkData::addressOfDataRVA(void)const { return (DWORD)IMAGE_THUNK_DATA::u1.AddressOfData; } inline void ImageThunkData::addressOfDataRVA(DWORD addressOfDataRVA) { IMAGE_THUNK_DATA::u1.AddressOfData=(PIMAGE_IMPORT_BY_NAME)addressOfDataRVA; } inline void ImageThunkData::setZero(void) { ::memset(&((IMAGE_THUNK_DATA&)*this),0,sizeof(IMAGE_THUNK_DATA)); } inline WORD ImageThunkData::isOkay(void)const { return (functionRVA()?TRUE:FALSE); } inline WORD ImageThunkData::isOrdinalImport(void)const { return (IMAGE_THUNK_DATA::u1.Ordinal&IMAGE_ORDINAL_FLAG)==IMAGE_ORDINAL_FLAG; } #endif