BearParser
Portable Executable parsing library (from PE-bear)
Loading...
Searching...
No Matches
DebugDirWrapper.h
Go to the documentation of this file.
1#pragma once
2
4#include "pe_undoc.h"
5
6
8{
9public:
11 : DataDirEntryWrapper(pe, pe::DIR_DEBUG) { wrap(); }
12
13 virtual void* getPtr() { return getDebugDir(); }
14
16 {
17 return getDirEntrySize();
18 }
19
20 virtual QString getName() { return "Debug"; }
21
22 virtual size_t getFieldsCount()
23 {
24 return entries.size();
25 }
26
27 virtual void* getFieldPtr(size_t fieldId, size_t subField) { return getSubfieldPtr(fieldId, subField ); }
28 virtual QString getFieldName(size_t fieldId, size_t subField) { return getSubfieldName(fieldId, subField ); }
29 virtual QString getFieldName(size_t fieldId) { return getFieldName(fieldId, FIELD_NONE); }
30 virtual bufsize_t getFieldSize(size_t fieldId, size_t subField = FIELD_NONE) { return getSubfieldSize(fieldId, subField); }
31
32protected:
33 bool wrap()
34 {
35 clear();
36 if (!getDataDirectory()) {
37 return false;
38 }
39 const size_t LIMIT = (-1);
40 size_t cntr = 0;
41 for (cntr = 0; cntr < LIMIT; cntr++) {
42 if (loadNextEntry(cntr) == false) break;
43 }
44 return true;
45 }
46
47 virtual bool loadNextEntry(size_t cntr);
48
49 IMAGE_DEBUG_DIRECTORY* getDebugDir(size_t index = 0)
50 {
51 const offset_t rva = getDirEntryAddress();
52 if (rva == INVALID_ADDR || rva == 0) {
53 return NULL;
54 }
55 const size_t offset = index * sizeof(IMAGE_DEBUG_DIRECTORY);
56 return (IMAGE_DEBUG_DIRECTORY*) m_Exe->getContentAt((rva + offset), Executable::RVA, sizeof(IMAGE_DEBUG_DIRECTORY));
57 }
58
60};
61
62
64{
65public:
66
78 };
79
80 DebugDirEntryWrapper(PEFile *pe, DebugDirWrapper *rootDir, size_t entryNumber)
81 : PENodeWrapper(pe, rootDir, entryNumber), dbgRootDir(rootDir)
82 {
83 wrap();
84 }
85
87
88 bool wrap();
89
90 virtual void* getPtr();
91 virtual bufsize_t getSize();
92
93 virtual QString getName()
94 {
95 IMAGE_DEBUG_DIRECTORY* d = debugDir();
96 if (!d) return "";
97 return translateType(d->Type);
98 }
99
100 virtual size_t getFieldsCount() { return FIELD_COUNTER; }
101 virtual size_t getSubFieldsCount() { return 1; }
102
103 virtual void* getFieldPtr(size_t fieldId, size_t subField);
104 virtual QString getFieldName(size_t fieldId);
105 virtual Executable::addr_type containsAddrType(size_t fieldId, size_t subField = FIELD_NONE);
106
107 QString translateType(int type);
108 QString translateFieldContent(size_t fieldId);
109
110protected:
111
112 IMAGE_DEBUG_DIRECTORY* debugDir()
113 {
114 if (!dbgRootDir) return NULL;
115 return this->dbgRootDir->getDebugDir(this->entryNum);
116 }
117
118 BYTE* getDebugStruct();
119 pe::DEBUG_RSDSI* getRDSI();
120 pe::DEBUG_NB10* getNB10();
121
123
125};
126
127
129{
130public:
131 // fields :
132 enum FieldID {
139 };
140
142 : ExeNodeWrapper(pe, _parentDir, 0)
143 {
144 this->parentDir = _parentDir;
145 }
146
147 // full structure boundaries
148 virtual void* getPtr();
149 virtual bufsize_t getSize();
150
151 virtual QString getName() { return "CodeView Info"; }
152 virtual size_t getFieldsCount() { return getPtr() ? FIELD_COUNTER : 0; }
153 virtual size_t getSubFieldsCount() { return 1; }
154
155 // specific field boundaries
156 virtual void* getFieldPtr(size_t fieldId, size_t subField = FIELD_NONE);
157 virtual QString getFieldName(size_t fieldId);
158 virtual Executable::addr_type containsAddrType(size_t fieldId, size_t subField) { return Executable::NOT_ADDR; }
159
160 QString translateFieldContent(size_t fieldId);
161
162 //this wrapper only:
163 QString getGuidString();
164 QString getSignature();
165private:
166 DebugDirEntryWrapper* parentDir;
167};
uint32_t bufsize_t
const offset_t INVALID_ADDR
uint64_t offset_t
#define FIELD_NONE
bufsize_t getDirEntrySize(bool trimToExeSize=false)
offset_t getDirEntryAddress()
IMAGE_DATA_DIRECTORY * getDataDirectory()
QString translateFieldContent(size_t fieldId)
virtual QString getFieldName(size_t fieldId)
virtual QString getName()
QString getSignature()
FieldID
@ F_CVDBG_SIGN
@ F_CVDBG_GUID
@ F_CVDBG_AGE
@ NONE
@ FIELD_COUNTER
@ F_CVDBG_PDB
virtual void * getPtr()
DebugDirCVEntryWrapper(Executable *pe, DebugDirEntryWrapper *_parentDir)
virtual void * getFieldPtr(size_t fieldId, size_t subField=FIELD_NONE)
QString getGuidString()
virtual size_t getFieldsCount()
virtual Executable::addr_type containsAddrType(size_t fieldId, size_t subField)
virtual bufsize_t getSize()
virtual size_t getSubFieldsCount()
pe::DEBUG_RSDSI * getRDSI()
bool wrap()
virtual QString getName()
DebugDirWrapper * dbgRootDir
QString translateFieldContent(size_t fieldId)
virtual QString getFieldName(size_t fieldId)
DebugDirEntryWrapper(PEFile *pe, DebugDirWrapper *rootDir, size_t entryNumber)
virtual size_t getSubFieldsCount()
~DebugDirEntryWrapper()
virtual void * getPtr()
DebugDirFID
@ RAW_DATA_PTR
@ MINOR_VER
@ CHARACTERISTIC
@ FIELD_COUNTER
@ NONE
@ TYPE
@ MAJOR_VER
@ DATA_SIZE
@ TIMESTAMP
@ RAW_DATA_ADDR
virtual bufsize_t getSize()
IMAGE_DEBUG_DIRECTORY * debugDir()
pe::DEBUG_NB10 * getNB10()
virtual void * getFieldPtr(size_t fieldId, size_t subField)
BYTE * getDebugStruct()
virtual size_t getFieldsCount()
virtual Executable::addr_type containsAddrType(size_t fieldId, size_t subField=FIELD_NONE)
QString translateType(int type)
virtual QString getFieldName(size_t fieldId)
virtual QString getFieldName(size_t fieldId, size_t subField)
virtual size_t getFieldsCount()
virtual void * getPtr()
virtual QString getName()
IMAGE_DEBUG_DIRECTORY * getDebugDir(size_t index=0)
virtual bool loadNextEntry(size_t cntr)
virtual bufsize_t getFieldSize(size_t fieldId, size_t subField=FIELD_NONE)
virtual void * getFieldPtr(size_t fieldId, size_t subField)
virtual bufsize_t getSize()
DebugDirWrapper(PEFile *pe)
virtual void * getSubfieldPtr(size_t fieldId, size_t subField)
virtual QString getSubfieldName(size_t fieldId, size_t subField)
std::vector< ExeNodeWrapper * > entries
virtual void clear()
virtual bufsize_t getSubfieldSize(size_t fieldId, size_t subField)
BYTE * getContentAt(offset_t offset, bufsize_t size, bool allowExceptions=false)
Definition: Executable.h:57
Definition: PEFile.h:41