BearParser
Portable Executable parsing library (from PE-bear)
DebugDirWrapper.cpp
Go to the documentation of this file.
1 #include "pe/DebugDirWrapper.h"
2 
3 /*
4 typedef struct _IMAGE_DEBUG_DIRECTORY {
5  DWORD Characteristics;
6  DWORD TimeDateStamp;
7  WORD MajorVersion;
8  WORD MinorVersion;
9  DWORD Type;
10  DWORD SizeOfData;
11  DWORD AddressOfRawData;
12  DWORD PointerToRawData;
13 } IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;
14 
15 */
16 
17 IMAGE_DEBUG_DIRECTORY* DebugDirWrapper::debugDir()
18 {
20 
21  BYTE *ptr = m_Exe->getContentAt(rva, Executable::RVA, sizeof(IMAGE_DEBUG_DIRECTORY));
22  if (ptr == NULL) return NULL;
23 
24  return (IMAGE_DEBUG_DIRECTORY*) ptr;
25 }
26 
28 {
29  return true;
30 }
31 
33 {
34  return debugDir();
35 }
36 
38 {
39  if (getPtr() == NULL) return 0;
40  return sizeof(IMAGE_DEBUG_DIRECTORY);
41 }
42 
44 {
45  return "Debug";
46 }
47 
48 
49 void* DebugDirWrapper::getFieldPtr(size_t fId, size_t subField)
50 {
51  IMAGE_DEBUG_DIRECTORY* d = debugDir();
52  if (d == NULL) return NULL;
53 
54  switch (fId) {
55  case CHARACTERISTIC: return &d->Characteristics;
56  case TIMESTAMP: return &d->TimeDateStamp;
57  case MAJOR_VER: return &d->MajorVersion;
58  case MINOR_VER: return &d->MinorVersion;
59  case TYPE: return &d->Type;
60  case DATA_SIZE: return &d->SizeOfData;
61  case RAW_DATA_ADDR: return &d->AddressOfRawData;
62  case RAW_DATA_PTR: return &d->PointerToRawData;
63  }
64  return this->getPtr();
65 }
66 
67 QString DebugDirWrapper::getFieldName(size_t fieldId)
68 {
69  switch (fieldId) {
70  case CHARACTERISTIC: return "Characteristics";
71  case TIMESTAMP: return "TimeDateStamp";
72  case MAJOR_VER: return "MajorVersion";
73  case MINOR_VER: return "MinorVersion";
74  case TYPE: return "Type";
75  case DATA_SIZE: return "SizeOfData";
76  case RAW_DATA_ADDR: return "AddressOfRawData";
77  case RAW_DATA_PTR: return "PointerToRawData";
78  }
79  return getName();
80 }
81 
83 {
84  switch (fieldId) {
85  case RAW_DATA_ADDR: return Executable::RVA;
86  case RAW_DATA_PTR: return Executable::RAW;
87  }
88  return Executable::NOT_ADDR;
89 }
90 
92 {
93  switch (type) {
94  case pe::DT_UNKNOWN : return "unknown";
95  case pe::DT_COFF : return "COFF";
96  case pe::DT_CODEVIEW : return "Visual C++ (CodeView)";
97  case pe::DT_FPO : return "frame pointer omission";
98  case pe::DT_MISC : return "DBG file";
99  case pe::DT_EXCEPTION : return "A copy of .pdata section";
100  case pe::DT_FIXUP : return "Reserved";
101  case pe::DT_OMAP_TO_SRC : return "mapping from an RVA in image to an RVA in source image";
102  case pe::DT_OMAP_FROM_SRC : return "mapping from an RVA in source image to an RVA in image";
103  case pe::DT_BORLAND : return "Borland";
104  case pe::DT_RESERVED10 : return "Reserved";
105  case pe::DT_CLSID : return "CLSID";
106  case pe::DT_VC_FEATURE : return "VC Feature";
107  case pe::DT_POGO : return "POGO";
108  case pe::DT_ILTCG : return "ILTCG";
109  case pe::DT_MPX : return "MPX";
110  case pe::DT_REPRO : return "REPRO";
111  }
112  return "";
113 }
114 
116 {
117  if (fieldId != TYPE) return "";
118 
119  IMAGE_DEBUG_DIRECTORY* d = debugDir();
120  if (d == NULL) return NULL;
121 
122  return translateType(d->Type);
123 }
124 
uint32_t bufsize_t
uint64_t offset_t
offset_t getDirEntryAddress()
QString translateFieldContent(size_t fieldId)
QString translateType(int type)
virtual bufsize_t getSize()
virtual QString getName()
virtual Executable::addr_type containsAddrType(size_t fieldId, size_t subField=FIELD_NONE)
virtual QString getFieldName(size_t fieldId)
virtual void * getFieldPtr(size_t fieldId, size_t subField)
virtual void * getPtr()
BYTE * getContentAt(offset_t offset, bufsize_t size, bool allowExceptions=false)
Definition: Executable.h:57