diff --git a/reactos/dll/directx/ddraw/Surface/surface_main.c b/reactos/dll/directx/ddraw/Surface/surface_main.c index 709c6b34af1..aac3fc22a5b 100644 --- a/reactos/dll/directx/ddraw/Surface/surface_main.c +++ b/reactos/dll/directx/ddraw/Surface/surface_main.c @@ -59,14 +59,13 @@ ULONG WINAPI Main_DDrawSurface_AddRef(LPDDRAWI_DDRAWSURFACE_INT iface) } HRESULT WINAPI -Main_DDrawSurface_QueryInterface(LPDDRAWI_DDRAWSURFACE_INT iface, REFIID riid, - LPVOID* ppObj) +Main_DDrawSurface_QueryInterface(LPDDRAWI_DDRAWSURFACE_INT This, REFIID riid, LPVOID* ppObj) { - LPDDRAWI_DDRAWSURFACE_INT This = (LPDDRAWI_DDRAWSURFACE_INT)iface; DX_WINDBG_trace(); HRESULT retVal = DD_OK; *ppObj = NULL; + _SEH_TRY { if (IsEqualGUID(&IID_IDirectDrawSurface7, riid)) @@ -144,6 +143,51 @@ Main_DDrawSurface_QueryInterface(LPDDRAWI_DDRAWSURFACE_INT iface, REFIID riid, *ppObj = This; Main_DDrawSurface_AddRef(This); } + else if (IsEqualGUID(&IID_IDirectDrawColorControl, riid)) + { + if (This->lpVtbl != &DirectDrawSurface_Vtable) + { + This = internal_directdrawsurface_int_alloc(This); + if (!This) + { + retVal = DDERR_OUTOFVIDEOMEMORY; + _SEH_LEAVE; + } + } + This->lpVtbl = &DirectDrawColorControl_Vtable; + *ppObj = This; + Main_DDrawSurface_AddRef(This); + } + else if (IsEqualGUID(&IID_IDirectDrawGammaControl, riid)) + { + if (This->lpVtbl != &DirectDrawSurface_Vtable) + { + This = internal_directdrawsurface_int_alloc(This); + if (!This) + { + retVal = DDERR_OUTOFVIDEOMEMORY; + _SEH_LEAVE; + } + } + This->lpVtbl = &DirectDrawGammaControl_Vtable; + *ppObj = This; + Main_DDrawSurface_AddRef(This); + } + else if (IsEqualGUID(&IID_IDirectDrawSurfaceKernel, riid)) + { + if (This->lpVtbl != &DirectDrawSurface_Vtable) + { + This = internal_directdrawsurface_int_alloc(This); + if (!This) + { + retVal = DDERR_OUTOFVIDEOMEMORY; + _SEH_LEAVE; + } + } + This->lpVtbl = &DirectDrawSurfaceKernel_Vtable; + *ppObj = This; + Main_DDrawSurface_AddRef(This); + } else { DX_STUB_str("E_NOINTERFACE");