void checkUMDriverOverrides(void* context) { lastContext = context; if( oldProcA == NULL ) { PreloadLibraryRTFn loadFunc = NULL; for( int i = 0; i < ShimCountMax; ++i ) { HINSTANCE hInst = NULL; try { hInst = LoadLibraryA(dllList[i]); } catch(...) { } oldLoaderInstances[i] = hInst; if( hInst ) { ShimedLibraries libCount = (ShimedLibraries)i; switch( libCount ) { case ShimLibDXGI: oldCreateDXGIFactory = (WinCreateDXGIFactory)SetProcAddressDirect( hInst, "CreateDXGIFactory", (PROC)OVRCreateDXGIFactory, oldCreateDXGIFactoryData ); oldCreateDXGIFactory1 = (WinCreateDXGIFactory1)SetProcAddressDirect( hInst, "CreateDXGIFactory1", (PROC)OVRCreateDXGIFactory1, oldCreateDXGIFactory1Data ); oldCreateDXGIFactory2 = (WinCreateDXGIFactory2)SetProcAddressDirect( hInst, "CreateDXGIFactory2", (PROC)OVRCreateDXGIFactory2, oldCreateDXGIFactory2Data ); break; case ShimLibD3D9: oldDirectX9Create = (WinDirect3DCreate9)SetProcAddressDirect( hInst, "Direct3DCreate9", (PROC)OVRDirect3DCreate9, oldDirectX9CreateData ); oldDirectX9ExCreate = (WinDirect3DCreate9Ex)SetProcAddressDirect( hInst, "Direct3DCreate9Ex", (PROC)OVRDirect3DCreate9Ex, oldDirectX9ExCreateData ); break; default: break; } for (int j = 0; j < NUM_LOADER_LIBS; ++j) { const char* loaderLibrary = loaderLibraryList[j]; PROC temp = NULL; temp = SetProcAddressA(hInst, loaderLibrary, "LoadLibraryA", (PROC)OVRLoadLibraryA); if (!oldProcA) { oldProcA = (WinLoadLibraryA)temp; } oldLoaderProcA[i][j] = temp; temp = SetProcAddressA(hInst, loaderLibrary, "LoadLibraryW", (PROC)OVRLoadLibraryW); if (!oldProcW) { oldProcW = (WinLoadLibraryW)temp; } oldLoaderProcW[i][j] = temp; temp = SetProcAddressA(hInst, loaderLibrary, "LoadLibraryExA", (PROC)OVRLoadLibraryExA); if (!oldProcExA) { oldProcExA = (WinLoadLibraryExA)temp; } oldLoaderProcExA[i][j] = temp; temp = SetProcAddressA(hInst, loaderLibrary, "LoadLibraryExW", (PROC)OVRLoadLibraryExW); if (!oldProcExW) { oldProcExW = (WinLoadLibraryExW)temp; } oldLoaderProcExW[i][j] = temp; temp = SetProcAddressA(hInst, loaderLibrary, "GetModuleHandleExA", (PROC)OVRGetModuleHandleExA); if (!oldProcModExA) { oldProcModExA = (WinGetModuleHandleExA)temp; } oldLoaderProcModExA[i][j] = temp; temp = SetProcAddressA(hInst, loaderLibrary, "GetModuleHandleExW", (PROC)OVRGetModuleHandleExW); if (!oldProcModExW) { oldProcModExW = (WinGetModuleHandleExW)temp; } oldLoaderProcModExW[i][j] = temp; } if (loadFunc == NULL) { loadFunc = (PreloadLibraryRTFn)GetProcAddress(hInst, "PreloadLibraryRT"); } } } rtFilterModule = (*oldProcA)( RTFilter ); IsCreatingBackBuffer backBufferFunc = NULL; ShouldVSync shouldVSyncFunc = NULL; if (rtFilterModule != NULL) { loadFunc = (PreloadLibraryRTFn)GetProcAddress(rtFilterModule, "PreloadLibraryRT"); backBufferFunc = (IsCreatingBackBuffer)GetProcAddress(rtFilterModule, "OVRIsCreatingBackBuffer"); shouldVSyncFunc = (ShouldVSync)GetProcAddress(rtFilterModule, "OVRShouldVSync"); } if (loadFunc != NULL) { appDriver.version = 1; appDriver.context = lastContext; // appDriver.pfnInitializingDisplay = OVRIsInitializingDisplay; appDriver.pfnInitializingDisplay = OVRLocalIsInitializingDisplay; appDriver.pfnRiftForContext = OVRRiftForContext; appDriver.pfnCloseRiftForContext = OVRCloseRiftForContext; appDriver.pfnWindowDisplayResolution = OVRWindowDisplayResolution; appDriver.pfnShouldEnableDebug = OVRShouldEnableDebug; appDriver.pfnIsCreatingBackBuffer = (backBufferFunc == NULL) ? OVRIsCreatingBackBuffer : backBufferFunc; appDriver.pfnShouldVSync = (shouldVSyncFunc == NULL) ? OVRShouldVSync : shouldVSyncFunc; appDriver.pfnExpectedResolution = OVRExpectedResolution; appDriver.pfnMirroringEnabled = OVRMirroringEnabled; appDriver.pfnGetWindowForContext = OVRGetWindowForContext; appDriver.pfnPresentRiftOnContext = OVRShouldPresentOnContext; appDriver.pfnDirect3DCreate9 = oldDirectX9Create; appDriver.pfnDirect3DCreate9Ex = oldDirectX9ExCreate; appDriver.pfnCreateDXGIFactory = oldCreateDXGIFactory; appDriver.pfnCreateDXGIFactory1 = oldCreateDXGIFactory1; appDriver.pfnCreateDXGIFactory2 = oldCreateDXGIFactory2; (*loadFunc)( &appDriver ); } } }
void clearUMDriverOverrides() { if (oldProcA != NULL) { // Unpatch all the things. if (oldCreateDXGIFactory) { restoreFunction((PROC)oldCreateDXGIFactory, oldCreateDXGIFactoryData); } if (oldCreateDXGIFactory1) { restoreFunction((PROC)oldCreateDXGIFactory1, oldCreateDXGIFactory1Data); } if (oldCreateDXGIFactory2) { restoreFunction((PROC)oldCreateDXGIFactory2, oldCreateDXGIFactory2Data); } if (oldDirectX9Create) { restoreFunction((PROC)oldDirectX9Create, oldDirectX9CreateData); } if (oldDirectX9ExCreate) { restoreFunction((PROC)oldDirectX9ExCreate, oldDirectX9ExCreateData); } if (oldCreateDXGIFactory2) { restoreFunction((PROC)oldCreateDXGIFactory2, oldCreateDXGIFactory2Data); } for (int i = 0; i < ShimCountMax; ++i) { HINSTANCE hInst = oldLoaderInstances[i]; if (hInst != NULL) { for (int j = 0; j < NUM_LOADER_LIBS; ++j) { const char* loaderLibrary = loaderLibraryList[j]; if (oldLoaderProcA[j]) { SetProcAddressA(hInst, loaderLibrary, "LoadLibraryA", oldLoaderProcA[i][j]); } if (oldLoaderProcW[j]) { SetProcAddressA(hInst, loaderLibrary, "LoadLibraryW", oldLoaderProcW[i][j]); } if (oldLoaderProcExA[j]) { SetProcAddressA(hInst, loaderLibrary, "LoadLibraryExA", oldLoaderProcExA[i][j]); } if (oldLoaderProcExW[j]) { SetProcAddressA(hInst, loaderLibrary, "LoadLibraryExW", oldLoaderProcExW[i][j]); } if (oldLoaderProcModExA[j]) { SetProcAddressA(hInst, loaderLibrary, "GetModuleHandleExA", oldLoaderProcModExA[i][j]); } if (oldLoaderProcModExW[j]) { SetProcAddressA(hInst, loaderLibrary, "GetModuleHandleExW", oldLoaderProcModExW[i][j]); } } FreeLibrary(hInst); } } if (rtFilterModule != NULL) { LPFNCANUNLOADNOW pfnCanUnloadNow = (LPFNCANUNLOADNOW)GetProcAddress(rtFilterModule, "DllCanUnloadNow"); if (pfnCanUnloadNow && pfnCanUnloadNow() == S_OK) { FreeLibrary(rtFilterModule); rtFilterModule = NULL; } } oldProcA = NULL; oldProcExA = NULL; oldProcW = NULL; oldProcExW = NULL; oldProcModExA = NULL; oldProcModExW = NULL; oldDirectX9Create = NULL; oldDirectX9ExCreate = NULL; oldCreateDXGIFactory = NULL; oldCreateDXGIFactory1 = NULL; oldCreateDXGIFactory2 = NULL; lastContext = NULL; } }
bool checkUMDriverOverrides(void* context) { lastContext = context; if (oldProcA != NULL) return true; PreloadLibraryRTFn loadFunc = NULL; for( int i = 0; i < ShimCountMax; ++i ) { HINSTANCE hInst = NULL; try { hInst = LoadLibraryA(dllList[i]); } catch(...) { } oldLoaderInstances[i] = hInst; if (hInst == NULL) continue; ShimedLibraries libCount = (ShimedLibraries)i; switch( libCount ) { case ShimLibDXGI: oldCreateDXGIFactory = (WinCreateDXGIFactory)SetProcAddressDirect( hInst, "CreateDXGIFactory", (PROC)OVRCreateDXGIFactory, oldCreateDXGIFactoryData ); oldCreateDXGIFactory1 = (WinCreateDXGIFactory1)SetProcAddressDirect( hInst, "CreateDXGIFactory1", (PROC)OVRCreateDXGIFactory1, oldCreateDXGIFactory1Data ); oldCreateDXGIFactory2 = (WinCreateDXGIFactory2)SetProcAddressDirect( hInst, "CreateDXGIFactory2", (PROC)OVRCreateDXGIFactory2, oldCreateDXGIFactory2Data ); break; case ShimLibD3D9: oldDirectX9Create = (WinDirect3DCreate9)SetProcAddressDirect( hInst, "Direct3DCreate9", (PROC)OVRDirect3DCreate9, oldDirectX9CreateData ); oldDirectX9ExCreate = (WinDirect3DCreate9Ex)SetProcAddressDirect( hInst, "Direct3DCreate9Ex", (PROC)OVRDirect3DCreate9Ex, oldDirectX9ExCreateData ); break; default: break; } for (int j = 0; j < NUM_LOADER_LIBS; ++j) { const char* loaderLibrary = loaderLibraryList[j]; PROC temp = NULL; temp = SetProcAddressA(hInst, loaderLibrary, "LoadLibraryA", (PROC)OVRLoadLibraryA); if (!oldProcA) { oldProcA = (WinLoadLibraryA)temp; } oldLoaderProcA[i][j] = temp; temp = SetProcAddressA(hInst, loaderLibrary, "LoadLibraryW", (PROC)OVRLoadLibraryW); if (!oldProcW) { oldProcW = (WinLoadLibraryW)temp; } oldLoaderProcW[i][j] = temp; temp = SetProcAddressA(hInst, loaderLibrary, "LoadLibraryExA", (PROC)OVRLoadLibraryExA); if (!oldProcExA) { oldProcExA = (WinLoadLibraryExA)temp; } oldLoaderProcExA[i][j] = temp; temp = SetProcAddressA(hInst, loaderLibrary, "LoadLibraryExW", (PROC)OVRLoadLibraryExW); if (!oldProcExW) { oldProcExW = (WinLoadLibraryExW)temp; } oldLoaderProcExW[i][j] = temp; temp = SetProcAddressA(hInst, loaderLibrary, "GetModuleHandleExA", (PROC)OVRGetModuleHandleExA); if (!oldProcModExA) { oldProcModExA = (WinGetModuleHandleExA)temp; } oldLoaderProcModExA[i][j] = temp; temp = SetProcAddressA(hInst, loaderLibrary, "GetModuleHandleExW", (PROC)OVRGetModuleHandleExW); if (!oldProcModExW) { oldProcModExW = (WinGetModuleHandleExW)temp; } oldLoaderProcModExW[i][j] = temp; } if (loadFunc == NULL) { loadFunc = (PreloadLibraryRTFn)GetProcAddress(hInst, "PreloadLibraryRT"); } } rtFilterModule = oldProcA ? (*oldProcA)(RTFilter) : NULL; IsCreatingBackBuffer backBufferFunc = NULL; ShouldVSync shouldVSyncFunc = NULL; GetRTFilterVersion getRTFilterVersionFunc = NULL; if (rtFilterModule != NULL) { loadFunc = (PreloadLibraryRTFn)GetProcAddress(rtFilterModule, "PreloadLibraryRT"); backBufferFunc = (IsCreatingBackBuffer)GetProcAddress(rtFilterModule, "OVRIsCreatingBackBuffer"); shouldVSyncFunc = (ShouldVSync)GetProcAddress(rtFilterModule, "OVRShouldVSync"); getRTFilterVersionFunc = (GetRTFilterVersion)GetProcAddress(rtFilterModule, "OVRGetRTFilterVersion"); } if (loadFunc == NULL) { MessageBox(nullptr, L"Unable to load the Oculus Display Driver. Please reinstall the Oculus Runtime.", L"Configuration Error", MB_OK | MB_ICONERROR); return false; } if (getRTFilterVersionFunc == NULL) { WCHAR message[1000] = {}; swprintf_s(message, L"This app requires the %d.%d.%d version of the Oculus Runtime.", OVR_MAJOR_VERSION, OVR_MINOR_VERSION, OVR_BUILD_VERSION); MessageBox(nullptr, message, L"Configuration Error", MB_OK | MB_ICONERROR); return false; } // Verify that we are running with the appropriate display driver { const ULONG rtFilterVersion = (*getRTFilterVersionFunc)(); const ULONG rtFilterMajor = OVR_GET_VERSION_MAJOR(rtFilterVersion); const ULONG rtFilterMinor = OVR_GET_VERSION_MINOR(rtFilterVersion); if ((rtFilterMajor != OVR_RTFILTER_VERSION_MAJOR) || (rtFilterMinor < OVR_RTFILTER_VERSION_MINOR)) { WCHAR message[1000] = {}; swprintf_s(message, L"This app requires the %d.%d.%d version of the Oculus Runtime.", OVR_MAJOR_VERSION, OVR_MINOR_VERSION, OVR_BUILD_VERSION); MessageBox(nullptr, message, L"Configuration Error", MB_OK | MB_ICONERROR); return false; } } appDriver.version = OVR_RENDER_SHIM_VERSION_MAJOR; appDriver.context = lastContext; // appDriver.pfnInitializingDisplay = OVRIsInitializingDisplay; appDriver.pfnInitializingDisplay = OVRLocalIsInitializingDisplay; appDriver.pfnRiftForContext = OVRRiftForContext; appDriver.pfnCloseRiftForContext = OVRCloseRiftForContext; appDriver.pfnWindowDisplayResolution = OVRWindowDisplayResolution; appDriver.pfnShouldEnableDebug = OVRShouldEnableDebug; appDriver.pfnIsCreatingBackBuffer = (backBufferFunc == NULL) ? OVRIsCreatingBackBuffer : backBufferFunc; appDriver.pfnShouldVSync = (shouldVSyncFunc == NULL) ? OVRShouldVSync : shouldVSyncFunc; appDriver.pfnExpectedResolution = OVRExpectedResolution; appDriver.pfnMirroringEnabled = OVRMirroringEnabled; appDriver.pfnGetWindowForContext = OVRGetWindowForContext; appDriver.pfnPresentRiftOnContext = OVRShouldPresentOnContext; appDriver.pfnDirect3DCreate9 = oldDirectX9Create; appDriver.pfnDirect3DCreate9Ex = oldDirectX9ExCreate; appDriver.pfnCreateDXGIFactory = oldCreateDXGIFactory; appDriver.pfnCreateDXGIFactory1 = oldCreateDXGIFactory1; appDriver.pfnCreateDXGIFactory2 = oldCreateDXGIFactory2; (*loadFunc)( &appDriver ); return true; }