예제 #1
0
// in case either MyCoCreateInstance doesn't call MyCoCreateInstanceEx or MyCoCreateInstance is called and MyCoCreateInstanceEx failed to get hooked
HOOKFUNC HRESULT STDAPICALLTYPE MyCoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID *ppv)
{
	ThreadLocalStuff& curtls = tls;
	curtls.callerisuntrusted++;
	const char* oldName = curtls.curThreadCreateName;
	const char* newName = riidToName(chooseriid(riid,rclsid));
	debuglog(LCF_MODULE, __FUNCTION__ "(0x%X, 0x%X (%s)) called.\n", riid.Data1, rclsid.Data1, newName?newName:"?");
	if(newName)
		curtls.curThreadCreateName = newName;

	HRESULT rv = E_FAIL;

	if(TrySoundCoCreateInstance(riid, ppv))
	{
		rv = S_OK;
	}
	else
	{
		// normal case
		rv = CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv);
		if(SUCCEEDED(rv))
			HookCOMInterface(riid, ppv);
	}
	if(newName)
		curtls.curThreadCreateName = oldName;
	UpdateLoadedOrUnloadedDllHooks();
	curtls.callerisuntrusted--;
	return rv;
}
예제 #2
0
 static HRESULT STDMETHODCALLTYPE MyQueryInterface(IReferenceClock* pThis, REFIID riid, void** ppvObj)
 {
     verbosedebugprintf(__FUNCTION__ "(0x%X) called.\n", riid.Data1);
     HRESULT rv = QueryInterface(pThis, riid, ppvObj);
     if(SUCCEEDED(rv))
         HookCOMInterface(riid, ppvObj);
     return rv;
 }
예제 #3
0
 static HRESULT STDMETHODCALLTYPE MyQueryInterface(IReferenceClock* pThis, REFIID riid, void** ppvObj)
 {
     VERBOSE_LOG() << riid.Data1;
     HRESULT rv = QueryInterface(pThis, riid, ppvObj);
     if (SUCCEEDED(rv))
         HookCOMInterface(riid, ppvObj);
     return rv;
 }
예제 #4
0
	static HRESULT STDMETHODCALLTYPE MyQueryInterface(IDirect3DDeviceN* pThis, REFIID riid, void** ppvObj)
	{
		d3ddebugprintf(__FUNCTION__ "(0x%X) called.\n", pThis);
		HRESULT rv = QueryInterface(pThis, riid, ppvObj);
		if(SUCCEEDED(rv))
			HookCOMInterface(riid, ppvObj);
		return rv;
	}
예제 #5
0
	static HRESULT STDMETHODCALLTYPE MyCreateDevice3(IDirect3DN* pThis, REFCLSID rguid, LPDIRECTDRAWSURFACEN surf, LPDIRECT3DDEVICEN* device, LPUNKNOWN stupidPointlessArgument)
	{
		d3ddebugprintf(__FUNCTION__ " called.\n");
//		FixSurface(surf);
		HRESULT hr = CreateDevice3(pThis, rguid, surf, device, stupidPointlessArgument);
		if(SUCCEEDED(hr))
			HookCOMInterface(MyDirect3D<IDirect3DN>::deviceGuid, (LPVOID*)device);
		return hr;
	}
예제 #6
0
static void PostCoGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID FAR* ppv, HRESULT hr, const char* oldName)
{
	ThreadLocalStuff& curtls = tls;
	curtls.callerisuntrusted--;
	if(SUCCEEDED(hr))
		HookCOMInterface(riid, ppv);
	//if(newName)
		curtls.curThreadCreateName = oldName;
	UpdateLoadedOrUnloadedDllHooks();
}
예제 #7
0
	static HRESULT STDMETHODCALLTYPE MyCreateDevice(IDirect3DN* pThis, REFCLSID rguid, LPDIRECTDRAWSURFACEN surf, LPDIRECT3DDEVICEN* device)
	{
		d3ddebugprintf(__FUNCTION__ "(0x%X, 0x%X?) called.\n", rguid.Data1, MyDirect3D<IDirect3DN>::deviceGuid);
		//HRESULT hr = CreateDevice(pThis, IID_IDirect3DRampDevice, surf, device); // this forces to use a software device
//		FixSurface(surf);
		HRESULT hr = CreateDevice(pThis, rguid, surf, device);
		if(SUCCEEDED(hr))
			HookCOMInterface(MyDirect3D<IDirect3DN>::deviceGuid, (LPVOID*)device);
		else ddrawdebugprintf("CreateDevice failed with hr = 0x%X.\n", hr);
		//cmdprintf("DEBUGPAUSE: B");
		//return -1;
		return hr;
	}
