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

View file

@ -0,0 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<AssemblyName>Decal.Interop.DHS</AssemblyName>
</PropertyGroup>
</Project>

View file

@ -0,0 +1,10 @@
using System.Runtime.InteropServices;
namespace Decal.Interop.DHS;
[ComImport]
[Guid("81B629ED-6204-4411-80E3-95CD65E40621")]
[CoClass(typeof(HotkeyClass))]
public interface Hotkey : IHotkey
{
}

View file

@ -0,0 +1,89 @@
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
namespace Decal.Interop.DHS;
[ComImport]
[ClassInterface(ClassInterfaceType.None)]
[SuppressUnmanagedCodeSecurity]
[TypeLibType(2)]
[Guid("F5AA853D-CCF3-4562-A654-3A68AB583BCC")]
public class HotkeyClass : IHotkey, Hotkey
{
[DispId(1)]
public virtual extern string EventTitle
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(1)]
[return: MarshalAs(UnmanagedType.BStr)]
get;
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(1)]
[param: In]
[param: MarshalAs(UnmanagedType.BStr)]
set;
}
[DispId(2)]
public virtual extern string EventDescription
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(2)]
[return: MarshalAs(UnmanagedType.BStr)]
get;
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(2)]
[param: In]
[param: MarshalAs(UnmanagedType.BStr)]
set;
}
[DispId(3)]
public virtual extern bool AltState
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(3)]
get;
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(3)]
[param: In]
set;
}
[DispId(4)]
public virtual extern bool ControlState
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(4)]
get;
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(4)]
[param: In]
set;
}
[DispId(5)]
public virtual extern bool ShiftState
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(5)]
get;
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(5)]
[param: In]
set;
}
[DispId(6)]
public virtual extern int VirtualKey
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(6)]
get;
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(6)]
[param: In]
set;
}
}

View file

@ -0,0 +1,10 @@
using System.Runtime.InteropServices;
namespace Decal.Interop.DHS;
[ComImport]
[CoClass(typeof(HotkeySystemClass))]
[Guid("85C12F39-FD37-4E70-982A-3973FA6D376B")]
public interface HotkeySystem : IHotkeySystem, _IHotkeySystemEvents_Event
{
}

View file

@ -0,0 +1,37 @@
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
namespace Decal.Interop.DHS;
[ComImport]
[TypeLibType(2)]
[SuppressUnmanagedCodeSecurity]
[Guid("6B6B9FA8-37DE-4FA3-8C60-52BD6A2F9855")]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces("Decal.Interop.DHS._IHotkeySystemEvents\0\0")]
public class HotkeySystemClass : IHotkeySystem, HotkeySystem, _IHotkeySystemEvents_Event
{
public virtual extern event _IHotkeySystemEvents_HotkeyEventEventHandler HotkeyEvent;
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(1)]
public virtual extern void AddHotkey([In][MarshalAs(UnmanagedType.BStr)] string szPlugin, [In][MarshalAs(UnmanagedType.Interface)] Hotkey pHotkey);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(2)]
public virtual extern bool QueryHotkey([In][MarshalAs(UnmanagedType.BStr)] string bstrTitle);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(3)]
public virtual extern void Connect([In][MarshalAs(UnmanagedType.IUnknown)] object pPlugin);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(4)]
public virtual extern void DeleteHotkey([In][MarshalAs(UnmanagedType.BStr)] string szPluginCookie, [In][MarshalAs(UnmanagedType.BStr)] string szHotkeyName);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(5)]
[return: MarshalAs(UnmanagedType.Interface)]
public virtual extern Hotkey QueryHotkeyEx([In][MarshalAs(UnmanagedType.BStr)] string szPluginCookie, [In][MarshalAs(UnmanagedType.BStr)] string szTitle);
}

View file

@ -0,0 +1,15 @@
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
namespace Decal.Interop.DHS;
[ComImport]
[Guid("2D51CD98-7DE3-4BBA-A482-5409A18192DB")]
[SuppressUnmanagedCodeSecurity]
[InterfaceType(1)]
public interface IDHSHotkeyEvents
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
bool OnHotkey([In][MarshalAs(UnmanagedType.BStr)] string szEvent);
}

View file

