forked from KindDragon/vld
-
Notifications
You must be signed in to change notification settings - Fork 30
Expand file tree
/
Copy pathdbghelp.hpp
More file actions
181 lines (174 loc) · 7.24 KB
/
dbghelp.hpp
File metadata and controls
181 lines (174 loc) · 7.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#pragma once
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <DbgHelp.h>
#include "criticalsection.h"
class DbgHelp
{
public:
DbgHelp() {
m_lock.Initialize();
}
~DbgHelp() {
m_lock.Delete();
}
void Enter()
{
m_lock.Enter();
}
void Leave()
{
m_lock.Leave();
}
BOOL IsLockedByCurrentThread() {
return
m_lock.IsLockedByCurrentThread();
}
BOOL SymInitializeW(_In_ HANDLE hProcess, _In_opt_ PCWSTR UserSearchPath, _In_ BOOL fInvadeProcess, CriticalSectionLocker<DbgHelp>&) {
return ::SymInitializeW(hProcess, UserSearchPath, fInvadeProcess);
}
BOOL SymInitializeW(_In_ HANDLE hProcess, _In_opt_ PCWSTR UserSearchPath, _In_ BOOL fInvadeProcess) {
CriticalSectionLocker<CriticalSection> cs(m_lock);
return ::SymInitializeW(hProcess, UserSearchPath, fInvadeProcess);
}
BOOL SymCleanup(_In_ HANDLE hProcess, CriticalSectionLocker<DbgHelp>&) {
return ::SymCleanup(hProcess);
}
BOOL SymCleanup(_In_ HANDLE hProcess) {
CriticalSectionLocker<CriticalSection> cs(m_lock);
return ::SymCleanup(hProcess);
}
DWORD SymSetOptions(__in DWORD SymOptions, CriticalSectionLocker<DbgHelp>&) {
return ::SymSetOptions(SymOptions);
}
DWORD SymSetOptions(__in DWORD SymOptions) {
CriticalSectionLocker<CriticalSection> cs(m_lock);
return ::SymSetOptions(SymOptions);
}
BOOL SymFromAddrW(_In_ HANDLE hProcess, _In_ DWORD64 Address, _Out_opt_ PDWORD64 Displacement, _Inout_ PSYMBOL_INFOW Symbol, CriticalSectionLocker<DbgHelp>&) {
return ::SymFromAddrW(hProcess, Address, Displacement, Symbol);
}
BOOL SymFromAddrW(_In_ HANDLE hProcess, _In_ DWORD64 Address, _Out_opt_ PDWORD64 Displacement, _Inout_ PSYMBOL_INFOW Symbol) {
CriticalSectionLocker<CriticalSection> cs(m_lock);
return ::SymFromAddrW(hProcess, Address, Displacement, Symbol);
}
BOOL SymGetLineFromAddrW64(_In_ HANDLE hProcess, _In_ DWORD64 dwAddr, _Out_ PDWORD pdwDisplacement, _Out_ PIMAGEHLP_LINEW64 Line, CriticalSectionLocker<DbgHelp>&) {
return ::SymGetLineFromAddrW64(hProcess, dwAddr, pdwDisplacement, Line);
}
BOOL SymGetLineFromAddrW64(_In_ HANDLE hProcess, _In_ DWORD64 dwAddr, _Out_ PDWORD pdwDisplacement, _Out_ PIMAGEHLP_LINEW64 Line) {
CriticalSectionLocker<CriticalSection> cs(m_lock);
return ::SymGetLineFromAddrW64(hProcess, dwAddr, pdwDisplacement, Line);
}
BOOL SymGetModuleInfoW64(_In_ HANDLE hProcess, _In_ DWORD64 qwAddr, _Out_ PIMAGEHLP_MODULEW64 ModuleInfo, CriticalSectionLocker<DbgHelp>&) {
return ::SymGetModuleInfoW64(hProcess, qwAddr, ModuleInfo);
}
BOOL SymGetModuleInfoW64(_In_ HANDLE hProcess, _In_ DWORD64 qwAddr, _Out_ PIMAGEHLP_MODULEW64 ModuleInfo) {
CriticalSectionLocker<CriticalSection> cs(m_lock);
return ::SymGetModuleInfoW64(hProcess, qwAddr, ModuleInfo);
}
DWORD64 SymLoadModuleExW(_In_ HANDLE hProcess, _In_opt_ HANDLE hFile, _In_opt_ PCWSTR ImageName, _In_opt_ PCWSTR ModuleName, _In_ DWORD64 BaseOfDll, _In_ DWORD DllSize, _In_opt_ PMODLOAD_DATA Data, _In_opt_ DWORD Flags, CriticalSectionLocker<DbgHelp>&) {
return ::SymLoadModuleExW(hProcess, hFile, ImageName, ModuleName, BaseOfDll, DllSize, Data, Flags);
}
DWORD64 SymLoadModuleExW(_In_ HANDLE hProcess, _In_opt_ HANDLE hFile, _In_opt_ PCWSTR ImageName, _In_opt_ PCWSTR ModuleName, _In_ DWORD64 BaseOfDll, _In_ DWORD DllSize, _In_opt_ PMODLOAD_DATA Data, _In_opt_ DWORD Flags) {
CriticalSectionLocker<CriticalSection> cs(m_lock);
return ::SymLoadModuleExW(hProcess, hFile, ImageName, ModuleName, BaseOfDll, DllSize, Data, Flags);
}
BOOL SymUnloadModule64(_In_ HANDLE hProcess, _In_ DWORD64 BaseOfDll, CriticalSectionLocker<DbgHelp>&) {
return ::SymUnloadModule64(hProcess, BaseOfDll);
}
BOOL SymUnloadModule64(_In_ HANDLE hProcess, _In_ DWORD64 BaseOfDll) {
CriticalSectionLocker<CriticalSection> cs(m_lock);
return ::SymUnloadModule64(hProcess, BaseOfDll);
}
BOOL StackWalk64(__in DWORD MachineType, __in HANDLE hProcess, __in HANDLE hThread,
__inout LPSTACKFRAME64 StackFrame, __inout PVOID ContextRecord,
__in_opt PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,
__in_opt PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,
__in_opt PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,
__in_opt PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress, CriticalSectionLocker<DbgHelp>&)
{
return ::StackWalk64(MachineType, hProcess, hThread, StackFrame, ContextRecord, ReadMemoryRoutine,
FunctionTableAccessRoutine, GetModuleBaseRoutine, TranslateAddress);
}
BOOL StackWalk64(__in DWORD MachineType, __in HANDLE hProcess, __in HANDLE hThread,
__inout LPSTACKFRAME64 StackFrame, __inout PVOID ContextRecord,
__in_opt PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,
__in_opt PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,
__in_opt PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,
__in_opt PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress)
{
CriticalSectionLocker<CriticalSection> cs(m_lock);
return ::StackWalk64(MachineType, hProcess, hThread, StackFrame, ContextRecord, ReadMemoryRoutine,
FunctionTableAccessRoutine, GetModuleBaseRoutine, TranslateAddress);
}
private:
// Disallow certain operations
DbgHelp(const DbgHelp&);
DbgHelp& operator=(const DbgHelp&);
private:
CriticalSection m_lock;
};
class ImageDirectoryEntries
{
public:
ImageDirectoryEntries() {
m_lock.Initialize();
}
~ImageDirectoryEntries() {
m_lock.Delete();
}
void Enter()
{
m_lock.Enter();
}
void Leave()
{
m_lock.Leave();
}
BOOL IsLockedByCurrentThread() {
return
m_lock.IsLockedByCurrentThread();
}
PVOID ImageDirectoryEntryToDataEx(__in PVOID Base, __in BOOLEAN MappedAsImage, __in USHORT DirectoryEntry, __out PULONG Size, __out_opt PIMAGE_SECTION_HEADER *FoundHeader) {
CriticalSectionLocker<CriticalSection> cs(m_lock);
return ::ImageDirectoryEntryToDataEx(Base, MappedAsImage, DirectoryEntry, Size, FoundHeader);
}
private:
// Disallow certain operations
ImageDirectoryEntries(const ImageDirectoryEntries&);
ImageDirectoryEntries& operator=(const ImageDirectoryEntries&);
private:
CriticalSection m_lock;
};
class LoadedModules
{
public:
LoadedModules() {
m_lock.Initialize();
}
~LoadedModules() {
m_lock.Delete();
}
void Enter()
{
m_lock.Enter();
}
void Leave()
{
m_lock.Leave();
}
BOOL IsLockedByCurrentThread() {
return
m_lock.IsLockedByCurrentThread();
}
BOOL EnumerateLoadedModulesW64(__in HANDLE hProcess, __in PENUMLOADED_MODULES_CALLBACKW64 EnumLoadedModulesCallback, __in_opt PVOID UserContext) {
CriticalSectionLocker<CriticalSection> cs(m_lock);
return ::EnumerateLoadedModulesW64(hProcess, EnumLoadedModulesCallback, UserContext);
}
private:
// Disallow certain operations
LoadedModules(const LoadedModules&);
LoadedModules& operator=(const LoadedModules&);
private:
CriticalSection m_lock;
};