From 8fa9860764aa836374924e533a1d4b3b078b15c8 Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Tue, 15 Jun 2021 21:04:16 +0200 Subject: [PATCH] Load windows device drivers list. --- client/TracyCallstack.cpp | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/client/TracyCallstack.cpp b/client/TracyCallstack.cpp index 5e2a99b7..66f556cc 100644 --- a/client/TracyCallstack.cpp +++ b/client/TracyCallstack.cpp @@ -15,6 +15,7 @@ # endif # include # include +# include # ifdef _MSC_VER # pragma warning( push ) # pragma warning( disable : 4091 ) @@ -127,6 +128,16 @@ struct ModuleCache }; static FastVector* s_modCache; + + +struct KernelDriver +{ + uint64_t addr; + const char* mod; +}; + +KernelDriver* s_krnlCache = nullptr; +size_t s_krnlCacheCnt; #endif void InitCallstack() @@ -142,13 +153,35 @@ void InitCallstack() SymSetOptions( SYMOPT_LOAD_LINES ); #ifndef __CYGWIN__ - HMODULE mod[1024]; DWORD needed; - HANDLE proc = GetCurrentProcess(); + LPVOID dev[4096]; + if( EnumDeviceDrivers( dev, sizeof(dev), &needed ) != 0 ) + { + const auto sz = needed / sizeof( LPVOID ); + s_krnlCache = (KernelDriver*)tracy_malloc( sizeof(KernelDriver) * sz ); + int cnt = 0; + for( size_t i=0; i", 2 ); + s_krnlCache[cnt++] = KernelDriver { (uint64_t)dev[i], buf }; + } + } + s_krnlCacheCnt = cnt; + std::sort( s_krnlCache, s_krnlCache + s_krnlCacheCnt, []( const KernelDriver& lhs, const KernelDriver& rhs ) { return lhs.addr > rhs.addr; } ); + } s_modCache = (FastVector*)tracy_malloc( sizeof( FastVector ) ); new(s_modCache) FastVector( 512 ); + HANDLE proc = GetCurrentProcess(); + HMODULE mod[1024]; if( EnumProcessModules( proc, mod, sizeof( mod ), &needed ) != 0 ) { const auto sz = needed / sizeof( HMODULE );