102 Patches: Detours to the Rescue
C reference for DttR maintainers and modders.
Loading...
Searching...
No Matches
crash.c
Go to the documentation of this file.
1#include "sidecar_private.h"
2
3#include <dbghelp.h>
4
5#include <dttr_crashdump.h>
6#include <dttr_pcdogs.h>
7
9 bool resolved,
10 uintptr_t address,
11 const char *name,
12 uintptr_t module_base,
13 uint32_t image_size
14) {
15 if (!resolved || !name || !name[0] || image_size == 0) {
16 return false;
17 }
18
19 const uintptr_t image_end = module_base + image_size;
20 if (image_end < module_base) {
21 return false;
22 }
23
24 return address >= module_base && address < image_end;
25}
26
27static bool pcdogs_module_image_size(HMODULE module, DWORD *out_image_size) {
28 if (!module || !out_image_size) {
29 return false;
30 }
31
32 const uint8_t *base = (const uint8_t *)module;
33 const IMAGE_DOS_HEADER *dos = (const IMAGE_DOS_HEADER *)base;
34 if (dos->e_magic != IMAGE_DOS_SIGNATURE || dos->e_lfanew <= 0) {
35 return false;
36 }
37
38 const IMAGE_NT_HEADERS *nt = (const IMAGE_NT_HEADERS *)(base + dos->e_lfanew);
39 if (nt->Signature != IMAGE_NT_SIGNATURE) {
40 return false;
41 }
42
43 *out_image_size = nt->OptionalHeader.SizeOfImage;
44 return *out_image_size != 0;
45}
46
47static bool ensure_pcdogs_dbghelp_module(HANDLE process, HMODULE module, DWORD image_size) {
48 const DWORD base = (DWORD)(uintptr_t)module;
49 IMAGEHLP_MODULE module_info = {.SizeOfStruct = sizeof(module_info)};
50 if (SymGetModuleInfo(process, base, &module_info)) {
51 return true;
52 }
53
54 char module_path[MAX_PATH] = {0};
55 const char *image_name = NULL;
56 if (GetModuleFileNameA(module, module_path, sizeof(module_path)) != 0) {
57 image_name = module_path;
58 }
59
60 const DWORD loaded_base = SymLoadModuleEx(
61 process,
62 NULL,
63 image_name,
64 "pcdogs",
65 base,
66 image_size,
67 NULL,
68 SLMFLAG_VIRTUAL
69 );
70 if (loaded_base != 0) {
71 return true;
72 }
73
74 const DWORD error = GetLastError();
75 return error == ERROR_SUCCESS;
76}
77
78static bool dttr_pcdogs_crash_symbol_provider(HANDLE process, void *context) {
79 const DTTR_Core_Context *runtime = (const DTTR_Core_Context *)context;
80 if (!process || !runtime || !runtime->game_module) {
81 return false;
82 }
83
84 const HMODULE module = runtime->game_module;
85 DWORD image_size = 0;
86 if (!pcdogs_module_image_size(module, &image_size)) {
87 return false;
88 }
89
90 if (!ensure_pcdogs_dbghelp_module(process, module, image_size)) {
91 return false;
92 }
93
94 const uintptr_t module_base = (uintptr_t)module;
95 bool added_any = false;
96 for (uint32_t i = 0; i < DTTR_PCDOGS_SymbolFunctionCount(); i++) {
98 const char *name = DTTR_PCDOGS_SymbolFunctionNameAt(i);
100 fn->resolved,
101 fn->address,
102 name,
103 module_base,
104 image_size
105 )) {
106 continue;
107 }
108
109 if (SymAddSymbol(process, (DWORD)module_base, name, (DWORD)fn->address, 0, 0)) {
110 added_any = true;
111 }
112 }
113
114 return added_any;
115}
116
118 if (!runtime || !runtime->game_module) {
120 return;
121 }
122
124}
125
DTTR_Graphics_COM_DirectDrawSurface7 DWORD flags void NULL
static bool ensure_pcdogs_dbghelp_module(HANDLE process, HMODULE module, DWORD image_size)
Definition crash.c:47
static bool pcdogs_crash_symbol_should_add(bool resolved, uintptr_t address, const char *name, uintptr_t module_base, uint32_t image_size)
Definition crash.c:8
void dttr_pcdogs_crash_symbols_clear()
Definition crash.c:126
void dttr_pcdogs_crash_symbols_register(const DTTR_Core_Context *runtime)
Definition crash.c:117
static bool dttr_pcdogs_crash_symbol_provider(HANDLE process, void *context)
Definition crash.c:78
static bool pcdogs_module_image_size(HMODULE module, DWORD *out_image_size)
Definition crash.c:27
void DTTR_CrashDump_SetSymbolProvider(DTTR_CrashDump_SymbolProvider provider, void *context)
Registers a synchronous symbol provider used by crash stack formatting.
Definition crashdump.c:43
void DTTR_CrashDump_ClearSymbolProvider()
Definition crashdump.c:53
DTTR_PCDOGS_API const DTTR_PCDOGS_T_Symbol_Function * DTTR_PCDOGS_SymbolFunctionAt(uint32_t index)
DTTR_PCDOGS_API uint32_t DTTR_PCDOGS_SymbolFunctionCount()
DTTR_PCDOGS_API const char * DTTR_PCDOGS_SymbolFunctionNameAt(uint32_t index)