OLD | NEW |
| (Empty) |
1 #include "debug_debug_event2.h" | |
2 | |
3 namespace { | |
4 json::StructDefinitions loc_DEBUG_EVENT_struct_defs; | |
5 json::Object* CreateFromEXCEPTION_RECORD(const EXCEPTION_RECORD& er); | |
6 } // namespace | |
7 | |
8 namespace debug { | |
9 json::StructDefinitions* DEBUG_EVENT_struct_defs = &loc_DEBUG_EVENT_struct_defs; | |
10 | |
11 json::Value* CONTEXT_ToJSON(CONTEXT ct) { | |
12 DEBUG_EVENT_ToJSON_Init(); | |
13 return CreateFromStruct(&ct, "CONTEXT", loc_DEBUG_EVENT_struct_defs); | |
14 } | |
15 | |
16 json::Value* MEMORY_BASIC_INFORMATION32_ToJSON(MEMORY_BASIC_INFORMATION32 mbi) { | |
17 DEBUG_EVENT_ToJSON_Init(); | |
18 return CreateFromStruct(&mbi, "MEMORY_BASIC_INFORMATION32", loc_DEBUG_EVENT_st
ruct_defs); | |
19 } | |
20 | |
21 json::Value* DEBUG_EVENT_ToJSON(DEBUG_EVENT de) { | |
22 DEBUG_EVENT_ToJSON_Init(); | |
23 json::Object* root_obj = CreateFromStruct(&de, "DEBUG_EVENT", loc_DEBUG_EVENT_
struct_defs); | |
24 switch (de.dwDebugEventCode) { | |
25 case CREATE_PROCESS_DEBUG_EVENT: { | |
26 json::Object* u_obj = CreateFromStruct(&de.u.CreateProcessInfo, "CREATE_PR
OCESS_DEBUG_INFO", loc_DEBUG_EVENT_struct_defs); | |
27 root_obj->SetProperty("u.CreateProcessInfo", u_obj); | |
28 break; | |
29 } | |
30 case CREATE_THREAD_DEBUG_EVENT: { | |
31 json::Object* u_obj = CreateFromStruct(&de.u.CreateThread, "CREATE_THREAD_
DEBUG_INFO", loc_DEBUG_EVENT_struct_defs); | |
32 root_obj->SetProperty("u.CreateThread", u_obj); | |
33 break; | |
34 } | |
35 case EXCEPTION_DEBUG_EVENT: { | |
36 json::Object* u_obj = CreateFromStruct(&de.u.Exception, "EXCEPTION_DEBUG_I
NFO", loc_DEBUG_EVENT_struct_defs); | |
37 json::Object* ex_obj = CreateFromEXCEPTION_RECORD(de.u.Exception.Exception
Record); | |
38 u_obj->SetProperty("u.Exception.ExceptionRecord", ex_obj); | |
39 root_obj->SetProperty("u.Exception", u_obj); | |
40 break; | |
41 } | |
42 case EXIT_PROCESS_DEBUG_EVENT: { | |
43 json::Object* u_obj = CreateFromStruct(&de.u.ExitProcess, "EXIT_PROCESS_DE
BUG_INFO", loc_DEBUG_EVENT_struct_defs); | |
44 root_obj->SetProperty("u.ExitProcess", u_obj); | |
45 break; | |
46 } | |
47 case EXIT_THREAD_DEBUG_EVENT: { | |
48 json::Object* u_obj = CreateFromStruct(&de.u.ExitThread, "EXIT_THREAD_DEBU
G_INFO", loc_DEBUG_EVENT_struct_defs); | |
49 root_obj->SetProperty("u.ExitThread", u_obj); | |
50 break; | |
51 } | |
52 case LOAD_DLL_DEBUG_EVENT: { | |
53 json::Object* u_obj = CreateFromStruct(&de.u.LoadDll, "LOAD_DLL_DEBUG_INFO
", loc_DEBUG_EVENT_struct_defs); | |
54 root_obj->SetProperty("u.LoadDll", u_obj); | |
55 break; | |
56 } | |
57 case OUTPUT_DEBUG_STRING_EVENT: { | |
58 json::Object* u_obj = CreateFromStruct(&de.u.DebugString, "OUTPUT_DEBUG_ST
RING_INFO", loc_DEBUG_EVENT_struct_defs); | |
59 root_obj->SetProperty("u.DebugString", u_obj); | |
60 break; | |
61 } | |
62 case RIP_EVENT: { | |
63 json::Object* u_obj = CreateFromStruct(&de.u.RipInfo, "RIP_INFO", loc_DEBU
G_EVENT_struct_defs); | |
64 root_obj->SetProperty("u.RipInfo", u_obj); | |
65 break; | |
66 } | |
67 case UNLOAD_DLL_DEBUG_EVENT: { | |
68 json::Object* u_obj = CreateFromStruct(&de.u.UnloadDll, "UNLOAD_DLL_DEBUG_
INFO", loc_DEBUG_EVENT_struct_defs); | |
69 root_obj->SetProperty("u.UnloadDll", u_obj); | |
70 break; | |
71 } | |
72 } | |
73 return root_obj; | |
74 } | |
75 | |
76 void DEBUG_EVENT_ToJSON(DEBUG_EVENT de, std::string* text_out) { | |
77 json::StructTextCreator text_creator; | |
78 text_creator.SetGenerateComments(true, &loc_DEBUG_EVENT_struct_defs); | |
79 json::Value* root_obj = DEBUG_EVENT_ToJSON(de); | |
80 text_creator.CreateText(*root_obj, text_out); | |
81 delete root_obj; | |
82 } | |
83 | |
84 void DEBUG_EVENT_ToJSON_Init() { | |
85 static bool initialized = false; | |
86 if (initialized) return; | |
87 | |
88 const char* dwDebugEventCode_enums = | |
89 "3:CREATE_PROCESS_DEBUG_EVENT,2:CREATE_THREAD_DEBUG_EVENT,1:EXCEPTION_DEBU
G_EVENT," | |
90 "5:EXIT_PROCESS_DEBUG_EVENT,4:EXIT_THREAD_DEBUG_EVENT,6:LOAD_DLL_DEBUG_EVE
NT," | |
91 "8:OUTPUT_DEBUG_STRING_EVENT,9:RIP_EVENT,7:UNLOAD_DLL_DEBUG_EVENT"; | |
92 | |
93 json::StructDefinitions* defs = &loc_DEBUG_EVENT_struct_defs; | |
94 START_STRUCT_DEF(DEBUG_EVENT); | |
95 DEF_ENUM_FIELD(dwDebugEventCode, dwDebugEventCode_enums); | |
96 DEF_INT_FIELD(dwProcessId); | |
97 DEF_INT_FIELD(dwThreadId); | |
98 STOP_STRUCT_DEF; | |
99 | |
100 START_STRUCT_DEF(CREATE_PROCESS_DEBUG_INFO); | |
101 DEF_HANDLE_FIELD(hFile); | |
102 DEF_HANDLE_FIELD(hProcess); | |
103 DEF_HANDLE_FIELD(hThread); | |
104 DEF_PTR_FIELD(lpBaseOfImage); | |
105 DEF_INT_FIELD(dwDebugInfoFileOffset); | |
106 DEF_INT_FIELD(nDebugInfoSize); | |
107 DEF_PTR_FIELD(lpThreadLocalBase); | |
108 DEF_PTR_FIELD(lpStartAddress); | |
109 //DEF_USTR_FIELD(lpImageName, fUnicode); | |
110 DEF_INT_FIELD(lpImageName); //TODO: test only! | |
111 STOP_STRUCT_DEF; | |
112 | |
113 START_STRUCT_DEF(CREATE_THREAD_DEBUG_INFO); | |
114 DEF_HANDLE_FIELD(hThread); | |
115 DEF_PTR_FIELD(lpThreadLocalBase); | |
116 DEF_PTR_FIELD(lpStartAddress); | |
117 STOP_STRUCT_DEF; | |
118 | |
119 START_STRUCT_DEF(EXCEPTION_DEBUG_INFO); | |
120 DEF_INT_FIELD(dwFirstChance); | |
121 STOP_STRUCT_DEF; | |
122 | |
123 std::string ex_code_enums; | |
124 ADD_INT_C(EXCEPTION_ACCESS_VIOLATION, ex_code_enums); | |
125 ADD_INT_C(EXCEPTION_DATATYPE_MISALIGNMENT, ex_code_enums); | |
126 ADD_INT_C(EXCEPTION_BREAKPOINT, ex_code_enums); | |
127 ADD_INT_C(EXCEPTION_SINGLE_STEP, ex_code_enums); | |
128 ADD_INT_C(EXCEPTION_ARRAY_BOUNDS_EXCEEDED, ex_code_enums); | |
129 ADD_INT_C(EXCEPTION_FLT_DENORMAL_OPERAND, ex_code_enums); | |
130 ADD_INT_C(EXCEPTION_FLT_DIVIDE_BY_ZERO, ex_code_enums); | |
131 ADD_INT_C(EXCEPTION_FLT_INEXACT_RESULT, ex_code_enums); | |
132 ADD_INT_C(EXCEPTION_FLT_INVALID_OPERATION, ex_code_enums); | |
133 ADD_INT_C(EXCEPTION_FLT_OVERFLOW, ex_code_enums); | |
134 ADD_INT_C(EXCEPTION_FLT_STACK_CHECK, ex_code_enums); | |
135 ADD_INT_C(EXCEPTION_FLT_UNDERFLOW, ex_code_enums); | |
136 ADD_INT_C(EXCEPTION_INT_DIVIDE_BY_ZERO, ex_code_enums); | |
137 ADD_INT_C(EXCEPTION_INT_OVERFLOW, ex_code_enums); | |
138 ADD_INT_C(EXCEPTION_PRIV_INSTRUCTION, ex_code_enums); | |
139 ADD_INT_C(EXCEPTION_IN_PAGE_ERROR, ex_code_enums); | |
140 ADD_INT_C(EXCEPTION_ILLEGAL_INSTRUCTION, ex_code_enums); | |
141 ADD_INT_C(EXCEPTION_NONCONTINUABLE_EXCEPTION, ex_code_enums); | |
142 ADD_INT_C(EXCEPTION_STACK_OVERFLOW, ex_code_enums); | |
143 ADD_INT_C(EXCEPTION_INVALID_DISPOSITION, ex_code_enums); | |
144 ADD_INT_C(EXCEPTION_GUARD_PAGE, ex_code_enums); | |
145 ADD_INT_C(EXCEPTION_INVALID_HANDLE, ex_code_enums); | |
146 ADD_INT_C(CONTROL_C_EXIT, ex_code_enums); | |
147 ADD_INT_C(VS2008_THREAD_INFO, ex_code_enums); | |
148 | |
149 START_STRUCT_DEF(EXCEPTION_RECORD); | |
150 DEF_ENUM_FIELD(ExceptionCode, ex_code_enums); | |
151 DEF_ENUM_FIELD(ExceptionFlags, "0:EXCEPTION_CONTINUABLE,1:EXCEPTION_NONCONTINU
ABLE"); | |
152 DEF_PTR_FIELD(ExceptionAddress); | |
153 STOP_STRUCT_DEF; | |
154 | |
155 | |
156 START_STRUCT_DEF(EXIT_PROCESS_DEBUG_INFO); | |
157 DEF_INT_FIELD(dwExitCode); | |
158 STOP_STRUCT_DEF; | |
159 | |
160 START_STRUCT_DEF(EXIT_THREAD_DEBUG_INFO); | |
161 DEF_INT_FIELD(dwExitCode); | |
162 STOP_STRUCT_DEF; | |
163 | |
164 START_STRUCT_DEF(LOAD_DLL_DEBUG_INFO); | |
165 DEF_HANDLE_FIELD(hFile); | |
166 DEF_PTR_FIELD(lpBaseOfDll); | |
167 DEF_INT_FIELD(dwDebugInfoFileOffset); | |
168 DEF_INT_FIELD(nDebugInfoSize); | |
169 // DEF_USTR_FIELD(lpImageName, fUnicode); | |
170 DEF_INT_FIELD(lpImageName); //TODO: test only! | |
171 | |
172 STOP_STRUCT_DEF; | |
173 | |
174 START_STRUCT_DEF(OUTPUT_DEBUG_STRING_INFO); | |
175 DEF_USTR_FIELD(lpDebugStringData, fUnicode); | |
176 DEF_INT_FIELD(nDebugStringLength); | |
177 STOP_STRUCT_DEF; | |
178 | |
179 START_STRUCT_DEF(RIP_INFO); | |
180 DEF_INT_FIELD(dwError); | |
181 DEF_ENUM_FIELD(dwType, "1:SLE_ERROR,2:SLE_MINORERROR,3:SLE_WARNING"); | |
182 STOP_STRUCT_DEF; | |
183 | |
184 START_STRUCT_DEF(UNLOAD_DLL_DEBUG_INFO); | |
185 DEF_PTR_FIELD(lpBaseOfDll); | |
186 STOP_STRUCT_DEF; | |
187 | |
188 if (1 ) { | |
189 std::string protect_enums; | |
190 ADD_INT_C(PAGE_EXECUTE, protect_enums); | |
191 ADD_INT_C(PAGE_EXECUTE_READ, protect_enums); | |
192 ADD_INT_C(PAGE_EXECUTE_READWRITE, protect_enums); | |
193 ADD_INT_C(PAGE_EXECUTE_WRITECOPY, protect_enums); | |
194 ADD_INT_C(PAGE_NOACCESS, protect_enums); | |
195 ADD_INT_C(PAGE_READONLY, protect_enums); | |
196 ADD_INT_C(PAGE_READWRITE, protect_enums); | |
197 ADD_INT_C(PAGE_WRITECOPY, protect_enums); | |
198 ADD_INT_C(PAGE_GUARD, protect_enums); | |
199 ADD_INT_C(PAGE_NOCACHE, protect_enums); | |
200 ADD_INT_C(PAGE_WRITECOMBINE, protect_enums); | |
201 | |
202 std::string state_enums; | |
203 ADD_INT_C(MEM_COMMIT, state_enums); | |
204 ADD_INT_C(MEM_FREE, state_enums); | |
205 ADD_INT_C(MEM_RESERVE, state_enums); | |
206 | |
207 std::string type_enums; | |
208 ADD_INT_C(MEM_IMAGE, state_enums); | |
209 ADD_INT_C(MEM_MAPPED, state_enums); | |
210 ADD_INT_C(MEM_PRIVATE, state_enums); | |
211 | |
212 START_STRUCT_DEF(MEMORY_BASIC_INFORMATION32); | |
213 DEF_PTR_FIELD(BaseAddress); | |
214 DEF_PTR_FIELD(AllocationBase); | |
215 DEF_ENUM_FIELD(AllocationProtect, protect_enums); | |
216 DEF_INT_FIELD(RegionSize); | |
217 DEF_ENUM_FIELD(State, state_enums); | |
218 DEF_ENUM_FIELD(Protect, protect_enums); | |
219 DEF_ENUM_FIELD(Type, type_enums); | |
220 STOP_STRUCT_DEF; | |
221 } | |
222 | |
223 std::string ContextFlags_enums; | |
224 ADD_INT_C(CONTEXT_CONTROL, ContextFlags_enums); | |
225 ADD_INT_C(CONTEXT_INTEGER, ContextFlags_enums); | |
226 ADD_INT_C(CONTEXT_SEGMENTS, ContextFlags_enums); | |
227 ADD_INT_C(CONTEXT_FLOATING_POINT, ContextFlags_enums); | |
228 ADD_INT_C(CONTEXT_DEBUG_REGISTERS, ContextFlags_enums); | |
229 | |
230 #ifdef _WIN64 | |
231 START_STRUCT_DEF(CONTEXT); | |
232 DEF_ENUM_FIELD(ContextFlags, ContextFlags_enums); | |
233 DEF_INT_FIELD(Dr0); | |
234 DEF_INT_FIELD(Dr1); | |
235 DEF_INT_FIELD(Dr2); | |
236 DEF_INT_FIELD(Dr3); | |
237 DEF_INT_FIELD(Dr6); | |
238 DEF_INT_FIELD(Dr7); | |
239 DEF_INT_FIELD(SegGs); | |
240 DEF_INT_FIELD(SegFs); | |
241 DEF_INT_FIELD(SegEs); | |
242 DEF_INT_FIELD(SegDs); | |
243 DEF_INT_FIELD(Rdi); | |
244 DEF_INT_FIELD(Rsi); | |
245 DEF_INT_FIELD(Rbx); | |
246 DEF_INT_FIELD(Rdx); | |
247 DEF_INT_FIELD(Rcx); | |
248 DEF_INT_FIELD(Rax); | |
249 DEF_INT_FIELD(Rbp); | |
250 DEF_PTR_FIELD(Rip); | |
251 DEF_INT_FIELD(SegCs); | |
252 DEF_INT_FIELD(EFlags); | |
253 DEF_INT_FIELD(Rsp); | |
254 DEF_INT_FIELD(SegSs); | |
255 DEF_INT_FIELD(R8); | |
256 DEF_INT_FIELD(R9); | |
257 DEF_INT_FIELD(R10); | |
258 DEF_INT_FIELD(R11); | |
259 DEF_INT_FIELD(R12); | |
260 DEF_INT_FIELD(R13); | |
261 DEF_INT_FIELD(R14); | |
262 DEF_INT_FIELD(R15); | |
263 STOP_STRUCT_DEF; | |
264 #else | |
265 START_STRUCT_DEF(CONTEXT); | |
266 DEF_ENUM_FIELD(ContextFlags, ContextFlags_enums); | |
267 DEF_INT_FIELD(Dr0); | |
268 DEF_INT_FIELD(Dr1); | |
269 DEF_INT_FIELD(Dr2); | |
270 DEF_INT_FIELD(Dr3); | |
271 DEF_INT_FIELD(Dr6); | |
272 DEF_INT_FIELD(Dr7); | |
273 DEF_INT_FIELD(SegGs); | |
274 DEF_INT_FIELD(SegFs); | |
275 DEF_INT_FIELD(SegEs); | |
276 DEF_INT_FIELD(SegDs); | |
277 DEF_INT_FIELD(Edi); | |
278 DEF_INT_FIELD(Esi); | |
279 DEF_INT_FIELD(Ebx); | |
280 DEF_INT_FIELD(Edx); | |
281 DEF_INT_FIELD(Ecx); | |
282 DEF_INT_FIELD(Eax); | |
283 DEF_INT_FIELD(Ebp); | |
284 DEF_PTR_FIELD(Eip); | |
285 DEF_INT_FIELD(SegCs); | |
286 DEF_INT_FIELD(EFlags); | |
287 DEF_INT_FIELD(Esp); | |
288 DEF_INT_FIELD(SegSs); | |
289 STOP_STRUCT_DEF; | |
290 #endif | |
291 | |
292 initialized = true; | |
293 } | |
294 } // namespace debug | |
295 | |
296 namespace { | |
297 json::Object* CreateFromEXCEPTION_RECORD(const EXCEPTION_RECORD& er) { | |
298 json::Object* obj = CreateFromStruct(&er, "EXCEPTION_RECORD", loc_DEBUG_EVENT_
struct_defs); | |
299 //TODO: implement | |
300 return obj; | |
301 } | |
302 } // namespace | |
303 | |
OLD | NEW |