BearParser
Portable Executable parsing library (from PE-bear)
Loading...
Searching...
No Matches
DataDirWrapper.cpp
Go to the documentation of this file.
1#include "pe/DataDirWrapper.h"
2#include "pe/PEFile.h"
3
5{
6 if (m_PE == NULL) return NULL;
7
9 IMAGE_DATA_DIRECTORY* ptr = (IMAGE_DATA_DIRECTORY*) m_Exe->getContentAt(myOff, getSize());
10 return ptr;
11}
12
14{
15 bufsize_t size = sizeof(IMAGE_DATA_DIRECTORY) * pe::DIR_ENTRIES_COUNT;
16 return size;
17}
18
19void* DataDirWrapper::getFieldPtr(size_t fieldId, size_t subField)
20{
21 if (fieldId >= pe::DIR_ENTRIES_COUNT) {
22 return getPtr(); // invalid fieldID, give default
23 }
24
25 IMAGE_DATA_DIRECTORY* dataDir = (IMAGE_DATA_DIRECTORY*) getPtr();
26 if (dataDir == NULL) return NULL;
27
28 switch (subField) {
29 case ADDRESS :
30 return (void*)(&dataDir[fieldId].VirtualAddress);
31 case SIZE :
32 return (void*)(&dataDir[fieldId].Size);
33 }
34 return (void*)(&dataDir[fieldId].VirtualAddress);
35}
36
37bufsize_t DataDirWrapper::getFieldSize(size_t fieldId, size_t subField)
38{
39 if (fieldId >= pe::DIR_ENTRIES_COUNT) return getSize();
40
41 IMAGE_DATA_DIRECTORY* dir = (IMAGE_DATA_DIRECTORY*) getPtr();
42 if (dir == NULL) return 0;
43
44 IMAGE_DATA_DIRECTORY record = dir[fieldId];
45
46 switch (subField) {
47 case ADDRESS :
48 return sizeof(record.VirtualAddress);
49 case SIZE :
50 return sizeof(record.Size);
51 }
52 return sizeof(record.VirtualAddress) + sizeof(record.Size);
53}
54
55QString DataDirWrapper::getFieldName(size_t fieldId)
56{
57 switch (fieldId) {
58 case pe::DIR_EXPORT: return "Export Directory";
59 case pe::DIR_IMPORT: return "Import Directory";
60 case pe::DIR_RESOURCE : return "Resource Directory";
61 case pe::DIR_EXCEPTION: return "Exception Directory";
62 case pe::DIR_SECURITY: return "Security Directory";
63 case pe::DIR_BASERELOC: return "Base Relocation Table";
64 case pe::DIR_DEBUG : return "Debug Directory";
65 case pe::DIR_ARCHITECTURE: return "Architecture Specific Data";
66 case pe::DIR_GLOBALPTR : return "RVA of GlobalPtr";
67 case pe::DIR_TLS: return "TLS Directory";
68 case pe::DIR_LOAD_CONFIG: return "Load Configuration Directory";
69 case pe::DIR_BOUND_IMPORT: return "Bound Import Directory";
70 case pe::DIR_IAT: return "Import Address Table";
71 case pe::DIR_DELAY_IMPORT: return "Delay Load Import Descriptors";
72 case pe::DIR_COM_DESCRIPTOR : return ".NET header";
73 }
74 return "";
75}
76
78{
79 if (subField != ADDRESS) return Executable::NOT_ADDR;
80
81 if (fieldId == pe::DIR_SECURITY) return Executable::RAW;
82 return Executable::RVA;
83}
uint32_t bufsize_t
uint64_t offset_t
virtual QString getFieldName(size_t fieldId)
virtual bufsize_t getFieldSize(size_t fieldId, size_t subField)
virtual Executable::addr_type containsAddrType(size_t fieldId, size_t subField=FIELD_NONE)
virtual void * getPtr()
virtual bufsize_t getSize()
virtual void * getFieldPtr(size_t fieldId, size_t subField)
BYTE * getContentAt(offset_t offset, bufsize_t size, bool allowExceptions=false)
Definition: Executable.h:57
offset_t peDataDirOffset()
Definition: PEFile.cpp:229