#define MyAppVersion "0.1.0" [Setup] AppName=DragonMoonlight AppVersion={#MyAppVersion} AppPublisher=Wild Dragon AppPublisherURL=https://forge.wilddragon.net/zgaetano/dragonmoonlight DefaultDirName={autopf}\DragonMoonlight DefaultGroupName=DragonMoonlight OutputBaseFilename=DragonMoonlight-{#MyAppVersion}-Setup OutputDir=dist Compression=lzma2/ultra64 SolidCompression=yes ArchitecturesInstallIn64BitMode=x64 ; DragonMoonlight embeds Wintun for WireGuard VPN functionality. ; Wintun requires a kernel-mode driver which must run as Administrator. PrivilegesRequired=admin WizardStyle=modern SetupIconFile=app\icon.ico UninstallDisplayIcon={app}\DragonMoonlight.exe VersionInfoVersion={#MyAppVersion} VersionInfoCompany=Wild Dragon VersionInfoProductName=DragonMoonlight VersionInfoProductVersion={#MyAppVersion} ; Code signing configuration - uses SignTool if SIGNTOOL_CERT env var is set SignTool=signtool sign /f {%SIGNTOOL_CERT} /p {%SIGNTOOL_PASSWORD} /td sha256 /fd sha256 /tr http://timestamp.digicert.com $f [Files] Source: "{src}\dist\win\DragonMoonlight.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "{src}\dist\win\wintun.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "{src}\dist\win\*.dll"; DestDir: "{app}"; Flags: ignoreversion skipifnotexists Source: "{src}\dist\win\*.exe"; DestDir: "{app}"; Flags: ignoreversion skipifnotexists Source: "{src}\dist\win\platforms\*"; DestDir: "{app}\platforms"; Flags: ignoreversion recursesubdirs createallsubdirs skipifnotexists Source: "{src}\dist\win\styles\*"; DestDir: "{app}\styles"; Flags: ignoreversion recursesubdirs createallsubdirs skipifnotexists Source: "{src}\dist\win\imageformats\*"; DestDir: "{app}\imageformats"; Flags: ignoreversion recursesubdirs createallsubdirs skipifnotexists Source: "{src}\dist\win\qml\*"; DestDir: "{app}\qml"; Flags: ignoreversion recursesubdirs createallsubdirs skipifnotexists Source: "{src}\dist\win\translations\*"; DestDir: "{app}\translations"; Flags: ignoreversion recursesubdirs createallsubdirs skipifnotexists Source: "{src}\package\win\pre-install.ps1"; DestDir: "{tmp}"; Flags: dontcopy deleteafterinstall [Icons] Name: "{userdesktop}\DragonMoonlight"; Filename: "{app}\DragonMoonlight.exe" Name: "{group}\DragonMoonlight"; Filename: "{app}\DragonMoonlight.exe" Name: "{group}\Uninstall DragonMoonlight"; Filename: "{uninstallexe}" [Run] Filename: "{app}\DragonMoonlight.exe"; Flags: nowait postinstall skipifsilent; Description: "Launch DragonMoonlight" [UninstallRun] Filename: "powershell.exe"; Parameters: "-Command ""Get-Process DragonMoonlight -EA SilentlyContinue | Stop-Process -Force"""; Flags: runhidden [Code] function InitializeSetup(): Boolean; var ResultCode: Integer; begin // Check Windows version (Windows 10 or later) if GetWindowsVersion() < $0A00 then begin MsgBox('DragonMoonlight requires Windows 10 or later.' + #13#13 + 'Your system does not meet the minimum requirements.', mbCriticalError, MB_OK); Result := False; Exit; end; // Extract pre-install script to temporary directory ExtractTemporaryFile('pre-install.ps1'); // Run pre-installation checks via PowerShell if not Exec('powershell.exe', '-ExecutionPolicy Bypass -NonInteractive -File "' + ExpandConstant('{tmp}') + '\pre-install.ps1"', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) then begin MsgBox('Pre-installation checks could not run.', mbError, MB_OK); Result := False; Exit; end; // Check exit code from pre-install script if ResultCode <> 0 then begin Result := False; // InitializeSetup returns False = abort install Exit; end; Result := True; end; procedure CurStepChanged(CurStep: TSetupStep); begin if CurStep = ssPostInstall then begin Log('DragonMoonlight installed successfully'); end; end;