@ -0,0 +1,88 @@
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
namespace Decal.Interop.DHS;
[ComImport]
[SuppressUnmanagedCodeSecurity]
[Guid("81B629ED-6204-4411-80E3-95CD65E40621")]
[TypeLibType(4160)]
public interface IHotkey
{
[DispId(1)]
string EventTitle
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(1)]
[return: MarshalAs(UnmanagedType.BStr)]
get;
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(1)]
[param: In]
[param: MarshalAs(UnmanagedType.BStr)]
set;
}
[DispId(2)]
string EventDescription
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(2)]
[return: MarshalAs(UnmanagedType.BStr)]
get;
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(2)]
[param: In]
[param: MarshalAs(UnmanagedType.BStr)]
set;
}
[DispId(3)]
bool AltState
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(3)]
get;
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(3)]
[param: In]
set;
}
[DispId(4)]
bool ControlState
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(4)]
get;
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(4)]
[param: In]
set;
}
[DispId(5)]
bool ShiftState
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(5)]
get;
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(5)]
[param: In]
set;
}
[DispId(6)]
int VirtualKey
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(6)]
get;
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(6)]
[param: In]
set;
}
}

View file

@ -0,0 +1,33 @@
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
namespace Decal.Interop.DHS;
[ComImport]
[SuppressUnmanagedCodeSecurity]
[Guid("85C12F39-FD37-4E70-982A-3973FA6D376B")]
[TypeLibType(4160)]
public interface IHotkeySystem
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(1)]
void AddHotkey([In][MarshalAs(UnmanagedType.BStr)] string szPlugin, [In][MarshalAs(UnmanagedType.Interface)] Hotkey pHotkey);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(2)]
bool QueryHotkey([In][MarshalAs(UnmanagedType.BStr)] string bstrTitle);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(3)]
void Connect([In][MarshalAs(UnmanagedType.IUnknown)] object pPlugin);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(4)]
void DeleteHotkey([In][MarshalAs(UnmanagedType.BStr)] string szPluginCookie, [In][MarshalAs(UnmanagedType.BStr)] string szHotkeyName);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(5)]
[return: MarshalAs(UnmanagedType.Interface)]
Hotkey QueryHotkeyEx([In][MarshalAs(UnmanagedType.BStr)] string szPluginCookie, [In][MarshalAs(UnmanagedType.BStr)] string szTitle);
}

View file

@ -0,0 +1,17 @@
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
namespace Decal.Interop.DHS;
[ComImport]
[SuppressUnmanagedCodeSecurity]
[Guid("B51801E0-74AF-4916-AB0F-E06B09567C3C")]
[TypeLibType(4096)]
[InterfaceType(2)]
public interface _IHotkeySystemEvents
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[DispId(1)]
void HotkeyEvent([In][MarshalAs(UnmanagedType.BStr)] string szEvent, [In][Out] ref bool pbEat);
}

View file

@ -0,0 +1,10 @@
using System.Runtime.InteropServices;
namespace Decal.Interop.DHS;
[TypeLibType(16)]
[ComVisible(false)]
public interface _IHotkeySystemEvents_Event
{
event _IHotkeySystemEvents_HotkeyEventEventHandler HotkeyEvent;
}

View file

