diff --git a/renderdoc/os/os_specific.h b/renderdoc/os/os_specific.h index 76c659e10..1e7df27f7 100644 --- a/renderdoc/os/os_specific.h +++ b/renderdoc/os/os_specific.h @@ -74,6 +74,7 @@ ExecuteResult LaunchAndInjectIntoProcess(const char *app, const char *workingDir const rdcarray &env, const char *capturefile, const CaptureOptions &opts, bool waitForExit); +bool IsModuleLoaded(const char *module); void *LoadModule(const char *module); void *GetFunctionAddress(void *module, const char *function); uint32_t GetCurrentPID(); diff --git a/renderdoc/os/posix/posix_process.cpp b/renderdoc/os/posix/posix_process.cpp index d971a45bf..cf54506bb 100644 --- a/renderdoc/os/posix/posix_process.cpp +++ b/renderdoc/os/posix/posix_process.cpp @@ -855,6 +855,11 @@ void Process::StopGlobalHook() { } +bool Process::IsModuleLoaded(const char *module) +{ + return dlopen(module, RTLD_NOW | RTLD_NOLOAD) != NULL; +} + void *Process::LoadModule(const char *module) { return dlopen(module, RTLD_NOW); diff --git a/renderdoc/os/win32/win32_process.cpp b/renderdoc/os/win32/win32_process.cpp index 774780464..29df2af8a 100644 --- a/renderdoc/os/win32/win32_process.cpp +++ b/renderdoc/os/win32/win32_process.cpp @@ -1656,6 +1656,11 @@ void Process::StopGlobalHook() globalHook = NULL; } +bool Process::IsModuleLoaded(const char *module) +{ + return GetModuleHandleA(module) != NULL; +} + void *Process::LoadModule(const char *module) { HMODULE mod = GetModuleHandleA(module); diff --git a/renderdoc/replay/entry_points.cpp b/renderdoc/replay/entry_points.cpp index fde3a65e4..a0ecfc39e 100644 --- a/renderdoc/replay/entry_points.cpp +++ b/renderdoc/replay/entry_points.cpp @@ -486,6 +486,9 @@ RENDERDOC_BecomeRemoteServer(const char *listenhost, RENDERDOC_KillCallback kill extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_StartSelfHostCapture(const char *dllname) { + if(!Process::IsModuleLoaded(dllname)) + return; + void *module = Process::LoadModule(dllname); if(module == NULL) @@ -509,6 +512,9 @@ extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_StartSelfHostCapture(const extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_EndSelfHostCapture(const char *dllname) { + if(!Process::IsModuleLoaded(dllname)) + return; + void *module = Process::LoadModule(dllname); if(module == NULL)