예제 #8
0
	static HRESULT STDMETHODCALLTYPE MyQueryInterface(IDirect3DN* pThis, REFIID riid, void** ppvObj)
	{
		d3ddebugprintf(__FUNCTION__ "(0x%X, 0x%X (0x%X?), 0x%X) called.\n", pThis, riid.Data1, MyDirect3D<IDirect3DN>::curGuid.Data1, ppvObj);
		//if(!ppvObj) { return E_POINTER; }
		//if(riid == IID_IUnknown) { *ppvObj = (IUnknown*)pThis; pThis->AddRef(); return S_OK; }
		//if(IDirect3DTraits<IDirect3DN>::NUMBER == 1 && riid == IID_IDirect3D
		//|| IDirect3DTraits<IDirect3DN>::NUMBER == 2 && riid == IID_IDirect3D2
		//|| IDirect3DTraits<IDirect3DN>::NUMBER == 3 && riid == IID_IDirect3D3
		//|| IDirect3DTraits<IDirect3DN>::NUMBER == 7 && riid == IID_IDirect3D7) { *ppvObj = pThis; pThis->AddRef(); return S_OK; } // ninjah
		HRESULT rv = QueryInterface(pThis, riid, ppvObj);
		if(SUCCEEDED(rv))
			HookCOMInterface(riid, ppvObj);
		return rv;
	}
예제 #9
0
// in case either MyCoCreateInstanceEx is directly instead of from MyCoCreateInstance, or MyCoCreateInstanceEx is called from MyCoCreateInstance but MyCoCreateInstance failed to get hooked
HOOKFUNC HRESULT STDAPICALLTYPE MyCoCreateInstanceEx(REFCLSID Clsid, LPUNKNOWN punkOuter, DWORD dwClsCtx, struct _COSERVERINFO* pServerInfo, DWORD dwCount, struct tagMULTI_QI* pResults)
{
	debuglog(LCF_MODULE, __FUNCTION__ "(clsid=0x%X, dwCount=%d) called.\n", Clsid.Data1, dwCount);

	// check for creating custom objects that skip COM
//	DEFINE_LOCAL_GUID(IID_IUnknown,0x00000000,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
	for(DWORD i = 0; i < dwCount; i++)
	{
		if(TrySoundCoCreateInstance(*pResults[i].pIID, (LPVOID*)&pResults[i].pItf))
		{
			pResults[i].hr = S_OK;
			HRESULT rv = S_OK;
			bool anyok = false;
			for(DWORD j = 0; j < dwCount; j++)
			{
				if(i != j)
				{
					pResults[j].hr = pResults[i].pItf->QueryInterface(*pResults[j].pIID, (LPVOID*)pResults[j].pItf);
					if(FAILED(pResults[j].hr))
						rv = pResults[j].hr;
					else
						anyok = true;
				}
			}
			if(anyok && FAILED(rv))
				rv = CO_S_NOTALLINTERFACES;
			return rv;
		}
	}

	// regular creation
	HRESULT rv = CoCreateInstanceEx(Clsid, punkOuter, dwClsCtx, pServerInfo, dwCount, pResults);
	for(DWORD i = 0; i < dwCount; i++)
		if(SUCCEEDED(pResults[i].hr))
			HookCOMInterface(*pResults[i].pIID, (LPVOID*)&pResults[i].pItf);
	return rv;
}