@ -0,0 +1,154 @@
using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Threading;
namespace Decal.Interop.DHS;
internal sealed class _IHotkeySystemEvents_EventProvider : _IHotkeySystemEvents_Event, IDisposable
{
private IConnectionPointContainer m_ConnectionPointContainer;
private ArrayList m_aEventSinkHelpers;
private IConnectionPoint m_ConnectionPoint;
private void Init()
{
IConnectionPoint ppCP = null;
Guid riid = new Guid(new byte[16]
{
224, 1, 24, 181, 175, 116, 22, 73, 171, 15,
224, 107, 9, 86, 124, 60
});
m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP);
m_ConnectionPoint = ppCP;
m_aEventSinkHelpers = new ArrayList();
}
event _IHotkeySystemEvents_HotkeyEventEventHandler _IHotkeySystemEvents_Event.HotkeyEvent
{
add
{
bool lockTaken = default(bool);
try
{
Monitor.Enter(this, ref lockTaken);
if (m_ConnectionPoint == null)
{
Init();
}
_IHotkeySystemEvents_SinkHelper iHotkeySystemEvents_SinkHelper = new _IHotkeySystemEvents_SinkHelper();
int pdwCookie = 0;
m_ConnectionPoint.Advise(iHotkeySystemEvents_SinkHelper, out pdwCookie);
iHotkeySystemEvents_SinkHelper.m_dwCookie = pdwCookie;
iHotkeySystemEvents_SinkHelper.m_HotkeyEventDelegate = value;
m_aEventSinkHelpers.Add(iHotkeySystemEvents_SinkHelper);
}
finally
{
if (lockTaken)
{
Monitor.Exit(this);
}
}
}
remove
{
bool lockTaken = default(bool);
try
{
Monitor.Enter(this, ref lockTaken);
if (m_aEventSinkHelpers == null)
{
return;
}
int count = m_aEventSinkHelpers.Count;
int num = 0;
if (0 >= count)
{
return;
}
do
{
_IHotkeySystemEvents_SinkHelper iHotkeySystemEvents_SinkHelper = (_IHotkeySystemEvents_SinkHelper)m_aEventSinkHelpers[num];
if (iHotkeySystemEvents_SinkHelper.m_HotkeyEventDelegate != null && ((iHotkeySystemEvents_SinkHelper.m_HotkeyEventDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0)
{
m_aEventSinkHelpers.RemoveAt(num);
m_ConnectionPoint.Unadvise(iHotkeySystemEvents_SinkHelper.m_dwCookie);
if (count <= 1)
{
Marshal.ReleaseComObject(m_ConnectionPoint);
m_ConnectionPoint = null;
m_aEventSinkHelpers = null;
}
break;
}
num++;
}
while (num < count);
}
finally
{
if (lockTaken)
{
Monitor.Exit(this);
}
}
}
}
public _IHotkeySystemEvents_EventProvider(object P_0)
{
//Error decoding local variables: Signature type sequence must have at least one element.
m_ConnectionPointContainer = (IConnectionPointContainer)P_0;
}
public void Finalize()
{
bool lockTaken = default(bool);
try
{
Monitor.Enter(this, ref lockTaken);
if (m_ConnectionPoint == null)
{
return;
}
int count = m_aEventSinkHelpers.Count;
int num = 0;
if (0 < count)
{
do
{
_IHotkeySystemEvents_SinkHelper iHotkeySystemEvents_SinkHelper = (_IHotkeySystemEvents_SinkHelper)m_aEventSinkHelpers[num];
m_ConnectionPoint.Unadvise(iHotkeySystemEvents_SinkHelper.m_dwCookie);
num++;
}
while (num < count);
}
Marshal.ReleaseComObject(m_ConnectionPoint);
}
catch (Exception)
{
}
finally
{
if (lockTaken)
{
Monitor.Exit(this);
}
}
}
public void Dispose()
{
//Error decoding local variables: Signature type sequence must have at least one element.
Finalize();
GC.SuppressFinalize(this);
}
}

View file

@ -0,0 +1,6 @@
using System.Runtime.InteropServices;
namespace Decal.Interop.DHS;
[ComVisible(false)]
public delegate void _IHotkeySystemEvents_HotkeyEventEventHandler([In][MarshalAs(UnmanagedType.BStr)] string szEvent, [In][Out] ref bool pbEat);

View file

@ -0,0 +1,28 @@
using System.Runtime.InteropServices;
namespace Decal.Interop.DHS;
[TypeLibType(TypeLibTypeFlags.FHidden)]
[ClassInterface(ClassInterfaceType.None)]
public sealed class _IHotkeySystemEvents_SinkHelper : _IHotkeySystemEvents
{
public _IHotkeySystemEvents_HotkeyEventEventHandler m_HotkeyEventDelegate;
public int m_dwCookie;
public void HotkeyEvent(string P_0, ref bool P_1)
{
//Error decoding local variables: Signature type sequence must have at least one element.
if (m_HotkeyEventDelegate != null)
{
m_HotkeyEventDelegate(P_0, ref P_1);
}
}
internal _IHotkeySystemEvents_SinkHelper()
{
//Error decoding local variables: Signature type sequence must have at least one element.
m_dwCookie = 0;
m_HotkeyEventDelegate = null;
}
}

View file

@ -0,0 +1,10 @@
using System.Reflection;
using System.Runtime.InteropServices;
using System.Security;
[assembly: SecurityRules(SecurityRuleSet.Level2)]
[assembly: ImportedFromTypeLib("DHS")]
[assembly: TypeLibVersion(1, 0)]
[assembly: PrimaryInteropAssembly(1, 0)]
[assembly: Guid("7be9a39f-dc34-4c38-bbc0-7ba572c1ef7a")]
[assembly: AssemblyVersion("2.9.8.3")]