diff --git a/client/TracyCallstack.cpp b/client/TracyCallstack.cpp index f6d9bebe..0dff7c81 100644 --- a/client/TracyCallstack.cpp +++ b/client/TracyCallstack.cpp @@ -244,7 +244,16 @@ const char* DecodeCallstackPtrFast( uint64_t ptr ) return ret; } -const char* GetModuleName( uint64_t addr ) +const char* GetKernelModulePath( uint64_t addr ) +{ + assert( addr >> 63 != 0 ); + if( !s_krnlCache ) return nullptr; + auto it = std::lower_bound( s_krnlCache, s_krnlCache + s_krnlCacheCnt, addr, []( const KernelDriver& lhs, const uint64_t& rhs ) { return lhs.addr > rhs; } ); + if( it == s_krnlCache + s_krnlCacheCnt ) return nullptr; + return it->path; +} + +static const char* GetModuleName( uint64_t addr ) { if( ( addr >> 63 ) != 0 ) { diff --git a/client/TracyCallstack.hpp b/client/TracyCallstack.hpp index 76b01a2c..1db3f20a 100644 --- a/client/TracyCallstack.hpp +++ b/client/TracyCallstack.hpp @@ -51,7 +51,7 @@ CallstackSymbolData DecodeCodeAddress( uint64_t ptr ); const char* DecodeCallstackPtrFast( uint64_t ptr ); CallstackEntryData DecodeCallstackPtr( uint64_t ptr ); void InitCallstack(); -const char* GetModuleName( uint64_t addr ); +const char* GetKernelModulePath( uint64_t addr ); #if TRACY_HAS_CALLSTACK == 1 diff --git a/client/TracyProfiler.cpp b/client/TracyProfiler.cpp index 4076d815..5bcefd8b 100644 --- a/client/TracyProfiler.cpp +++ b/client/TracyProfiler.cpp @@ -3201,17 +3201,13 @@ void Profiler::HandleSymbolQueueItem( const SymbolQueueItem& si ) case SymbolQueueItemType::KernelCode: { #ifdef _WIN32 - auto mod = GetModuleName( si.ptr ); - if( strcmp( mod, "" ) != 0 ) + auto mod = GetKernelModulePath( si.ptr ); + if( mod ) { auto fn = DecodeCallstackPtrFast( si.ptr ); if( *fn ) { - char tmp[8192]; - auto modlen = strlen( mod ); - memcpy( tmp, mod+1, modlen-2 ); - tmp[modlen-2] = '\0'; - auto hnd = LoadLibraryExA( tmp, nullptr, DONT_RESOLVE_DLL_REFERENCES ); + auto hnd = LoadLibraryExA( mod, nullptr, DONT_RESOLVE_DLL_REFERENCES ); if( hnd ) { auto ptr = GetProcAddress( hnd, fn );