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

152 lines
3.4 KiB
C++

#ifndef _ENGINEER_IMAGETHUNKDATA_HPP_
#define _ENGINEER_IMAGETHUNKDATA_HPP_
#ifndef _COMMON_WINDOWS_HPP_
#include <common/windows.hpp>
#endif
#ifndef _COMMON_PUREVIEWOFFILE_HPP_
#include <common/pview.hpp>
#endif
#ifndef _COMMON_STRING_HPP_
#include <common/string.hpp>
#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