From 5954f1a406d799d71f43b060f72752521e58fac3 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sun, 5 Oct 2014 16:33:06 +0100 Subject: [PATCH] [Refs #87: Static Analysis] Handle paranoid case of dll not existing --- renderdoc/hooks/d3d11_hooks.cpp | 16 +++++++++++++++- renderdoc/hooks/dxgi_hooks.cpp | 32 +++++++++++++++++++++----------- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/renderdoc/hooks/d3d11_hooks.cpp b/renderdoc/hooks/d3d11_hooks.cpp index d105b6dd5..8da940173 100644 --- a/renderdoc/hooks/d3d11_hooks.cpp +++ b/renderdoc/hooks/d3d11_hooks.cpp @@ -120,9 +120,23 @@ private: // shouldn't ever get in here if we're in the case without hooks but let's be safe. if(m_HasHooks) + { createFunc = CreateDeviceAndSwapChain(); + } else - createFunc = (PFN_D3D11_CREATE_DEVICE_AND_SWAP_CHAIN)GetProcAddress(GetModuleHandleA("d3d11.dll"), "D3D11CreateDeviceAndSwapChain"); + { + HMODULE d3d11 = GetModuleHandleA("d3d11.dll"); + + if(d3d11) + { + createFunc = (PFN_D3D11_CREATE_DEVICE_AND_SWAP_CHAIN)GetProcAddress(d3d11, "D3D11CreateDeviceAndSwapChain"); + } + else + { + RDCERR("Something went seriously wrong, d3d11.dll couldn't be loaded!"); + return E_UNEXPECTED; + } + } return createFunc(pAdapter, DriverType, Software, Flags, pFeatureLevels, FeatureLevels, SDKVersion, pSwapChainDesc, ppSwapChain, ppDevice, pFeatureLevel, ppImmediateContext); diff --git a/renderdoc/hooks/dxgi_hooks.cpp b/renderdoc/hooks/dxgi_hooks.cpp index 5fbb67510..76a94bdab 100644 --- a/renderdoc/hooks/dxgi_hooks.cpp +++ b/renderdoc/hooks/dxgi_hooks.cpp @@ -66,20 +66,30 @@ public: if(dxgihooks.m_HasHooks) return dxgihooks.CreateDXGIFactory1_hook(riid, ppFactory); - PFN_CREATE_DXGI_FACTORY createFunc = (PFN_CREATE_DXGI_FACTORY)GetProcAddress(GetModuleHandleA("dxgi.dll"), "CreateDXGIFactory1"); + HMODULE dxgi = GetModuleHandleA("dxgi.dll"); - if(!createFunc) + if(dxgi) { - RDCERR("Trying to create hooked dxgi factory without dxgi loaded"); - return E_INVALIDARG; - } - - HRESULT ret = createFunc(riid, ppFactory); - - if(SUCCEEDED(ret)) - RefCountDXGIObject::HandleWrap(riid, ppFactory); + PFN_CREATE_DXGI_FACTORY createFunc = (PFN_CREATE_DXGI_FACTORY)GetProcAddress(dxgi, "CreateDXGIFactory1"); - return ret; + if(!createFunc) + { + RDCERR("Trying to create hooked dxgi factory without dxgi loaded"); + return E_INVALIDARG; + } + + HRESULT ret = createFunc(riid, ppFactory); + + if(SUCCEEDED(ret)) + RefCountDXGIObject::HandleWrap(riid, ppFactory); + + return ret; + } + else + { + RDCERR("Something went seriously wrong, dxgi.dll couldn't be loaded!"); + return E_UNEXPECTED; + } } private: