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>
This commit is contained in:
erik 2026-02-08 18:27:56 +01:00
commit d1442e3747
1382 changed files with 170725 additions and 0 deletions

251
Native/Inject/RootLayer.cpp Normal file
View file

@ -0,0 +1,251 @@
// RootLayer.cpp : Implementation of cRootLayer
#include "stdafx.h"
#include "Inject.h"
#include "RootLayer.h"
#include "Manager.h"
#include "BarLayer.h"
#include "Panel.h"
#include "View.h"
enum eChildIDs
{
eChildBars,
eChildPanel
};
/////////////////////////////////////////////////////////////////////////////
// cRootLayer
void cRootLayer::addView( cView *pView, ILayer *pRoot )
{
m_views.push_back( pView );
// Next, make the bar entry
m_pBars->AddBar( pView->m_nViewID, &pView->m_VP );
// Last, make the view entry
pView->m_pPanel->AddView( pView->m_nViewID, pRoot );
}
void cRootLayer::removeView( cView *pView )
{
for( cViewList::iterator i = m_views.begin(); i != m_views.end(); ++ i )
{
if( *i == pView )
{
m_views.erase( i );
break;
}
}
}
void cRootLayer::onCreate()
{
LayerParams lpBars = { eChildBars, { 0, 0, 1, 1 }, 0 };
CComObject< cBarLayer > *pBars;
CComObject< cBarLayer >::CreateInstance( &pBars );
m_pBars = pBars;
m_pSite->CreateChild( &lpBars, pBars );
if( m_nViewMode == 0 ) // Single Mode
{
LayerParams lpPanel = { eChildPanel, { 0, 0, 0, 0 }, 0 };
CComObject< cPanel > *pPanel;
CComObject< cPanel >::CreateInstance( &pPanel );
m_pSite->CreateChild( &lpPanel, pPanel );
pPanel->putref_Sink( this );
m_pPanel = pPanel;
}
}
void cRootLayer::onDestroy()
{
m_pBars.Release();
}
STDMETHODIMP cRootLayer::CreateView(ViewParams *pParams, ILayer *pLayer, IView **ppView)
{
// First create the view object
CComObject< cView > *pView;
CComObject< cView >::CreateInstance( &pView );
if( m_nViewMode == 1 ) // Multi Mode
{
LayerParams lpPanel = { m_nNextViewID, { 0, 0, 0, 0 }, 0 };
CComObject< cPanel > *pPanel;
CComObject< cPanel >::CreateInstance( &pPanel );
m_pSite->CreateChild( &lpPanel, pPanel );
pPanel->putref_Sink( this );
pView->m_pPanel = pPanel;
}
else
pView->m_pPanel = m_pPanel;
pView->m_pRoot = this;
pView->m_nViewID = m_nNextViewID ++;
pView->m_VP.label = _bstr_t(pParams->label).copy();
pView->m_VP.icon = pParams->icon;
pView->m_VP.iconLibrary = pParams->iconLibrary;
pView->m_VP.left = pParams->left;
pView->m_VP.top = pParams->top;
pView->m_VP.width = pParams->width;
pView->m_VP.height = pParams->height;
addView( pView, pLayer );
*ppView = pView;
pView->AddRef();
return S_OK;
}
STDMETHODIMP cRootLayer::SelectBar(long nID)
{
// We are given the Bar ID, find the matching view
for( cViewList::iterator i = m_views.begin(); i != m_views.end(); ++ i )
{
if( ( *i )->m_nViewID == nID )
{
long nPrevActive;
( *i )->m_pPanel->get_ActiveView( &nPrevActive );
if( nPrevActive != nID )
{
( *i )->m_pPanel->ActivateView( ( *i )->m_nViewID, & (*i)->m_VP, (long*)(*i));
( *i )->Fire_Activate();
( *i )->m_bActivated = true;
}
else
{
( *i )->Deactivate();
( *i )->m_bActivated = false;
}
return S_OK;
}
}
// Invalid return value
return E_INVALIDARG;
}
STDMETHODIMP cRootLayer::LoadView(BSTR strXML, IView **ppView)
{
CComObject< cView > *pView;
CComObject< cView >::CreateInstance( &pView );
if( m_nViewMode == 1 ) // Multi Mode
{
LayerParams lpPanel = { m_nNextViewID, { 0, 0, 0, 0 }, 0 };
CComObject< cPanel > *pPanel;
CComObject< cPanel >::CreateInstance( &pPanel );
m_pSite->CreateChild( &lpPanel, pPanel );
pPanel->putref_Sink( this );
pView->m_pPanel = pPanel;
pPanel->put_Params( &pView->m_VP );
}
else
{
pView->m_pPanel = m_pPanel;
m_pPanel->put_Params( &pView->m_VP );
}
CComPtr< IUnknown > pRootControl;
pView->m_pRoot = this;
pView->m_nViewID = m_nNextViewID ++;
long lViewFlags = pView->loadSchema( strXML, &pRootControl );
if( pRootControl.p )
{
m_views.push_back( pView );
*ppView = pView;
pView->AddRef();
// Next, make the bar entry
m_pBars->AddBar( pView->m_nViewID, &pView->m_VP );
// Last, create all the controls
pView->m_pPanel->LoadViewEx( pView->m_nViewID, pView, pRootControl, lViewFlags );
if( cManager::_p->m_bXMLViewViewer )
{
pView->m_VP.top = 24;
pView->Activate( );
}
}
else
{
pView->Release( );
*ppView = NULL;
return E_FAIL;
}
return S_OK;
}
STDMETHODIMP cRootLayer::PanelDeactivate(long nViewID)
{
// Find the view of our desires and fire it's hide message
for( cViewList::iterator i = m_views.begin(); i != m_views.end(); ++ i )
{
if( ( *i )->m_nViewID == nViewID )
( *i )->Fire_Deactivate(),( *i )->m_bActivated = false;
}
return S_OK;
}
STDMETHODIMP cRootLayer::LoadViewObject(IUnknown *pSchema, IView **ppView)
{
CComObject< cView > *pView;
CComObject< cView >::CreateInstance( &pView );
if( m_nViewMode == 1 ) // Multi Mode
{
LayerParams lpPanel = { m_nNextViewID, { 0, 0, 0, 0 }, 0 };
CComObject< cPanel > *pPanel;
CComObject< cPanel >::CreateInstance( &pPanel );
m_pSite->CreateChild( &lpPanel, pPanel );
pPanel->putref_Sink( this );
pView->m_pPanel = pPanel;
}
else
pView->m_pPanel = m_pPanel;
CComPtr< IUnknown > pRootControl;
pView->m_pRoot = this;
pView->m_nViewID = m_nNextViewID ++;
pView->loadSchemaObject( pSchema, &pRootControl );
m_views.push_back( pView );
*ppView = pView;
pView->AddRef();
// Next, make the bar entry
m_pBars->AddBar( pView->m_nViewID, &pView->m_VP );
// Last, create all the controls
pView->m_pPanel->LoadView( pView->m_nViewID, pView, pRootControl );
return S_OK;
}