openDecal/Native/Inject/Attic/Copy of DirectDrawHook.h
erik d1442e3747 Initial commit: Complete open-source Decal rebuild
All 5 phases of the open-source Decal rebuild:

Phase 1: 14 decompiled .NET projects (Interop.*, Adapter, FileService, DecalUtil)
Phase 2: 10 native DLLs rewritten as C# COM servers with matching GUIDs
  - DecalDat, DHS, SpellFilter, DecalInput, DecalNet, DecalFilters
  - Decal.Core, DecalControls, DecalRender, D3DService
Phase 3: C++ shims for Inject.DLL (D3D9 hooking) and LauncherHook.DLL
Phase 4: DenAgent WinForms tray application
Phase 5: WiX installer and build script

25 C# projects building with 0 errors.
Native C++ projects require VS 2022 + Windows SDK (x86).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:27:56 +01:00

277 lines
7.2 KiB
C++

// DirectDrawHook.h : Declaration of the CDirectDrawHook
#ifndef __DIRECTDRAWHOOK_H_
#define __DIRECTDRAWHOOK_H_
#include "resource.h" // main symbols
#include "Direct3DHook.h"
/////////////////////////////////////////////////////////////////////////////
// CDirectDrawHook
class ATL_NO_VTABLE CDirectDrawHook :
public CComObjectRootEx<CComMultiThreadModel>,
public IDirectDraw,
public IDirectDraw2,
public IDirectDraw4,
public IDirect3D,
public IDirect3D2,
public IDirect3D3
{
public:
CDirectDrawHook()
: m_pDevice2( NULL ),
m_pDevice3( NULL ), m_nSurfaceCount( 0 )
{
}
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CDirectDrawHook)
COM_INTERFACE_ENTRY_IID(IID_IDirectDraw, IDirectDraw)
COM_INTERFACE_ENTRY_IID(IID_IDirectDraw2, IDirectDraw2)
COM_INTERFACE_ENTRY_IID(IID_IDirectDraw4, IDirectDraw4)
COM_INTERFACE_ENTRY_IID(IID_IDirect3D, IDirect3D)
COM_INTERFACE_ENTRY_IID(IID_IDirect3D2, IDirect3D2)
COM_INTERFACE_ENTRY_IID(IID_IDirect3D3, IDirect3D3)
END_COM_MAP()
void setObject( IDirectDraw *pDD );
CComPtr< IDirectDraw > m_pDD;
CComPtr< IDirectDraw2 > m_pDD2;
CComPtr< IDirectDraw4 > m_pDD4;
CComPtr< IDirect3D > m_pD3D;
CComPtr< IDirect3D2 > m_pD3D2;
CComPtr< IDirect3D3 > m_pD3D3;
IDirect3DDevice2 *m_pDevice2;
IDirect3DDevice3 *m_pDevice3;
IDirectDrawSurface4 *m_pPrimary;
long m_nSurfaceCount;
public:
// IDirectDraw Methods
STDMETHOD(Compact)()
{
return m_pDD->Compact();
}
STDMETHOD(CreateClipper)(DWORD p1, LPDIRECTDRAWCLIPPER FAR *p2, IUnknown FAR *p3 )
{
return m_pDD->CreateClipper( p1, p2, p3 );
}
STDMETHOD(CreatePalette)(DWORD p1, LPPALETTEENTRY p2, LPDIRECTDRAWPALETTE FAR*p3, IUnknown FAR *p4 )
{
return m_pDD->CreatePalette( p1, p2, p3, p4 );
}
STDMETHOD(CreateSurface)(LPDDSURFACEDESC p1, LPDIRECTDRAWSURFACE FAR *p2, IUnknown FAR *p3 )
{
return m_pDD->CreateSurface( p1, p2, p3 );
}
STDMETHOD(DuplicateSurface)( LPDIRECTDRAWSURFACE p1, LPDIRECTDRAWSURFACE FAR *p2 )
{
return m_pDD->DuplicateSurface( p1, p2 );
}
STDMETHOD(EnumDisplayModes)( DWORD p1, LPDDSURFACEDESC p2, LPVOID p3, LPDDENUMMODESCALLBACK p4 )
{
return m_pDD->EnumDisplayModes( p1, p2, p3, p4 );
}
STDMETHOD(EnumSurfaces)(DWORD p1, LPDDSURFACEDESC p2, LPVOID p3, LPDDENUMSURFACESCALLBACK p4 )
{
return m_pDD->EnumSurfaces( p1, p2, p3, p4 );
}
STDMETHOD(FlipToGDISurface)()
{
return m_pDD4->FlipToGDISurface();
}
STDMETHOD(GetCaps)( LPDDCAPS p1, LPDDCAPS p2 )
{
return m_pDD4->GetCaps( p1, p2 );
}
STDMETHOD(GetDisplayMode)( LPDDSURFACEDESC p1 )
{
return m_pDD->GetDisplayMode( p1 );
}
STDMETHOD(GetFourCCCodes)(LPDWORD p1, LPDWORD p2 )
{
return m_pDD->GetFourCCCodes( p1, p2 );
}
STDMETHOD(GetGDISurface)(LPDIRECTDRAWSURFACE FAR *p1)
{
return m_pDD->GetGDISurface( p1 );
}
STDMETHOD(GetMonitorFrequency)(LPDWORD p1)
{
return m_pDD->GetMonitorFrequency( p1 );
}
STDMETHOD(GetScanLine)(LPDWORD p1)
{
return m_pDD->GetScanLine( p1 );
}
STDMETHOD(GetVerticalBlankStatus)(LPBOOL p1 )
{
return m_pDD->GetVerticalBlankStatus( p1 );
}
STDMETHOD(Initialize)(GUID FAR *p1)
{
return m_pDD->Initialize( p1 );
}
STDMETHOD(RestoreDisplayMode)()
{
return m_pDD->RestoreDisplayMode();
}
STDMETHOD(SetCooperativeLevel)(HWND p1, DWORD p2);
STDMETHOD(SetDisplayMode)(DWORD p1, DWORD p2, DWORD p3);
STDMETHOD(WaitForVerticalBlank)(DWORD p1, HANDLE p2 )
{
return m_pDD->WaitForVerticalBlank( p1, p2 );
}
/*** Added in the v2 interface ***/
STDMETHOD(GetAvailableVidMem)(LPDDSCAPS p1, LPDWORD p2, LPDWORD p3)
{
return m_pDD2->GetAvailableVidMem( p1, p2, p3 );
}
/*** Added in the V4 Interface ***/
STDMETHOD(GetAvailableVidMem)(LPDDSCAPS2 p1, LPDWORD p2, LPDWORD p3)
{
return m_pDD4->GetAvailableVidMem( p1, p2, p3 );
}
STDMETHOD(CreateSurface)(LPDDSURFACEDESC2 p1, LPDIRECTDRAWSURFACE4 FAR *p2, IUnknown FAR *p3);
STDMETHOD(DuplicateSurface)( LPDIRECTDRAWSURFACE4 p1, LPDIRECTDRAWSURFACE4 FAR *p2 )
{
return m_pDD4->DuplicateSurface( p1, p2 );
}
STDMETHOD(EnumDisplayModes)( DWORD p1, LPDDSURFACEDESC2 p2, LPVOID p3, LPDDENUMMODESCALLBACK2 p4 )
{
return m_pDD4->EnumDisplayModes( p1, p2, p3, p4 );
}
STDMETHOD(EnumSurfaces)(DWORD p1, LPDDSURFACEDESC2 p2, LPVOID p3, LPDDENUMSURFACESCALLBACK2 p4 )
{
return m_pDD4->EnumSurfaces( p1, p2, p3, p4 );
}
STDMETHOD(GetDisplayMode)( LPDDSURFACEDESC2 p1 )
{
return m_pDD4->GetDisplayMode( p1 );
}
STDMETHOD(GetGDISurface)(LPDIRECTDRAWSURFACE4 FAR *p1)
{
return m_pDD4->GetGDISurface( p1 );
}
STDMETHOD(GetSurfaceFromDC) (HDC p1, LPDIRECTDRAWSURFACE4 *p2)
{
return m_pDD4->GetSurfaceFromDC( p1, p2 );
}
STDMETHOD(RestoreAllSurfaces)()
{
return m_pDD4->RestoreAllSurfaces();
}
STDMETHOD(TestCooperativeLevel)()
{
return m_pDD4->TestCooperativeLevel();
}
STDMETHOD(GetDeviceIdentifier)(LPDDDEVICEIDENTIFIER p1, DWORD p2 )
{
return m_pDD4->GetDeviceIdentifier( p1, p2 );
}
// Methods for the IDirect3D Interface
STDMETHOD(Initialize)(REFCLSID p1)
{
return m_pD3D->Initialize( p1 );
}
STDMETHOD(EnumDevices)(LPD3DENUMDEVICESCALLBACK p1,LPVOID p2)
{
return m_pD3D->EnumDevices( p1, p2 );
}
STDMETHOD(CreateLight)(LPDIRECT3DLIGHT*p1,IUnknown*p2)
{
return m_pD3D->CreateLight( p1, p2 );
}
STDMETHOD(CreateMaterial)(LPDIRECT3DMATERIAL *p1,IUnknown *p2);
STDMETHOD(CreateViewport)(LPDIRECT3DVIEWPORT*p1,IUnknown*p2)
{
return m_pD3D->CreateViewport( p1, p2 );
}
STDMETHOD(FindDevice)(LPD3DFINDDEVICESEARCH p1,LPD3DFINDDEVICERESULT p2)
{
return m_pD3D->FindDevice( p1, p2 );
}
// Methods for the IDirect3D2 Interface
STDMETHOD(SetDisplayMode)(DWORD p1, DWORD p2, DWORD p3, DWORD p4, DWORD p5);
STDMETHOD(CreateMaterial)(LPDIRECT3DMATERIAL2*p1,IUnknown*p2);
STDMETHOD(CreateViewport)(LPDIRECT3DVIEWPORT2*p1,IUnknown*p2)
{
return m_pD3D2->CreateViewport( p1, p2 );
}
STDMETHOD(CreateDevice)(REFCLSID cls,LPDIRECTDRAWSURFACE pDDS,LPDIRECT3DDEVICE2 *ppD3D);
// Methods for the IDirect3D3 Interface
STDMETHOD(CreateMaterial)(LPDIRECT3DMATERIAL3*p1,LPUNKNOWN p2);
STDMETHOD(CreateViewport)(LPDIRECT3DVIEWPORT3*p1,LPUNKNOWN p2)
{
return m_pD3D3->CreateViewport( p1, p2 );
}
STDMETHOD(CreateDevice)(REFCLSID cls,LPDIRECTDRAWSURFACE4 pDDS,LPDIRECT3DDEVICE3* ppD3D,LPUNKNOWN pUnk);
STDMETHOD(CreateVertexBuffer)(LPD3DVERTEXBUFFERDESC p1,LPDIRECT3DVERTEXBUFFER*p2,DWORD p3,LPUNKNOWN p4)
{
return m_pD3D3->CreateVertexBuffer( p1, p2, p3, p4 );
}
STDMETHOD(EnumZBufferFormats)(REFCLSID p1,LPD3DENUMPIXELFORMATSCALLBACK p2,LPVOID p3)
{
return m_pD3D3->EnumZBufferFormats( p1, p2, p3 );
}
STDMETHOD(EvictManagedTextures)()
{
return m_pD3D3->EvictManagedTextures();
}
};
#endif //__DIRECTDRAWHOOK_H_