mirror of
https://github.com/hasherezade/bearparser
synced 2026-06-08 14:32:38 +00:00
102 lines
2.7 KiB
C++
102 lines
2.7 KiB
C++
#pragma once
|
|
|
|
#include "DataDirEntryWrapper.h"
|
|
|
|
class ExportDirWrapper : public DataDirEntryWrapper
|
|
{
|
|
public:
|
|
|
|
enum ExportDirFID {
|
|
NONE = FIELD_NONE,
|
|
CHARACTERISTIC,
|
|
TIMESTAMP,
|
|
MAJOR_VER,
|
|
MINOR_VER,
|
|
NAME_RVA,
|
|
BASE,
|
|
FUNCTIONS_NUM,
|
|
NAMES_NUM,
|
|
FUNCTIONS_RVA,
|
|
FUNC_NAMES_RVA,
|
|
NAMES_ORDINALS_RVA,
|
|
FIELD_COUNTER
|
|
};
|
|
|
|
ExportDirWrapper(PEFile *pe)
|
|
: DataDirEntryWrapper(pe, pe::DIR_EXPORT) { wrap(); }
|
|
|
|
bool wrap();
|
|
|
|
virtual void* getPtr() { return exportDir(); }
|
|
virtual bufsize_t getSize();
|
|
virtual QString getName();
|
|
virtual size_t getFieldsCount() { return FIELD_COUNTER; }
|
|
virtual size_t getSubFieldsCount() { return 1; }
|
|
|
|
virtual void* getFieldPtr(size_t fieldId, size_t subField);
|
|
virtual QString getFieldName(size_t fieldId);
|
|
virtual QString getLibraryName();
|
|
|
|
virtual Executable::addr_type containsAddrType(size_t fieldId, size_t subField = FIELD_NONE);
|
|
|
|
protected:
|
|
char* _getLibraryName();
|
|
void clear();
|
|
size_t mapNames();
|
|
|
|
IMAGE_EXPORT_DIRECTORY* exportDir();
|
|
std::map<WORD, DWORD> ordToNameId;
|
|
|
|
friend class ExportEntryWrapper;
|
|
};
|
|
|
|
|
|
class ExportEntryWrapper : public ExeNodeWrapper
|
|
{
|
|
public:
|
|
// fields :
|
|
enum FieldID {
|
|
NONE = FIELD_NONE,
|
|
FUNCTION_RVA,
|
|
NAME_RVA,
|
|
FIELD_COUNTER
|
|
};
|
|
|
|
ExportEntryWrapper(Executable *pe, ExportDirWrapper *parentDir, size_t entryNumber)
|
|
: ExeNodeWrapper(pe, parentDir, entryNumber) { this->parentDir = parentDir; }
|
|
|
|
// full structure boundaries
|
|
virtual void* getPtr() { return getFuncRvaPtr(); }
|
|
virtual bufsize_t getSize();
|
|
virtual QString getName();
|
|
|
|
virtual size_t getFieldsCount() { return FIELD_COUNTER; }
|
|
virtual size_t getSubFieldsCount() { return 1; }
|
|
|
|
// specific field boundaries
|
|
virtual void* getFieldPtr(size_t fieldId, size_t subField = FIELD_NONE);// { return getPtr(); }
|
|
virtual bufsize_t getFieldSize(size_t fieldId, size_t subField = FIELD_NONE) { return sizeof(DWORD); }
|
|
|
|
virtual QString getFieldName(size_t fieldId);
|
|
virtual Executable::addr_type containsAddrType(size_t fieldId, size_t subField) { return Executable::RVA; }
|
|
|
|
bool isByOrdinal();
|
|
uint32_t getOrdinal();
|
|
|
|
offset_t getFuncRva();
|
|
offset_t getFuncNameRva();
|
|
|
|
char* getFuncName();
|
|
QString getuncNameStr() { char* name = getFuncName(); return name ? name : ""; }
|
|
char* getForwarder(); // NULL if not forwarded
|
|
QString getForwarderStr() { char* forwarder = getForwarder(); return forwarder ? forwarder : ""; }
|
|
|
|
private:
|
|
DWORD* getFuncRvaPtr();
|
|
uint32_t getFuncNameId();
|
|
void* getFuncNameRvaPtr();
|
|
|
|
ExportDirWrapper* parentDir;
|
|
};
|
|
|