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:
commit
d1442e3747
1382 changed files with 170725 additions and 0 deletions
338
Installer/Res/Install.vbs
Normal file
338
Installer/Res/Install.vbs
Normal 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"
|
||||
Loading…
Add table
Add a link
Reference in a new issue