/// This function is called by the Mumble client in Mumble's scope /// mainly to extract the offsets of various functions in the IDXGISwapChain /// and IDXGIObject interfaces that need to be hooked in target /// applications. The data is stored in the dxgi shared memory structure. extern "C" __declspec(dllexport) void __cdecl PrepareDXGI() { if (! dxgi) return; ods("DXGI: Preparing static data for DXGI Injection"); dxgi->wcFileName[0] = 0; dxgi->offsetPresent = 0; dxgi->offsetResize = 0; // Make sure this is Vista or greater as quite a number of <=WinXP users have fake DX10 libs installed OSVERSIONINFOEXW ovi; memset(&ovi, 0, sizeof(ovi)); ovi.dwOSVersionInfoSize = sizeof(ovi); GetVersionExW(reinterpret_cast<OSVERSIONINFOW *>(&ovi)); if (ovi.dwMajorVersion < 6 || (ovi.dwMajorVersion == 6 && ovi.dwBuildNumber < 6001)) { ods("DXGI: No DXGI pre-Vista - skipping prepare"); return; } HMODULE hDXGI = LoadLibrary("DXGI.DLL"); if (hDXGI != NULL) { GetModuleFileNameW(hDXGI, dxgi->wcFileName, ARRAY_NUM_ELEMENTS(dxgi->wcFileName)); CreateDXGIFactory1Type pCreateDXGIFactory1 = reinterpret_cast<CreateDXGIFactory1Type>(GetProcAddress(hDXGI, "CreateDXGIFactory1")); ods("DXGI: Got CreateDXGIFactory1 at %p", pCreateDXGIFactory1); if (pCreateDXGIFactory1) { IDXGIFactory1 * pFactory; HRESULT hr = pCreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)(&pFactory)); if (FAILED(hr)) ods("DXGI: Call to pCreateDXGIFactory1 failed!"); if (pFactory) { IDXGIAdapter1 *pAdapter = NULL; pFactory->EnumAdapters1(0, &pAdapter); /// Offsets have to be identified and initialized only once. bool initializeDXGIData = !dxgi->offsetPresent && !dxgi->offsetResize; PrepareDXGI10(pAdapter, initializeDXGIData); initializeDXGIData = !dxgi->offsetPresent && !dxgi->offsetResize; PrepareDXGI11(pAdapter, initializeDXGIData); pFactory->Release(); } else { FreeLibrary(hDXGI); } } else { FreeLibrary(hDXGI); } } else { FreeLibrary(hDXGI); } }
static void test_create_factory(void) { IDXGIFactory1 *factory; IUnknown *iface; HRESULT hr; iface = (void *)0xdeadbeef; hr = CreateDXGIFactory(&IID_IDXGIDevice, (void **)&iface); ok(hr == E_NOINTERFACE, "Got unexpected hr %#x.\n", hr); ok(!iface, "Got unexpected iface %p.\n", iface); hr = CreateDXGIFactory(&IID_IUnknown, (void **)&iface); ok(SUCCEEDED(hr), "Failed to create factory with IID_IUnknown, hr %#x.\n", hr); IUnknown_Release(iface); hr = CreateDXGIFactory(&IID_IDXGIObject, (void **)&iface); ok(SUCCEEDED(hr), "Failed to create factory with IID_IDXGIObject, hr %#x.\n", hr); IUnknown_Release(iface); factory = (void *)0xdeadbeef; hr = CreateDXGIFactory(&IID_IDXGIFactory, (void **)&iface); ok(SUCCEEDED(hr), "Failed to create factory with IID_IDXGIFactory, hr %#x.\n", hr); hr = IUnknown_QueryInterface(iface, &IID_IDXGIFactory1, (void **)&factory); ok(hr == E_NOINTERFACE, "Got unexpected hr %#x.\n", hr); ok(!factory, "Got unexpected factory %p.\n", factory); IUnknown_Release(iface); iface = (void *)0xdeadbeef; hr = CreateDXGIFactory(&IID_IDXGIFactory1, (void **)&iface); ok(hr == E_NOINTERFACE, "Got unexpected hr %#x.\n", hr); ok(!iface, "Got unexpected iface %p.\n", iface); if (!pCreateDXGIFactory1) { win_skip("CreateDXGIFactory1 not available, skipping tests.\n"); return; } iface = (void *)0xdeadbeef; hr = pCreateDXGIFactory1(&IID_IDXGIDevice, (void **)&iface); ok(hr == E_NOINTERFACE, "Got unexpected hr %#x.\n", hr); ok(!iface, "Got unexpected iface %p.\n", iface); hr = pCreateDXGIFactory1(&IID_IUnknown, (void **)&iface); ok(SUCCEEDED(hr), "Failed to create factory with IID_IUnknown, hr %#x.\n", hr); IUnknown_Release(iface); hr = pCreateDXGIFactory1(&IID_IDXGIObject, (void **)&iface); ok(SUCCEEDED(hr), "Failed to create factory with IID_IDXGIObject, hr %#x.\n", hr); IUnknown_Release(iface); hr = pCreateDXGIFactory1(&IID_IDXGIFactory, (void **)&iface); ok(SUCCEEDED(hr), "Failed to create factory with IID_IDXGIFactory, hr %#x.\n", hr); hr = IUnknown_QueryInterface(iface, &IID_IDXGIFactory1, (void **)&factory); ok(SUCCEEDED(hr), "Failed to query IDXGIFactory1 interface, hr %#x.\n", hr); IDXGIFactory1_Release(factory); IUnknown_Release(iface); hr = pCreateDXGIFactory1(&IID_IDXGIFactory1, (void **)&iface); ok(SUCCEEDED(hr), "Failed to create factory with IID_IDXGIFactory1, hr %#x.\n", hr); IUnknown_Release(iface); }