#pragma comment(lib, "DbgHelp.lib")
typedef BOOL (WINAPI *SymGetLineFromAddrW64_func_t)(HANDLE, DWORD64, PDWORD, PIMAGEHLP_LINE64);
typedef BOOL (WINAPI *SymFromAddr_func_t)(HANDLE a, DWORD64 b , PDWORD64 c, PSYMBOL_INFO d);
static void print_register(const char *name, unsigned __int64 value)
zabbix_log(LOG_LEVEL_CRIT, "%-7s = %16I64x = %20I64u = %20I64d", name, value, value, value);
static void print_register(const char *name, unsigned __int32 value)
zabbix_log(LOG_LEVEL_CRIT, "%-7s = %16lx = %20lu = %20ld", name, value, value, value);
static void print_fatal_info(CONTEXT *pctx)
zabbix_log(LOG_LEVEL_CRIT, "====== Fatal information: ======");
zabbix_log(LOG_LEVEL_CRIT, "Program counter: 0x%08lx", pctx->Rip);
zabbix_log(LOG_LEVEL_CRIT, "Program counter: 0x%04x", pctx->Eip);
zabbix_log(LOG_LEVEL_CRIT, "=== Registers: ===");
#define ZBX_LSHIFT(value, bits) (((unsigned __int64)value) << bits)
print_register("r8", pctx->R8);
print_register("r9", pctx->R9);
print_register("r10", pctx->R10);
print_register("r11", pctx->R11);
print_register("r12", pctx->R12);
print_register("r13", pctx->R13);
print_register("r14", pctx->R14);
print_register("r15", pctx->R15);
print_register("rdi", pctx->Rdi);
print_register("rsi", pctx->Rsi);
print_register("rbp", pctx->Rbp);
print_register("rbx", pctx->Rbx);
print_register("rdx", pctx->Rdx);
print_register("rax", pctx->Rax);
print_register("rcx", pctx->Rcx);
print_register("rsp", pctx->Rsp);
print_register("efl", pctx->EFlags);
print_register("csgsfs", ZBX_LSHIFT(pctx->SegCs, 24) | ZBX_LSHIFT(pctx->SegGs, 16) | ZBX_LSHIFT(pctx->SegFs, 8));
print_register("edi", pctx->Edi);
print_register("esi", pctx->Esi);
print_register("ebp", pctx->Ebp);
print_register("ebx", pctx->Ebx);
print_register("edx", pctx->Edx);
print_register("eax", pctx->Eax);
print_register("ecx", pctx->Ecx);
print_register("esp", pctx->Esp);
print_register("efl", pctx->EFlags);