From e69ace7fdc27213f64f95a7b5f3e53befb095fef Mon Sep 17 00:00:00 2001 From: EnderIce2 Date: Sun, 3 Mar 2024 23:48:19 +0200 Subject: [PATCH] Add ExGetKSymbolByAddress function to retrieve kernel symbols by address --- core/panic/ui.cpp | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/core/panic/ui.cpp b/core/panic/ui.cpp index 74610cd..ed29102 100644 --- a/core/panic/ui.cpp +++ b/core/panic/ui.cpp @@ -108,21 +108,48 @@ static const char *x86PageFaultDescriptions[9] = { int ActiveScreen = 0; +char __modSym[20]; +nsa const char *ExGetKSymbolByAddress(uintptr_t Address) +{ + if (Address < (uintptr_t)&_kernel_start && + Address > (uintptr_t)&_kernel_end) + return ""; + + if (!KernelSymbolTable) + return ""; + + const char *sym = KernelSymbolTable->GetSymbol(Address); + + size_t symLen = strlen(sym); + + if (symLen > 16) + { + strncpy(__modSym, sym, 16); + __modSym[16] = '.'; + __modSym[17] = '.'; + __modSym[18] = '.'; + __modSym[19] = '\0'; + sym = __modSym; + } + + if (unlikely(symLen > 128)) + warn("Symbol \"%s\" is too long! Memory corrupted?", sym); + return sym; +} + nsa const char *ExGetKSymbol(CPU::ExceptionFrame *Frame) { if (Frame->rip < (uintptr_t)&_kernel_start && Frame->rip > (uintptr_t)&_kernel_end) return ""; - if (KernelSymbolTable) #if defined(a64) - return KernelSymbolTable->GetSymbol(Frame->rip); + return ExGetKSymbolByAddress(Frame->rip); #elif defined(a32) - return KernelSymbolTable->GetSymbol(Frame->eip); + return ExGetKSymbolByAddress(Frame->eip); #elif defined(aa64) - return KernelSymbolTable->GetSymbol(Frame->pc); + return ExGetKSymbolByAddress(Frame->pc); #endif - return ""; } nsa char *TrimWhiteSpace(char *str)