diff --git a/helpers_extended/source/InterfacePointers.cpp b/helpers_extended/source/InterfacePointers.cpp index 396315e..8a985a7 100644 --- a/helpers_extended/source/InterfacePointers.cpp +++ b/helpers_extended/source/InterfacePointers.cpp @@ -70,6 +70,47 @@ namespace InterfacePointers return iface_pointer; } + template + static inline T *ResolveSymbolNoDereference( + SourceSDK::FactoryLoader &loader, const Symbol &symbol + ) + { + if( symbol.type == Symbol::Type::None ) + return nullptr; + +#if defined SYSTEM_WINDOWS + + auto iface = reinterpret_cast( symbol_finder.Resolve( + loader.GetModule( ), symbol.name.c_str( ), symbol.length + ) ); + return iface != nullptr ? iface : nullptr; + +#elif defined SYSTEM_POSIX + + return reinterpret_cast( symbol_finder.Resolve( + loader.GetModule( ), symbol.name.c_str( ), symbol.length + ) ); + +#endif + + } + + template + static inline T *ResolveSymbolsNoDereference( + SourceSDK::FactoryLoader &loader, const std::vector &symbols + ) + { + T *iface_pointer = nullptr; + for( const auto &symbol : symbols ) + { + iface_pointer = ResolveSymbolNoDereference( loader, symbol ); + if( iface_pointer != nullptr ) + break; + } + + return iface_pointer; + } + namespace Internal { namespace Client @@ -249,7 +290,7 @@ namespace InterfacePointers if( iface_pointer == nullptr ) { SourceSDK::FactoryLoader engine_loader( "engine" ); - iface_pointer = ResolveSymbols( engine_loader, Symbols::IServer ); + iface_pointer = ResolveSymbolsNoDereference( engine_loader, Symbols::IServer ); } return iface_pointer;