BearParser
Portable Executable parsing library (from PE-bear)
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 
8  offset_t myOff = m_PE->peDataDirOffset();
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 
19 void* 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 
37 bufsize_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 
55 QString 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:189