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

338
Installer/Res/Install.vbs Normal file
View file

@ -0,0 +1,338 @@
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Decal Installer Library <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Option Explicit
'FSO Constants
Private Const WindowsFolder = 0
Private Const SystemFolder = 1
Private Const TemporaryFolder = 2
'WindowsInstaller Constants
Private Const msiInstallStateUnknown = -1
Private Const msiInstallStateAbsent = 2
Private Const msiUILevelFull = 5
'Minimum versions
Private Const MIN_WSH_VERSION = "5.1"
Private Const MIN_WI_VERSION = "1.11.2405.0"
'Global Objects
Private WshShell, WI, FSO, AllProducts
'prevent premature errors if objects don't exist
On Error Resume Next
Set WshShell = WScript.CreateObject("WScript.Shell") 'needed for reg access and file execution
Set WI = CreateObject("WindowsInstaller.Installer") 'the MSI related functions need this object
Set FSO = CreateObject("Scripting.FileSystemObject") 'can never have too many of these around
Set AllProducts = CreateObject("Scripting.Dictionary") 'All of the product IDs that this should remove before installing
On Error GoTo 0
'Now make sure we got them all
'There is some error checking deeper in, but I've seen a lot of errors so I'm not removing any of it :)
If Not IsObject(WshShell) Then
MsgBox "Internal error creating Windows Scripting Host object (WshShell). Please make sure you have IE6+ installed", _
vbOKOnly, _
"Decal Installer Library"
WScript.Quit
End If
If Not IsObject(FSO) Then
MsgBox "Internal error creating Windows Scripting Host object (FSO). Please make sure you have IE6+ installed", _
vbOKOnly, _
"Decal Installer Library"
WScript.Quit
End If
If Not IsObject(AllProducts) Then
MsgBox "Internal error creating Windows Scripting Host object (Dictionary). Please make sure you have IE6+ installed", _
vbOKOnly, _
"Decal Installer Library"
WScript.Quit
End If
If Not IsObject(WI) Then
MsgBox "Internal error creating Windows Installer object. Please make sure you have Windows Installer installed", _
vbOKOnly, _
"Decal Installer Library"
WScript.Quit
End If
'YOU MUST EDIT THESE FOR YOUR PARTICULAR INSTALLER!!!!!!
'All of these -must- be specified
Private Const ThisProduct = "Decal" ' The name of your product, used it dialogs and such
Private Const ThisVersion = "2.6.0.1" ' The version of your product, used in dialogs and such
Private Const MSIFileName = "Decal.msi" ' The name of the MSI file that will be excuted
'Add all of your previous product IDs to the dictionary for removal by the installer
AllProducts.Add "1.0.1.0", "{4AFA7857-D10F-4A74-A504-9C10320A6DB9}"
AllProducts.Add "1.0.2.0", "{840FA8EC-CA4D-46BE-94E6-2C85F4E29EDD}"
AllProducts.Add "1.0.2.2", "{DBBE8C7F-F27D-48D7-BBC1-5BFA30485980}"
AllProducts.Add "1.1.0.0", "{DFB254B2-F9B4-42F1-8B16-C045B18C8DBE}"
AllProducts.Add "2.0.0.0 RC1", "{3CFF0D79-376D-4557-8376-A9B48E50F775}"
AllProducts.Add "2.0.0.0 RC2", "{701F72C7-421E-4DBE-B8C7-0A8B5258D539}"
AllProducts.Add "2.0.0.0 RC3 ", "{D6E309A7-290D-48E0-9992-0DAB18EA4CE4}"
AllProducts.Add "2.0.0.0 RC4", "{3C2F8BE2-2B35-402F-9BAE-F9FDCA9C22A9}"
AllProducts.Add "2.0.0.0", "{F7DC5688-E3A0-432B-A5DF-F7CB4B02DE03}"
AllProducts.Add "2.1.0.2", "{6C6B886C-66E0-41C9-AF1A-1B02372D5E77}"
AllProducts.Add "2.1.0.4", "{83CE1E0E-E441-4764-A3CC-DBF1A53C40F0}"
AllProducts.Add "2.1.0.5", "{B388C87C-F59D-457F-A839-B6F3A2642CE7}"
AllProducts.Add "2.2.0.0", "{9FB34BE5-A2A3-4509-8A21-133FC27387F7}"
AllProducts.Add "2.2.0.1", "{BE7BB776-FE47-41B7-AACE-1F958A7CE214}"
AllProducts.Add "2.2.2.0", "{92A0F954-9A9D-4FCC-B874-F0A8DBD8BF1B}"
AllProducts.Add "2.2.3.0", "{775AB855-075F-462B-A482-D555569E2C03}"
AllProducts.Add "2.2.4.0", "{0C844C18-2021-4660-AD25-7922653E1A16}"
AllProducts.Add "2.3.0.0", "{DE512CE7-2417-41E5-9C7F-5C091F171785}"
AllProducts.Add "2.3.1.0", "{660E1D69-140D-437E-9D23-9137DA6F0162}"
AllProducts.Add "2.3.1.1", "{A0ACDD8E-3730-4007-926A-55D7B1A5A7B7}"
AllProducts.Add "2.3.1.2", "{E6E77F45-0B35-4F92-9CD3-4B70A821158D}"
AllProducts.Add "2.3.1.3", "{92872CC7-2722-4534-81BE-E99B4D472A95}"
AllProducts.Add "2.3.1.4", "{8186889F-BF27-4F79-9D94-4DD7CB9956F2}"
AllProducts.Add "2.3.1.5", "{09A9F4AE-C043-43CF-85D1-6F14BCAAEB11}"
AllProducts.Add "2.3.1.6", "{A6749A61-B1E5-4FFB-BA4D-AE93E5443EC8}"
AllProducts.Add "2.3.1.7", "{C667B179-E270-4BE5-9C73-0533C1D2B758}"
AllProducts.Add "2.3.1.8", "{88947320-85FC-4327-908D-7801365AD4D9}"
AllProducts.Add "2.3.1.9", "{1CF52690-D209-47C7-97EF-F38D64463AD5}"
AllProducts.Add "2.4.0.0", "{4D7BE8B5-6B0A-4135-8C75-BE8E4BB2E351}"
AllProducts.Add "2.4.1.0", "{E6E9AB9D-812C-40D7-A57C-ED298B48557F}"
AllProducts.Add "2.4.1.2", "{09C6E670-D686-11D6-BFDA-009027B6A4F1}"
AllProducts.Add "2.4.1.3", "{E62F700A-E214-11D6-B2DA-009027B6A4F1}"
AllProducts.Add "2.5.0.0 RC1", "{940240A5-39C7-496A-B2FB-21D87220FCFE}"
AllProducts.Add "2.5.0.0 RC2", "{F685D7CA-12EB-11D7-B2DA-009027B6A4F1}"
AllProducts.Add "2.5.0.0 RC3", "{F15D5960-13C9-11D7-B2DA-009027B6A4F1}"
AllProducts.Add "2.5.0.1 RC1", "{B5B0E8D6-FE22-467C-B09E-1AB5CC837942}"
AllProducts.Add "2.5.0.1", "{CE4276BF-04AE-41C9-B7C2-3DD65B4DAEDD}"
AllProducts.Add "2.5.0.2", "{F794642A-63D5-11D7-B2DA-009027B6A4F1}"
AllProducts.Add "2.5.0.4", "{29E8FB17-4C4E-4F5D-8C5D-F3826ECE2CF6}"
AllProducts.Add "2.5.0.5", "{35012CC1-DC9F-49C3-9593-2B246AE68D3A}"
AllProducts.Add "2.5.2.0 RC1", "{ED4744B7-3F12-453B-9908-D192E0F5477A}"
AllProducts.Add "2.5.2.0 RC2", "{3EA7A26F-9112-45D4-BDE0-9BE451D42A9F}"
AllProducts.Add "2.5.2.0 RC3", "{B04617E3-2AFF-4650-84AF-10BE73B22A15}"
AllProducts.Add "2.6.0.0 RC1", "{6E766A51-09A9-4571-B55A-EE2E4E74B8BC}"
AllProducts.Add "2.6.0.0 RC2", "{4C22590F-22B8-4413-B91D-0403B2F84979}"
AllProducts.Add "2.6.0.0 RC3", "{E86FBB39-9061-475A-B575-F8F9AC12DB74}"
AllProducts.Add "2.6.0.0 RC4", "{16673809-CA94-4E31-9E0B-B2FCA0CBDFAB}"
AllProducts.Add "2.6.0.0 RC5", "{67E0D07C-8A6A-4357-B44F-CCA1A513DFE7}"
AllProducts.Add "2.6.0.0", "{B0DC3DCD-44BD-47C7-AB9D-CC68FB63F4C3}"
AllProducts.Add "2.6.0.1", "{32767F66-7F62-4C0B-81F7-C42B4C7C0148}"
' These are optional
' The features they provide will be ignored if they are left as empty strings
Private Const PathRegValue = "HKLM\SOFTWARE\Decal\Agent\AgentPath" ' Path to a registry key containing the install location of your product
Private Const FavoriteName = "Decal Homepage" ' Name of the Favorite to add at the end of the install
Private Const FavoriteURL = "http://decaldev.sourceforge.net/" ' URL for the Favorite to point to
Private Const FavoriteIconFile = "Denagent.exe" ' File to get the icon for the favorite from (default IE icon if blank)
Private Const FavoriteIconID = "0" ' Icon ID to use from the above file (default IE icon if blank)
' END OF EDITABLE OPTIONS
Private Function IsVersionAgreeable(pActualVersion, pMinumumVersion)
Dim actual, expected, i
IsVersionAgreeable = True
'msgbox "pActualVersion: " & pActualVersion & vbCRLF & "pMinumumVersion: " & pMinumumVersion
actual = split (pActualVersion, ".")
expected = split (pMinumumVersion, ".")
For i = 0 To UBound(expected)
'msgbox cstr(i & " : " & actual(i) & " : " & expected(i))
If CInt(actual(i)) > CInt(expected(i)) Then
'msgbox("greater")
Exit For
ElseIf CInt(actual(i)) < CInt(expected(i)) Then
'msgbox("less")
IsVersionAgreeable = False
Exit For
End If
Next
End Function
Private Sub WSHVersionCheck()
'Function: Check the Windows Scripting Host version, give URL for updating if not good enough,
' then kill the script.
'Args: N/A
'Returns: N/A
'
'Requirements: WshShell = WScript.Shell
'
Dim actualVersion, rc
On Error Resume Next
actualVersion = WScript.Version
On Error GoTo 0
'Bail here if things are ok
If IsVersionAgreeable(actualVersion, MIN_WSH_VERSION) Then Exit Sub
'Didn't bail, so need to prompt for an upgrade
rc = MsgBox ("The " & ThisProduct & " Installer has determined that you do not have a new enough version of Windows Scripting Host to use this installer." & _
String(2, vbCRLF) & _
"The newest version is available with Windows Scripting Host 5.6 which you can download at: " & _
String(2, vbCRLF) & _
"http://download.microsoft.com/download/winscript56/Install/5.6/W9XNT4Me/EN-US/scr56en.exe" & _
String(2, vbCRLF) & _
"Would you like to go there now?", _
vbYesNo + vbQuestion, _
ThisProduct & " Installer")
If rc = vbYes Then WshShell.Run "http://download.microsoft.com/download/winscript56/Install/5.6/W9XNT4Me/EN-US/scr56en.exe"
WScript.Quit
End Sub
Private Sub WIVersionCheck()
'Function: Check the windows installer version, give URL for updating if not good enough,
' then kill the script.
'Args: N/A
'Returns: N/A
'
'Requirements: WI = WindowsInstaller.Installer
' WshShell = WScript.Shell
Dim actualVersion, rc, fileInSysFolder, fileInWinFolder, windowsVersion, strURL, strFailMsg
On Error Resume Next
actualVersion = WI.Version
On Error GoTo 0
'Bail here if things are ok
If IsVersionAgreeable(actualVersion, MIN_WI_VERSION) Then Exit Sub
'Didn't bail, so need to prompt for an upgrade
With FSO
fileInSysFolder = .BuildPath(.GetSpecialFolder(SystemFolder), "winver.exe")
fileInWinFolder = .BuildPath(.GetSpecialFolder(WindowsFolder), "winver.exe")
If .FileExists(fileInSysFolder) Then
windowsVersion = split(.GetFileVersion(fileInSysFolder),".")
ElseIf .FileExists(fileInWinFolder) Then
windowsVersion = split(.GetFileVersion(fileInWinFolder),".")
Else
rc = MsgBox("The Decal Installer was unable to determine your Windows version. Are you using Windows 2000 or Windows XP?", _
vbYesNo + vbQuestion, _
ThisProduct & " Installer")
If rc = vbYes Then
windowsVersion = split("5.0.0.0", ".")
ElseIf rc = vbNo Then
windowsVersion = split("4.0.0.0", ".")
Else
MsgBox "An unknown error occured in Windows Version detection. Please make sure you have Windows Installer properly installed and try again.", _
vbOKOnly, _
ThisProduct & " Installer"
WScript.Quit
End If
End If
End With 'With FSO
If CInt(windowsVersion(1)) < 5 Then
strURL = "http://www.microsoft.com/downloads/release.asp?releaseid=32831"
strFailMsg = "Windows 98/ME users can upgrade at: " & strURL
Else 'If work(0) < 5 Then
strURL = "http://www.microsoft.com/downloads/release.asp?releaseid=32832"
strFailMsg = "Windows 2000 users can upgrade at: " & strURL
End If 'If work(0) < 5 Then
rc = MsgBox ("The " & ThisProduct & " Installer has determined that you do not have a new enough version of Windows Installer to use this installer. " & _
String(2,vbCRLF) & _
strFailMsg & _
String(2,vbCRLF) & _
"Would you like to go there now?", _
vbYesNo + vbQuestion, _
ThisProduct & " Installer")
If rc = vbYes Then
'open the browser and exit
WshShell.Run strURL
End If
WScript.Quit
End Sub
Private Sub WipeProduct(pProdID)
'Function: Check for the product ID. If it exists, silently and forcefully uninstall.
'
'Args: pProdID = a string of the MSI Product ID to be wiped
'Returns: N/A
'
'Requirements: WI = WindowsInstaller.Installer
Dim rc
rc = WI.ProductState(pProdID)
'FIXME
'something about this check is not as precise as it should be. Need to find info
'about different install states and find ways to handle them all
'TEMP FIX ONLY
On Error Resume Next
'END OF TEMP FIX
If rc <> msiInstallStateUnknown Then
'remove it
WI.ConfigureProduct pProdID, 0, msiInstallStateAbsent 'second param is ignored
End If
End Sub
' VERSION CHECKING
WSHVersionCheck
WIVersionCheck
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> End of Decal Installer Library <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
'>>>>>>>>>>>>>>>>>>>>>>>>>>>START SCRIPT<<<<<<<<<<<<<<<<<<<<<<<<
'variables
Dim retval, strProductFolder, strProp, strUninstaller, strPathToFavIcon, TXT, i, ProductsToRemove
'make sure they really want to do this
retval = MsgBox("You are about to remove all old " & ThisProduct & " versions and install " & ThisProduct & " v" & ThisVersion & " ", _
vbOkCancel + vbQuestion, _
ThisProduct &" Installer")
If retval = vbCancel Then WScript.Quit
'Before starting, lookup and store the Decal path if it exists
On Error Resume Next 'will fail if not found, leaving an empty string
strDecalFolder = WshShell.RegRead(PathRegValue)
On Error GoTo 0
'>>>>>>>>>>>>>>>UNINSTALLING OLD VERSIONS<<<<<<<<<<<<<<<<<
'Remove MSIs by product code
ProductsToRemove = AllProducts.Items
For i = 0 To UBound(ProductsToRemove)
WipeProduct ProductsToRemove(i)
Next
'>>>>>>>>>>>>>>>>>>>>INSTALLING PDODUCT<<<<<<<<<<<<<<<<<<<<<<<<<<
'install .msi with remembered install path if it exists
strProp = "DISABLEADVTSHORTCUTS=True"
If Len(strProductFolder) > 0 Then strProp = strProp & " TARGETDIR=""" & strProductFolder & """"
WI.UILevel = msiUILevelFull
On Error Resume Next
WI.InstallProduct MSIFileName, strProp
On Error GoTo 0
If Err.Number <> 0 Then WScript.Quit
'The old command line:
'WshShell.Run "msiexec /i Decal.msi " & strProp
'Favorites icon?
If Len(FavoriteName) > 0 And Len(FavoriteURL) > 0 Then
strPathToFavIcon = FSO.BuildPath(WshShell.SpecialFolders("Favorites"), FavoriteName & ".url")
'is is there already?
If Not FSO.FileExists(strPathToFavIcon) Then
retval = MsgBox("Would you like a shortcut to the " & ThisProduct & " Homepage placed in your Favorites menu?", _
vbYesNo + vbQuestion, _
ThisProduct & " Installer")
If retval = vbYes Then
Set TXT = FSO.CreateTextFile(strPathToFavIcon)
TXT.WriteLine "[InternetShortcut]"
TXT.WriteLine "URL=" & FavoriteURL
On Error Resume Next
strProductFolder = WshShell.RegRead(PathRegValue)
On Error GoTo 0
If Len(FavoriteIconFile) > 0 And Len(FavoriteIconID) > 0 And Len(strProductFolder) > 0 Then
TXT.WriteLine "IconFile=" & FSO.BuildPath(strProductFolder, FavoriteIconFile)
TXT.WriteLine "IconIndex=" & FavoriteIconID
End If
TXT.Close
End If
End If
End If
MsgBox ThisProduct & " Installation Completed", _
vbOkOnly + vbInformation, _
ThisProduct & " Installer"