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>
371 lines
9.7 KiB
C++
371 lines
9.7 KiB
C++
// Direct3DHook.h : Declaration of the CDirect3DHook
|
|
|
|
#ifndef __DIRECT3DHOOK_H_
|
|
#define __DIRECT3DHOOK_H_
|
|
|
|
#include "resource.h" // main symbols
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CDirect3DHook
|
|
class ATL_NO_VTABLE CDirect3DHook :
|
|
public CComObjectRootEx<CComMultiThreadModel>,
|
|
public IDirect3DDevice,
|
|
public IDirect3DDevice2,
|
|
public IDirect3DDevice3
|
|
{
|
|
public:
|
|
CDirect3DHook()
|
|
{
|
|
}
|
|
|
|
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
|
|
|
BEGIN_COM_MAP(CDirect3DHook)
|
|
COM_INTERFACE_ENTRY_IID( IID_IDirect3DDevice, IDirect3DDevice )
|
|
COM_INTERFACE_ENTRY_IID( IID_IDirect3DDevice2, IDirect3DDevice2 )
|
|
COM_INTERFACE_ENTRY_IID( IID_IDirect3DDevice3, IDirect3DDevice3 )
|
|
END_COM_MAP()
|
|
|
|
CComPtr< IDirect3DDevice > m_pDevice;
|
|
CComPtr< IDirect3DDevice2 > m_pDevice2;
|
|
CComPtr< IDirect3DDevice3 > m_pDevice3;
|
|
|
|
void setObject( IUnknown *pDevice );
|
|
|
|
// IDirect3DHook
|
|
public:
|
|
// Functions from IDirect3DDevice
|
|
|
|
STDMETHOD(Initialize)(LPDIRECT3D p1,LPGUID p2,LPD3DDEVICEDESC p3)
|
|
{
|
|
return m_pDevice->Initialize( p1, p2, p3 );
|
|
}
|
|
|
|
STDMETHOD(GetCaps)(LPD3DDEVICEDESC p1,LPD3DDEVICEDESC p2)
|
|
{
|
|
return m_pDevice->GetCaps( p1, p2 );
|
|
}
|
|
|
|
STDMETHOD(SwapTextureHandles)(LPDIRECT3DTEXTURE p1,LPDIRECT3DTEXTURE p2)
|
|
{
|
|
return m_pDevice->SwapTextureHandles( p1, p2 );
|
|
}
|
|
|
|
STDMETHOD(CreateExecuteBuffer)(LPD3DEXECUTEBUFFERDESC p1,LPDIRECT3DEXECUTEBUFFER*p2,IUnknown*p3)
|
|
{
|
|
return m_pDevice->CreateExecuteBuffer( p1, p2, p3 );
|
|
}
|
|
|
|
STDMETHOD(GetStats)(LPD3DSTATS p1)
|
|
{
|
|
return m_pDevice->GetStats( p1 );
|
|
}
|
|
|
|
STDMETHOD(Execute)(LPDIRECT3DEXECUTEBUFFER p1,LPDIRECT3DVIEWPORT p2,DWORD p3)
|
|
{
|
|
return m_pDevice->Execute( p1, p2, p3 );
|
|
}
|
|
|
|
STDMETHOD(AddViewport)(LPDIRECT3DVIEWPORT p1)
|
|
{
|
|
return m_pDevice->AddViewport( p1 );
|
|
}
|
|
|
|
STDMETHOD(DeleteViewport)(LPDIRECT3DVIEWPORT p1)
|
|
{
|
|
return m_pDevice->DeleteViewport( p1 );
|
|
}
|
|
|
|
STDMETHOD(NextViewport)(LPDIRECT3DVIEWPORT p1,LPDIRECT3DVIEWPORT*p2,DWORD p3)
|
|
{
|
|
return m_pDevice->NextViewport( p1, p2, p3 );
|
|
}
|
|
|
|
STDMETHOD(Pick)(LPDIRECT3DEXECUTEBUFFER p1,LPDIRECT3DVIEWPORT p2,DWORD p3,LPD3DRECT p4)
|
|
{
|
|
return m_pDevice->Pick( p1, p2, p3, p4 );
|
|
}
|
|
|
|
STDMETHOD(GetPickRecords)(LPDWORD p1,LPD3DPICKRECORD p2)
|
|
{
|
|
return m_pDevice->GetPickRecords( p1, p2 );
|
|
}
|
|
|
|
STDMETHOD(EnumTextureFormats)(LPD3DENUMTEXTUREFORMATSCALLBACK p1,LPVOID p2)
|
|
{
|
|
return m_pDevice->EnumTextureFormats( p1, p2 );
|
|
}
|
|
|
|
STDMETHOD(CreateMatrix)(LPD3DMATRIXHANDLE p1)
|
|
{
|
|
return m_pDevice->CreateMatrix( p1 );
|
|
}
|
|
|
|
STDMETHOD(SetMatrix)(D3DMATRIXHANDLE p1,const LPD3DMATRIX p2)
|
|
{
|
|
return m_pDevice->SetMatrix( p1, p2 );
|
|
}
|
|
|
|
STDMETHOD(GetMatrix)(D3DMATRIXHANDLE p1,LPD3DMATRIX p2)
|
|
{
|
|
return m_pDevice->GetMatrix( p1, p2 );
|
|
}
|
|
|
|
STDMETHOD(DeleteMatrix)(D3DMATRIXHANDLE p1)
|
|
{
|
|
return m_pDevice->DeleteMatrix( p1 );
|
|
}
|
|
|
|
STDMETHOD(BeginScene)();
|
|
|
|
STDMETHOD(EndScene)();
|
|
|
|
STDMETHOD(GetDirect3D)(LPDIRECT3D*p1)
|
|
{
|
|
return m_pDevice->GetDirect3D( p1 );
|
|
}
|
|
|
|
// Functions from IDirect3DDevice2
|
|
STDMETHOD(SwapTextureHandles)(LPDIRECT3DTEXTURE2 p1,LPDIRECT3DTEXTURE2 p2)
|
|
{
|
|
return m_pDevice2->SwapTextureHandles( p1, p2 );
|
|
}
|
|
|
|
STDMETHOD(AddViewport)(LPDIRECT3DVIEWPORT2 p1)
|
|
{
|
|
return m_pDevice2->AddViewport( p1 );
|
|
}
|
|
|
|
STDMETHOD(DeleteViewport)(LPDIRECT3DVIEWPORT2 p1)
|
|
{
|
|
return m_pDevice2->DeleteViewport( p1 );
|
|
}
|
|
|
|
STDMETHOD(NextViewport)(LPDIRECT3DVIEWPORT2 p1,LPDIRECT3DVIEWPORT2*p2,DWORD p3)
|
|
{
|
|
return m_pDevice2->NextViewport( p1, p2, p3 );
|
|
}
|
|
|
|
STDMETHOD(GetDirect3D)(LPDIRECT3D2*p1)
|
|
{
|
|
return m_pDevice2->GetDirect3D( p1 );
|
|
}
|
|
|
|
STDMETHOD(SetCurrentViewport)(LPDIRECT3DVIEWPORT2 p1)
|
|
{
|
|
return m_pDevice2->SetCurrentViewport( p1 );
|
|
}
|
|
|
|
STDMETHOD(GetCurrentViewport)(LPDIRECT3DVIEWPORT2 *p1)
|
|
{
|
|
return m_pDevice2->GetCurrentViewport( p1 );
|
|
}
|
|
|
|
STDMETHOD(SetRenderTarget)(LPDIRECTDRAWSURFACE p1,DWORD p2)
|
|
{
|
|
return m_pDevice2->SetRenderTarget( p1, p2 );
|
|
}
|
|
|
|
STDMETHOD(GetRenderTarget)(LPDIRECTDRAWSURFACE *p1)
|
|
{
|
|
return m_pDevice2->GetRenderTarget( p1 );
|
|
}
|
|
|
|
STDMETHOD(Begin)(D3DPRIMITIVETYPE p1,D3DVERTEXTYPE p2,DWORD p3)
|
|
{
|
|
return m_pDevice2->Begin( p1, p2, p3 );
|
|
}
|
|
|
|
STDMETHOD(BeginIndexed)(D3DPRIMITIVETYPE p1,D3DVERTEXTYPE p2,LPVOID p3,DWORD p4,DWORD p5)
|
|
{
|
|
return m_pDevice2->BeginIndexed( p1, p2, p3, p4, p5 );
|
|
}
|
|
|
|
STDMETHOD(Vertex)(LPVOID p1)
|
|
{
|
|
return m_pDevice2->Vertex( p1 );
|
|
}
|
|
|
|
STDMETHOD(Index)(WORD p1)
|
|
{
|
|
return m_pDevice2->Index( p1 );
|
|
}
|
|
|
|
STDMETHOD(End)(DWORD p1)
|
|
{
|
|
return m_pDevice2->End( p1 );
|
|
}
|
|
|
|
STDMETHOD(GetRenderState)(D3DRENDERSTATETYPE p1,LPDWORD p2)
|
|
{
|
|
return m_pDevice2->GetRenderState( p1, p2 );
|
|
}
|
|
|
|
STDMETHOD(SetRenderState)(D3DRENDERSTATETYPE p1,DWORD p2)
|
|
{
|
|
return m_pDevice2->SetRenderState( p1, p2 );
|
|
}
|
|
|
|
STDMETHOD(GetLightState)(D3DLIGHTSTATETYPE p1,LPDWORD p2)
|
|
{
|
|
return m_pDevice2->GetLightState( p1, p2 );
|
|
}
|
|
|
|
STDMETHOD(SetLightState)(D3DLIGHTSTATETYPE p1,DWORD p2)
|
|
{
|
|
return m_pDevice2->SetLightState( p1, p2 );
|
|
}
|
|
|
|
STDMETHOD(SetTransform)(D3DTRANSFORMSTATETYPE p1,LPD3DMATRIX p2)
|
|
{
|
|
return m_pDevice2->SetTransform( p1, p2 );
|
|
}
|
|
|
|
STDMETHOD(GetTransform)(D3DTRANSFORMSTATETYPE p1,LPD3DMATRIX p2)
|
|
{
|
|
return m_pDevice2->GetTransform( p1, p2 );
|
|
}
|
|
|
|
STDMETHOD(MultiplyTransform)(D3DTRANSFORMSTATETYPE p1,LPD3DMATRIX p2)
|
|
{
|
|
return m_pDevice2->MultiplyTransform( p1, p2 );
|
|
}
|
|
|
|
STDMETHOD(DrawPrimitive)(D3DPRIMITIVETYPE p1,D3DVERTEXTYPE p2,LPVOID p3,DWORD p4,DWORD p5)
|
|
{
|
|
return m_pDevice2->DrawPrimitive( p1, p2, p3, p4, p5 );
|
|
}
|
|
|
|
STDMETHOD(DrawIndexedPrimitive)(D3DPRIMITIVETYPE p1,D3DVERTEXTYPE p2,LPVOID p3,DWORD p4,LPWORD p5, DWORD p6, DWORD p7)
|
|
{
|
|
return m_pDevice2->DrawIndexedPrimitive( p1, p2, p3, p4, p5, p6, p7 );
|
|
}
|
|
|
|
STDMETHOD(SetClipStatus)(LPD3DCLIPSTATUS p1)
|
|
{
|
|
return m_pDevice2->SetClipStatus( p1 );
|
|
}
|
|
|
|
STDMETHOD(GetClipStatus)(LPD3DCLIPSTATUS p1)
|
|
{
|
|
return m_pDevice2->GetClipStatus( p1 );
|
|
}
|
|
|
|
// Functions from IDirect3DDevice3
|
|
STDMETHOD(AddViewport)(LPDIRECT3DVIEWPORT3 p1)
|
|
{
|
|
return m_pDevice3->AddViewport( p1 );
|
|
}
|
|
|
|
STDMETHOD(DeleteViewport)(LPDIRECT3DVIEWPORT3 p1)
|
|
{
|
|
return m_pDevice3->DeleteViewport( p1 );
|
|
}
|
|
|
|
STDMETHOD(NextViewport)(LPDIRECT3DVIEWPORT3 p1,LPDIRECT3DVIEWPORT3*p2,DWORD p3)
|
|
{
|
|
return m_pDevice3->NextViewport( p1, p2, p3 );
|
|
}
|
|
|
|
STDMETHOD(EnumTextureFormats)(LPD3DENUMPIXELFORMATSCALLBACK p1,LPVOID p2)
|
|
{
|
|
return m_pDevice3->EnumTextureFormats( p1, p2 );
|
|
}
|
|
|
|
STDMETHOD(GetDirect3D)(LPDIRECT3D3* p1)
|
|
{
|
|
return m_pDevice3->GetDirect3D( p1 );
|
|
}
|
|
|
|
STDMETHOD(SetCurrentViewport)(LPDIRECT3DVIEWPORT3 p1)
|
|
{
|
|
return m_pDevice3->SetCurrentViewport( p1 );
|
|
}
|
|
|
|
STDMETHOD(GetCurrentViewport)(LPDIRECT3DVIEWPORT3 *p1)
|
|
{
|
|
return m_pDevice3->GetCurrentViewport( p1 );
|
|
}
|
|
|
|
STDMETHOD(SetRenderTarget)(LPDIRECTDRAWSURFACE4 p1,DWORD p2)
|
|
{
|
|
return m_pDevice3->SetRenderTarget( p1, p2 );
|
|
}
|
|
|
|
STDMETHOD(GetRenderTarget)(LPDIRECTDRAWSURFACE4 *p1)
|
|
{
|
|
return m_pDevice3->GetRenderTarget( p1 );
|
|
}
|
|
|
|
STDMETHOD(Begin)(D3DPRIMITIVETYPE p1,DWORD p2,DWORD p3)
|
|
{
|
|
return m_pDevice3->Begin( p1, p2, p3 );
|
|
}
|
|
|
|
STDMETHOD(BeginIndexed)(D3DPRIMITIVETYPE p1,DWORD p2,LPVOID p3,DWORD p4,DWORD p5)
|
|
{
|
|
return m_pDevice3->BeginIndexed( p1, p2, p3, p4, p5 );
|
|
}
|
|
|
|
STDMETHOD(DrawPrimitive)(D3DPRIMITIVETYPE p1,DWORD p2,LPVOID p3,DWORD p4,DWORD p5)
|
|
{
|
|
return m_pDevice3->DrawPrimitive( p1, p2, p3, p4, p5 );
|
|
}
|
|
|
|
STDMETHOD(DrawIndexedPrimitive)(D3DPRIMITIVETYPE p1,DWORD p2,LPVOID p3,DWORD p4,LPWORD p5,DWORD p6,DWORD p7)
|
|
{
|
|
return m_pDevice3->DrawIndexedPrimitive( p1, p2, p3, p4, p5, p6, p7 );
|
|
}
|
|
|
|
STDMETHOD(DrawPrimitiveStrided)(D3DPRIMITIVETYPE p1,DWORD p2,LPD3DDRAWPRIMITIVESTRIDEDDATA p3,DWORD p4,DWORD p5)
|
|
{
|
|
return m_pDevice3->DrawPrimitiveStrided( p1, p2, p3, p4, p5 );
|
|
}
|
|
|
|
STDMETHOD(DrawIndexedPrimitiveStrided)(D3DPRIMITIVETYPE p1,DWORD p2,LPD3DDRAWPRIMITIVESTRIDEDDATA p3,DWORD p4 ,LPWORD p5,DWORD p6,DWORD p7)
|
|
{
|
|
return m_pDevice3->DrawIndexedPrimitiveStrided( p1, p2, p3, p4, p5, p6, p7 );
|
|
}
|
|
|
|
STDMETHOD(DrawPrimitiveVB)(D3DPRIMITIVETYPE p1,LPDIRECT3DVERTEXBUFFER p2,DWORD p3,DWORD p4,DWORD p5)
|
|
{
|
|
return m_pDevice3->DrawPrimitiveVB( p1, p2, p3, p4, p5 );
|
|
}
|
|
|
|
STDMETHOD(DrawIndexedPrimitiveVB)(D3DPRIMITIVETYPE p1,LPDIRECT3DVERTEXBUFFER p2,LPWORD p3,DWORD p4,DWORD p5)
|
|
{
|
|
return m_pDevice3->DrawIndexedPrimitiveVB( p1, p2, p3, p4, p5 );
|
|
}
|
|
|
|
STDMETHOD(ComputeSphereVisibility)(LPD3DVECTOR p1,LPD3DVALUE p2,DWORD p3,DWORD p4,LPDWORD p5)
|
|
{
|
|
return m_pDevice3->ComputeSphereVisibility( p1, p2, p3, p4, p5 );
|
|
}
|
|
|
|
STDMETHOD(GetTexture)(DWORD p1,LPDIRECT3DTEXTURE2 *p2)
|
|
{
|
|
return m_pDevice3->GetTexture( p1, p2 );
|
|
}
|
|
|
|
STDMETHOD(SetTexture)(DWORD p1,LPDIRECT3DTEXTURE2 p2)
|
|
{
|
|
return m_pDevice3->SetTexture( p1, p2 );
|
|
}
|
|
|
|
STDMETHOD(GetTextureStageState)(DWORD p1,D3DTEXTURESTAGESTATETYPE p2,LPDWORD p3)
|
|
{
|
|
return m_pDevice3->GetTextureStageState( p1, p2, p3 );
|
|
}
|
|
|
|
STDMETHOD(SetTextureStageState)(DWORD p1,D3DTEXTURESTAGESTATETYPE p2,DWORD p3)
|
|
{
|
|
return m_pDevice3->SetTextureStageState( p1, p2, p3 );
|
|
}
|
|
|
|
STDMETHOD(ValidateDevice)(LPDWORD p1)
|
|
{
|
|
return m_pDevice3->ValidateDevice( p1 );
|
|
}
|
|
};
|
|
|
|
#endif //__DIRECT3DHOOK_H_
|