93 Commits

Author SHA1 Message Date
jazir5
c7a2576da4 Create install_decky.bat 2024-12-25 15:19:02 -08:00
jazir5
7f6e185a02 Create decky_builder.py 2024-12-25 15:18:14 -08:00
jazir5
5866c13782 Update Disable Gamesdows V2.bat 2024-12-20 15:58:10 -08:00
jazir5
8bd670dfc7 Update Enable GamesDows Steam V3.bat 2024-12-20 15:29:37 -08:00
jazir5
06c1cb02d6 Update Enable GamesDows Playnite.bat 2024-12-20 15:00:51 -08:00
jazir5
d49ff27ad4 Update Enable GamesDows Steam V3.bat 2024-12-20 14:54:14 -08:00
jazir5
7e842382cf Update Enable GamesDows Steam V3.bat 2024-12-20 14:48:01 -08:00
jazir5
ac3ff0bb1b Update README.md 2024-11-24 23:30:05 -08:00
jazir5
a5af0188b1 Update README.md 2024-11-03 19:31:53 -08:00
jazir5
e6b15506fd Update README.md 2024-11-03 19:31:09 -08:00
jazir5
6e5d28bf6b Update Enable GamesDows Playnite.bat 2024-11-01 18:07:43 -07:00
jazir5
c1125b3376 Update Enable GamesDows Playnite.bat 2024-11-01 18:03:08 -07:00
jazir5
8ca56ed459 Update Enable GamesDows Playnite.bat 2024-11-01 18:01:28 -07:00
jazir5
a5c0d26e6f Update Enable GamesDows Playnite.bat 2024-11-01 17:58:06 -07:00
jazir5
d883fd4115 Update Enable GamesDows Playnite.bat 2024-11-01 17:56:54 -07:00
jazir5
5f1428c7e3 Update README.md 2024-11-01 17:55:39 -07:00
jazir5
51d6fab016 Update README.md 2024-10-24 16:20:22 -07:00
jazir5
345f25cbad Update README.md 2024-10-24 16:19:40 -07:00
jazir5
38358751d5 Update README.md 2024-10-24 16:15:36 -07:00
jazir5
e0f9bf46d6 Update README.md 2024-10-24 01:30:11 -07:00
jazir5
befd6aa4f2 Update README.md 2024-10-17 03:22:46 -07:00
jazir5
bc141c3e1a Update README.md 2024-10-17 03:22:26 -07:00
jazir5
d1b7a444e2 Rename Enable GamesDows V3.bat to Enable GamesDows Steam V3.bat 2024-10-16 21:53:19 -07:00
jazir5
0c84d93c33 Update and rename Enable GamesDows V2 Testing.bat to Enable GamesDows V3.bat 2024-10-16 21:51:40 -07:00
jazir5
d250d40338 Update Enable GamesDows V2 Testing.bat 2024-10-16 21:47:24 -07:00
jazir5
7e4caac315 Update and rename Enable GamesDows.bat to Enable GamesDows V2 Testing.bat 2024-10-16 21:45:58 -07:00
jazir5
14313ea3f1 Delete Disable GamesDows.bat 2024-10-13 14:29:18 -07:00
jazir5
59ae9686d2 Create Disable Gamesdows V2.bat
V2 of the Disable Gamesdows script
2024-10-12 21:48:02 -07:00
jazir5
deba33efaf Update Enable GamesDows Playnite.bat 2024-10-12 21:37:39 -07:00
jazir5
55e2475630 Update Enable GamesDows.bat 2024-10-12 21:36:35 -07:00
jazir5
4153a4336c Update Enable GamesDows.bat
Changed query user to whoami
2024-10-12 21:35:23 -07:00
jazir5
b744ddd6c4 Update README.md 2024-10-04 15:18:01 -07:00
jazir5
5e34182874 Update README.md 2024-09-05 17:18:08 -07:00
jazir5
e4f338cd8e Update README.md 2024-09-05 17:17:20 -07:00
jazir5
15a435d27d Update README.md 2024-09-05 17:16:59 -07:00
jazir5
4fe8c7940b Create Set explorer as shell.reg 2024-09-05 17:13:18 -07:00
jazir5
48252f8b93 Update README.md 2024-08-31 17:01:42 -07:00
jazir5
6c3af61908 Update README.md 2024-08-31 17:01:19 -07:00
jazir5
be6a79d69e GamesDows Playnite variant based on GamesDows V1 2024-08-31 16:57:18 -07:00
jazir5
f75b84da19 Delete Enable GamesDows Playnite.bat 2024-08-31 15:15:45 -07:00
jazir5
c182353a1c Delete Enable GamesDows v2.bat 2024-08-31 15:15:31 -07:00
jazir5
fbcfb0233a Update README.md 2024-08-30 14:47:43 -07:00
jazir5
ddd8f47539 Update README.md 2024-08-30 14:46:47 -07:00
jazir5
60e74326b5 Update README.md 2024-08-30 14:46:21 -07:00
jazir5
db866f23ff Update README.md 2024-08-30 14:44:54 -07:00
jazir5
3955f66bab Update README.md 2024-08-30 14:44:30 -07:00
jazir5
aa634a73cd Update README.md 2024-08-30 14:44:02 -07:00
jazir5
03500223c3 Update README.md 2024-08-30 14:42:18 -07:00
jazir5
0c480d73cc Update README.md 2024-08-30 14:42:03 -07:00
jazir5
95af8c00c2 Update Disable GamesDows.bat 2024-08-26 18:48:36 -07:00
jazir5
3bcc7e23ca Rename Enable.GamesDows.v2.bat to Enable GamesDows v2.bat 2024-08-26 18:45:24 -07:00
jazir5
aed71b8b75 Add files via upload 2024-08-26 18:45:09 -07:00
jazir5
510c83c9e6 Update README.md 2024-08-26 15:06:07 -07:00
jazir5
53f85a79f2 Update README.md 2024-08-26 15:05:32 -07:00
jazir5
5f34c3463d Playnite Version
A variant with Playnite set as the shell instead of Steam
2024-08-24 20:54:20 -07:00
jazir5
18cd022c6a Update Enable GamesDows.bat 2024-07-16 19:19:50 -07:00
jazir5
f9856390eb Update README.md 2024-07-03 23:16:04 -07:00
jazir5
80febfccb4 Update Enable GamesDows.bat 2024-06-29 15:37:54 -07:00
jazir5
3480682dc7 Update Enable GamesDows.bat 2024-06-29 01:20:10 -07:00
jazir5
85e96a2efa Update Enable GamesDows.bat 2024-06-29 01:15:14 -07:00
jazir5
a1def078e9 Update Enable GamesDows.bat 2024-06-29 00:47:38 -07:00
jazir5
d952788a6c Update Enable GamesDows.bat 2024-06-29 00:35:31 -07:00
jazir5
5c20217813 Update Enable GamesDows.bat 2024-06-29 00:32:28 -07:00
jazir5
a9dc4301e7 Update Enable GamesDows.bat 2024-06-29 00:28:19 -07:00
jazir5
9f1ace084b Update Enable GamesDows.bat 2024-06-29 00:04:56 -07:00
jazir5
143f73f5c2 Update Enable GamesDows.bat 2024-06-28 22:02:15 -07:00
jazir5
531da7ee39 Fixed VBS Script creation location 2024-06-28 15:08:02 -07:00
jazir5
72e754faa4 Update Enable GamesDows.bat 2024-06-27 14:10:17 -07:00
jazir5
1780390c80 Updatedscriptcreationfilepath 2024-06-27 13:59:15 -07:00
jazir5
ac114bc5f6 Update Enable GamesDows.bat 2024-06-26 03:58:35 -07:00
jazir5
83eab8cfb7 Removed Windows Education and Enterprise commands 2024-06-25 23:03:42 -07:00
jazir5
ab12c08ce6 Update Disable GamesDows.bat 2024-06-24 02:48:40 -07:00
jazir5
aa142f68fc Rename Enable GamesDows V1.bat to Enable GamesDows.bat 2024-06-22 23:24:20 -07:00
jazir5
636502a654 Delete Enable GamesDows.bat 2024-06-22 23:24:08 -07:00
jazir5
a82e052126 Add files via upload 2024-06-22 23:23:25 -07:00
jazir5
c61f5697bd Update Enable GamesDows.bat 2024-06-22 22:15:39 -07:00
jazir5
cd03f3b816 Update Enable GamesDows.bat 2024-06-22 18:29:51 -07:00
jazir5
73733e5b2d Update Enable GamesDows.bat 2024-06-22 18:25:54 -07:00
jazir5
a4ab3669dd Enable GamesDows.bat 2024-06-22 18:25:46 -07:00
jazir5
abcb0e07db Delete Enable GamesDows V1.bat 2024-06-22 18:25:16 -07:00
jazir5
a631c5cb20 Rename Enable GamesDows Original.bat to Enable GamesDows.bat 2024-06-22 18:24:51 -07:00
jazir5
6dfbecdce9 Add files via upload 2024-06-22 18:24:17 -07:00
jazir5
59e190f499 Delete Enable GamesDows.bat 2024-06-20 01:27:33 -07:00
jazir5
429a799410 Create Enable GamesDows V1.bat 2024-06-20 01:27:19 -07:00
jazir5
43ab18cf33 Delete Testing:Enable GamesDows v2 2024-06-20 01:26:08 -07:00
jazir5
9153e24b96 Delete Enable GamesDows V1 2024-06-20 01:25:54 -07:00
jazir5
9e6b7096d9 Update README.md 2024-06-20 01:20:38 -07:00
jazir5
df6e357429 Update README.md 2024-06-20 01:20:11 -07:00
jazir5
e21fc465cd Create Enable GamesDows V1 2024-06-20 01:19:19 -07:00
jazir5
1dae7faaf8 Update README.md 2024-06-19 23:37:54 -07:00
jazir5
5558beb5d6 Delete WIP C++ executable andvisual studio command line tools installation.bat 2024-06-19 20:53:23 -07:00
jazir5
c604af7631 Delete Installvisualstudiobuildtools.bat 2024-06-19 20:53:15 -07:00
jazir5
374831a04e Merge pull request #1 from jazir555/jazir555-testing
Create Installvisualstudiobuildtools.bat
2024-06-19 18:26:35 -07:00
11 changed files with 1194 additions and 558 deletions

View File

@@ -1,38 +0,0 @@
@echo off
SETLOCAL EnableExtensions EnableDelayedExpansion
echo Reverting changes and setting default shell back to Explorer
:: Reset the default shell to Explorer
SET "EXPLORER_PATH=C:\Windows\explorer.exe"
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "C:\Windows\explorer.exe" /f
:: Define the default Steam folder path
SET "STEAM_FOLDER=C:\Program Files (x86)\Steam"
:: Delete the DelayedExplorerStart.bat script and related files
SET "SCRIPT_NAME=DelayedExplorerStart.bat"
SET "SCRIPT_PATH=%STEAM_FOLDER%\%SCRIPT_NAME%"
IF EXIST "%SCRIPT_PATH%" DEL "%SCRIPT_PATH%"
SET "VBS_NAME=RunBatchSilently.vbs"
SET "VBS_PATH=%STEAM_FOLDER%\%VBS_NAME%"
IF EXIST "%VBS_PATH%" DEL "%VBS_PATH%"
SET "XML_NAME=DelayedExplorerStartTask.xml"
SET "XML_PATH=%STEAM_FOLDER%\%XML_NAME%"
IF EXIST "%XML_PATH%" DEL "%XML_PATH%"
:: Delete the scheduled task
schtasks /delete /tn "RunDelayedExplorerStart" /f
:: Disable automatic logon
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon /t REG_SZ /d 0 /f
reg delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword /f
:: Enable the boot UI
bcdedit.exe -set {globalsettings} bootuxdisabled off
echo Reversion complete. Default settings restored.
pause

89
Disable Gamesdows V2.bat Normal file
View File

@@ -0,0 +1,89 @@
@echo off
SETLOCAL EnableExtensions EnableDelayedExpansion
:: Define paths and names
SET "STEAM_FOLDER=C:\Program Files (x86)\Steam"
SET "SCRIPT_NAME=DelayedExplorerStart.bat"
SET "SCRIPT_PATH=%STEAM_FOLDER%\%SCRIPT_NAME%"
SET "VBS_NAME=RunBatchSilently.vbs"
SET "VBS_PATH=%STEAM_FOLDER%\%VBS_NAME%"
SET "XML_NAME=DelayedExplorerStartTask.xml"
SET "XML_PATH=%STEAM_FOLDER%\%XML_NAME%"
echo ================================
echo Disabling GamesDows
echo ================================
:: Reset the default shell to Explorer
echo [1/5] Resetting default shell to Explorer...
REG ADD "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "C:\Windows\explorer.exe" /f
if ERRORLEVEL 1 (
echo [ERROR] Failed to reset the default shell.
goto end
) else (
echo [SUCCESS] Default shell reset to Explorer.
)
:: Terminate Steam processes to ensure changes take effect
echo [2/5] Terminating Steam processes...
taskkill /IM "Steam.exe" /F >nul 2>&1
taskkill /IM "SteamService.exe" /F >nul 2>&1
echo [INFO] Steam processes terminated.
:: Delete the DelayedExplorerStart.bat script
echo [3/5] Deleting DelayedExplorerStart.bat...
IF EXIST "%SCRIPT_PATH%" (
DEL /F /Q "%SCRIPT_PATH%"
if ERRORLEVEL 1 (
echo [WARNING] Could not delete %SCRIPT_NAME%.
) else (
echo [SUCCESS] %SCRIPT_NAME% deleted.
)
) else (
echo [INFO] %SCRIPT_NAME% does not exist.
)
:: Delete the RunBatchSilently.vbs script
echo [4/5] Deleting RunBatchSilently.vbs...
IF EXIST "%VBS_PATH%" (
DEL /F /Q "%VBS_PATH%"
if ERRORLEVEL 1 (
echo [WARNING] Could not delete %VBS_NAME%.
) else (
echo [SUCCESS] %VBS_NAME% deleted.
)
) else (
echo [INFO] %VBS_NAME% does not exist.
)
:: Delete the DelayedExplorerStartTask.xml file
echo [5/5] Deleting DelayedExplorerStartTask.xml...
IF EXIST "%XML_PATH%" (
DEL /F /Q "%XML_PATH%"
if ERRORLEVEL 1 (
echo [WARNING] Could not delete %XML_NAME%.
) else (
echo [SUCCESS] %XML_NAME% deleted.
)
) else (
echo [INFO] %XML_NAME% does not exist.
)
:: Delete the scheduled task
echo [6/6] Deleting scheduled task 'RunDelayedExplorerStart'...
schtasks /delete /tn "RunDelayedExplorerStart" /f >nul 2>&1
if ERRORLEVEL 1 (
echo [WARNING] Could not delete the scheduled task 'RunDelayedExplorerStart'.
) else (
echo [SUCCESS] Scheduled task 'RunDelayedExplorerStart' deleted.
)
echo.
echo ================================
echo GamesDows has been disabled successfully.
echo A system restart is recommended for all changes to take effect.
echo ================================
:end
ENDLOCAL
pause

View File

@@ -0,0 +1,137 @@
@echo off
SETLOCAL EnableExtensions EnableDelayedExpansion
echo Setting Playnite as default shell
SET "KEY_NAME=HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
SET "VALUE_NAME=Shell"
SET "PLAYNITE_FOLDER=%LOCALAPPDATA%\Playnite"
SET "PLAYNITE_PATH=%LOCALAPPDATA%\Playnite\Playnite.FullscreenApp.exe"
REG ADD "%KEY_NAME%" /v %VALUE_NAME% /t REG_SZ /d "%PLAYNITE_PATH%" /f
SET "SCRIPT_NAME=DelayedExplorerStart.bat"
SET "SCRIPT_PATH=%PLAYNITE_FOLDER%\%SCRIPT_NAME%"
SET "EXPLORER_PATH=C:\Windows\explorer.exe"
SET "VBS_NAME=RunBatchSilently.vbs"
SET "VBS_PATH=%PLAYNITE_FOLDER%\%VBS_NAME%"
echo Creating DelayedExplorerStart.bat script
echo Create the DelayedExplorerStart.bat script in the Playnite folder
(
echo @echo off
echo rem Check if user is logged on
echo whoami ^| find /i "%USERNAME%" ^>nul
echo if ERRORLEVEL 1 exit
echo rem Set Shell back to Explorer
echo REG ADD "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%EXPLORER_PATH%" /f
echo timeout /t 20 /nobreak ^>nul
echo start C:\Windows\explorer.exe
echo timeout /t 10 /nobreak ^>nul
echo REG ADD "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%PLAYNITE_PATH%" /f
) > "%SCRIPT_PATH%"
echo %VBS_PATH%
echo Creating RunBatchSilently.vbs script
rem Create VBScript to run the batch file silently
echo Set WshShell = CreateObject("WScript.Shell") > "%VBS_PATH%"
echo WshShell.Run chr(34)^&"%SCRIPT_PATH%"^&chr(34), 0, True >> "%VBS_PATH%"
echo Set WshShell = Nothing >> "%VBS_PATH%"
echo Create XML file for the scheduled task
SET XML_PATH=%PLAYNITE_FOLDER%\DelayedExplorerStartTask.xml
echo Delete the existing XML file if it exists
IF EXIST "%XML_PATH%" DEL "%XML_PATH%"
(
echo ^<?xml version="1.0" encoding="UTF-16"?^>
echo ^<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"^>
echo ^<RegistrationInfo^>
echo ^<Date^>2020-01-01T00:00:00^</Date^>
echo ^<Author^>"%USERNAME%"^</Author^>
echo ^<Description^>Run DelayedExplorerStart.bat at logon.^</Description^>
echo ^</RegistrationInfo^>
echo ^<Triggers^>
echo ^<LogonTrigger^>
echo ^<Enabled^>true^</Enabled^>
echo ^</LogonTrigger^>
echo ^</Triggers^>
echo ^<Principals^>
echo ^<Principal id="Author"^>
echo ^<UserId^>%USERNAME%</UserId^>
echo ^<LogonType^>InteractiveToken^</LogonType^>
echo ^<RunLevel^>HighestAvailable^</RunLevel^>
echo ^</Principal^>
echo ^</Principals^>
echo ^<Settings^>
echo ^<MultipleInstancesPolicy^>IgnoreNew^</MultipleInstancesPolicy^>
echo ^<DisallowStartIfOnBatteries^>false^</DisallowStartIfOnBatteries^>
echo ^<StopIfGoingOnBatteries^>false^</StopIfGoingOnBatteries^>
echo ^<AllowHardTerminate^>true^</AllowHardTerminate^>
echo ^<StartWhenAvailable^>true^</StartWhenAvailable^>
echo ^<RunOnlyIfNetworkAvailable^>false^</RunOnlyIfNetworkAvailable^>
echo ^<IdleSettings^>
echo ^<StopOnIdleEnd^>true^</StopOnIdleEnd^>
echo ^<RestartOnIdle^>false^</RestartOnIdle^>
echo ^</IdleSettings^>
echo ^<Enabled^>true^</Enabled^>
echo ^<Hidden^>false^</Hidden^>
echo ^<WakeToRun^>false^</WakeToRun^>
echo ^<ExecutionTimeLimit^>PT72H^</ExecutionTimeLimit^>
echo ^<Priority^>7^</Priority^>
echo ^</Settings^>
echo ^<Actions Context="Author"^>
echo ^<Exec^>
echo ^<Command^>wscript.exe^</Command^>
echo ^<Arguments^>"%VBS_PATH%"^</Arguments^>
echo ^</Exec^>
echo ^</Actions^>
echo ^</Task^>
) > "%XML_PATH%"
echo Delete the existing scheduled task if it exists
schtasks /delete /tn "RunDelayedExplorerStart" /f /ru "%USERNAME%"
echo Create the scheduled task using the XML file
schtasks /create /tn "RunDelayedExplorerStart" /xml "%XML_PATH%" /ru "%USERNAME%"
echo Delayed Explorer start script and VBScript created in Playnite folder.
echo Scheduled Task added to run the script at logon.
echo XML file for Scheduled Task created.
echo Disable the boot UI
bcdedit.exe -set {globalsettings} bootuxdisabled on
echo Disable Logon UI
reg add "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DisableLogonUI /t REG_DWORD /d 1 /f
echo Disable Visual Effects
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v VisualEffects /t REG_DWORD /d 3 /f
echo Increase File System Performance
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" /v NtfsDisableLastAccessUpdate /t REG_DWORD /d 1 /f
echo Optimize Paging File Performance
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v DisablePagingExecutive /t REG_DWORD /d 1 /f
echo Disable Startup Delay
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Serialize" /f
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Serialize" /v StartupDelayInMSec /t REG_DWORD /d 0 /f
echo Improve Windows Explorer Process Priority
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\explorer.exe\PerfOptions" /v CpuPriorityClass /t REG_DWORD /d 3 /f
echo Adjust Large System Cache
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v LargeSystemCache /t REG_DWORD /d 1 /f
echo Enabling No GUI Boot
bcdedit /set {current} quietboot on
echo Registry modifications are complete.
echo Playnite set as default shell.
echo Automatic logon enabled.
echo Boot UI disabled.
pause

View File

@@ -4,9 +4,9 @@ SETLOCAL EnableExtensions
echo Setting Steam Big Picture as default shell
echo Set Steam Big Picture as the default shell
SET "KEY_NAME=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
SET "KEY_NAME=HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
SET "VALUE_NAME=Shell"
SET "STEAM_PATH=C:\Program Files (x86)\Steam\Steam.exe -bigpicture -silent -nobootstrapupdate -skipinitialbootstrap -skipverifyfiles"
SET "STEAM_PATH=C:\Program Files (x86)\Steam\Steam.exe -bigpicture -nobootstrapupdate -skipinitialbootstrap -skipverifyfiles"
REG ADD "%KEY_NAME%" /v %VALUE_NAME% /t REG_SZ /d "%STEAM_PATH%" /f
@echo off
@@ -15,43 +15,48 @@ SETLOCAL EnableExtensions EnableDelayedExpansion
echo Define the default Steam folder path and script names
SET "STEAM_FOLDER=C:\Program Files (x86)\Steam"
SET "SCRIPT_NAME=DelayedExplorerStart.bat"
SET "SCRIPT_NAME1=StartSteamAsAdmin.bat"
SET "SCRIPT_PATH=%STEAM_FOLDER%\%SCRIPT_NAME%"
SET "SCRIPT_PATH1=%STEAM_FOLDER%\%SCRIPT_NAME1%"
SET "SCRIPT_PATH1=%STEAM_FOLDER%\%SCRIPT_NAME%"
SET "EXPLORER_PATH=C:\Windows\explorer.exe"
SET "MANIFEST_PATH=%STEAM_PATH%.manifest"
echo Creating StartSteamAsAdmin.bat script
:: Create the manifest file to force admin privileges for Steam
echo Creating manifest file for Steam to run as admin...
(
echo @echo off
echo Check if user is logged on
echo query user ^| find /i "%USERNAME%" ^>nul
echo if ERRORLEVEL 1 exit
echo Set Steam As Admin
echo REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%STEAM_PATH%" /f
) > "%SCRIPT_PATH1%"
echo ^<?xml version="1.0" encoding="UTF-8" standalone="yes"?^>
echo ^<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"^>
echo ^<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"^>
echo ^<security^>
echo ^<requestedPrivileges^>
echo ^<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/^>
echo ^</requestedPrivileges^>
echo ^</security^>
echo ^</trustInfo^>
echo ^</assembly^>
) > "%MANIFEST_PATH%"
:: Create VBScript to run the batch file silently
@echo off
SET "VBS_NAME1=RunSteamAsAdmin.vbs"
SET "VBS_PATH1=%STEAM_FOLDER%\%VBS_NAME1%"
echo Set WshShell = CreateObject("WScript.Shell") > "%VBS_PATH1%"
echo WshShell.Run chr(34)^&"%SCRIPT_PATH1%"^&chr(34), 0, True >> "%VBS_PATH1%"
echo Set WshShell = Nothing >> "%VBS_PATH1%"
echo Creating DelayedExplorerStart.bat script
echo Create the DelayedExplorerStart.bat script in the Steam folder
(
echo @echo off
echo Check if user is logged on
echo query user ^| find /i "%USERNAME%" ^>nul
echo rem Check if user is logged on
echo whoami ^| find /i "%%USERNAME%%" ^>nul
echo if ERRORLEVEL 1 exit
echo Set Shell back to Explorer
echo REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%EXPLORER_PATH%" /f
echo rem Set Shell back to Explorer
echo REG ADD "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%%EXPLORER_PATH%%" /f
echo timeout /t 20 /nobreak ^>nul
echo start C:\Windows\explorer.exe
echo rem Launch Explorer minimized without stealing focus by using a temporary VBScript
echo set "TempVBS=%%TEMP%%\LaunchExplorerMinimized.vbs"
echo (echo Set WshShell = CreateObject("WScript.Shell"))>"%%TempVBS%%"
echo (echo ' 7 = Minimized & no focus) >>"%%TempVBS%%"
echo (echo WshShell.Run "explorer.exe", 7, False)>>"%%TempVBS%%"
echo (echo Set WshShell = Nothing)>>"%%TempVBS%%"
echo cscript //nologo "%%TempVBS%%"
echo del "%%TempVBS%%"
echo timeout /t 10 /nobreak ^>nul
echo REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%STEAM_PATH%" /f
echo REG ADD "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%%STEAM_PATH%%" /f
) > "%SCRIPT_PATH%"
@@ -120,26 +125,21 @@ echo ^</Task^>
) > "%XML_PATH%"
echo Delete the existing scheduled task if it exists
schtasks /delete /tn "RunDelayedExplorerStart" /f
schtasks /delete /tn "RunDelayedExplorerStart" /f /ru "%USERNAME%"
echo Create the scheduled task using the XML file
schtasks /create /tn "RunDelayedExplorerStart" /xml "%XML_PATH%"
schtasks /create /tn "RunDelayedExplorerStart" /xml "%XML_PATH%" /ru "%USERNAME%"
echo Delayed Explorer start script and VBScript created in Steam folder.
echo Scheduled Task added to run the script at logon.
echo XML file for Scheduled Task created.
echo Enable automatic logon
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon /t REG_SZ /d 1 /f
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName /t REG_SZ /d "%USERNAME%" /f
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword /t REG_SZ /d "" /f
echo Disable the boot UI
bcdedit.exe -set {globalsettings} bootuxdisabled on
echo Disable Logon UI
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DisableLogonUI /t REG_DWORD /d 1 /f
reg add "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DisableLogonUI /t REG_DWORD /d 1 /f
echo Disable Visual Effects
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v VisualEffects /t REG_DWORD /d 3 /f
@@ -161,13 +161,9 @@ reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Mem
echo Enabling No GUI Boot
bcdedit /set {current} quietboot on
PowerShell -Command "Enable-WindowsOptionalFeature -Online -FeatureName 'DeviceLockdown' -All"
PowerShell -Command "Enable-WindowsOptionalFeature -Online -FeatureName 'Custom Logon' -All"
echo Registry modifications are complete.
echo Steam Big Picture set as default shell.
echo Automatic logon enabled.
echo Boot UI disabled.
pause

View File

@@ -1,192 +0,0 @@
@echo off
SETLOCAL EnableExtensions
echo Setting Steam Big Picture as default shell
echo Set Steam Big Picture as the default shell
SET "KEY_NAME=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
SET "VALUE_NAME=Shell"
SET "STEAM_PATH=C:\Program Files (x86)\Steam\Steam.exe -bigpicture -silent -nobootstrapupdate -skipinitialbootstrap -skipverifyfiles"
REG ADD "%KEY_NAME%" /v %VALUE_NAME% /t REG_SZ /d "%STEAM_PATH%" /f
@echo off
SETLOCAL EnableExtensions EnableDelayedExpansion
echo Define the default Steam folder path and script names
SET "STEAM_FOLDER=C:\Program Files (x86)\Steam"
SET "SCRIPT_NAME=DelayedExplorerStart.bat"
SET "SCRIPT_PATH=%STEAM_FOLDER%\%SCRIPT_NAME%"
SET "EXPLORER_PATH=C:\Windows\explorer.exe"
echo Creating DelayedExplorerStart.bat script
echo Create the DelayedExplorerStart.bat script in the Steam folder
(
echo @echo off
echo Check if user is logged on
echo query user ^| find /i "%USERNAME%" ^>nul
echo if ERRORLEVEL 1 exit
echo Set Shell back to Explorer
echo REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%EXPLORER_PATH%" /f
echo timeout /t 20 /nobreak ^>nul
echo start C:\Windows\explorer.exe
echo timeout /t 10 /nobreak ^>nul
echo REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%STEAM_PATH%" /f
) > "%SCRIPT_PATH%"
echo %VBS_PATH%
echo Creating RunBatchSilently.vbs script
:: Create VBScript to run the batch file silently
@echo off
SET "VBS_NAME=RunBatchSilently.vbs"
SET "VBS_PATH=%STEAM_FOLDER%\%VBS_NAME%"
echo Set WshShell = CreateObject("WScript.Shell") > "%VBS_PATH%"
echo WshShell.Run chr(34)^&"%SCRIPT_PATH%"^&chr(34), 0, True >> "%VBS_PATH%"
echo Set WshShell = Nothing >> "%VBS_PATH%"
echo Create XML file for the scheduled task
SET XML_PATH=%STEAM_FOLDER%\DelayedExplorerStartTask.xml
echo Delete the existing XML file if it exists
IF EXIST "%XML_PATH%" DEL "%XML_PATH%"
(
echo ^<?xml version="1.0" encoding="UTF-16"?^>
echo ^<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"^>
echo ^<RegistrationInfo^>
echo ^<Date^>2020-01-01T00:00:00^</Date^>
echo ^<Author^>"%USERNAME%"^</Author^>
echo ^<Description^>Run DelayedExplorerStart.bat at logon.^</Description^>
echo ^</RegistrationInfo^>
echo ^<Triggers^>
echo ^<LogonTrigger^>
echo ^<Enabled^>true^</Enabled^>
echo ^</LogonTrigger^>
echo ^</Triggers^>
echo ^<Principals^>
echo ^<Principal id="Author"^>
echo ^<UserId^>%USERNAME%</UserId^>
echo ^<LogonType^>InteractiveToken^</LogonType^>
echo ^<RunLevel^>HighestAvailable^</RunLevel^>
echo ^</Principal^>
echo ^</Principals^>
echo ^<Settings^>
echo ^<MultipleInstancesPolicy^>IgnoreNew^</MultipleInstancesPolicy^>
echo ^<DisallowStartIfOnBatteries^>false^</DisallowStartIfOnBatteries^>
echo ^<StopIfGoingOnBatteries^>false^</StopIfGoingOnBatteries^>
echo ^<AllowHardTerminate^>true^</AllowHardTerminate^>
echo ^<StartWhenAvailable^>true^</StartWhenAvailable^>
echo ^<RunOnlyIfNetworkAvailable^>false^</RunOnlyIfNetworkAvailable^>
echo ^<IdleSettings^>
echo ^<StopOnIdleEnd^>true^</StopOnIdleEnd^>
echo ^<RestartOnIdle^>false^</RestartOnIdle^>
echo ^</IdleSettings^>
echo ^<Enabled^>true^</Enabled^>
echo ^<Hidden^>false^</Hidden^>
echo ^<WakeToRun^>false^</WakeToRun^>
echo ^<ExecutionTimeLimit^>PT72H^</ExecutionTimeLimit^>
echo ^<Priority^>7^</Priority^>
echo ^</Settings^>
echo ^<Actions Context="Author"^>
echo ^<Exec^>
echo ^<Command^>wscript.exe^</Command^>
echo ^<Arguments^>"%VBS_PATH%"^</Arguments^>
echo ^</Exec^>
echo ^</Actions^>
echo ^</Task^>
) > "%XML_PATH%"
echo Delete the existing scheduled task if it exists
schtasks /delete /tn "RunDelayedExplorerStart" /f
echo Create the scheduled task using the XML file
schtasks /create /tn "RunDelayedExplorerStart" /xml "%XML_PATH%"
echo Delayed Explorer start script and VBScript created in Steam folder.
echo Scheduled Task added to run the script at logon.
echo XML file for Scheduled Task created.
echo Enable automatic logon
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon /t REG_SZ /d 1 /f
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName /t REG_SZ /d "%USERNAME%" /f
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword /t REG_SZ /d "" /f
echo Disable the boot UI
bcdedit.exe -set {globalsettings} bootuxdisabled on
echo Disable Logon UI
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DisableLogonUI /t REG_DWORD /d 1 /f
echo Disable Visual Effects
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v VisualEffects /t REG_DWORD /d 3 /f
echo Increase File System Performance
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" /v NtfsDisableLastAccessUpdate /t REG_DWORD /d 1 /f
@echo off
REM Disable Fast Startup to ensure changes take effect
powercfg -h off
REM Disable the lock screen (effective for Enterprise/Education)
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\Personalization" /v NoLockScreen /t REG_DWORD /d 1 /f
REM Set the logon background to black by setting a custom background
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\System" /v DisableLogonBackgroundImage /t REG_DWORD /d 1 /f
REM Create the backgrounds folder if it doesn't exist
if not exist "C:\Windows\System32\oobe\info\backgrounds" (
mkdir "C:\Windows\System32\oobe\info\backgrounds"
)
REM Generate a black image using PowerShell
powershell -command "Add-Type -AssemblyName System.Drawing; $width = 1920; $height = 1080; $bitmap = New-Object System.Drawing.Bitmap $width, $height; $graphics = [System.Drawing.Graphics]::FromImage($bitmap); $black = [System.Drawing.Brushes]::Black; $graphics.FillRectangle($black, 0, 0, $width, $height); $bitmap.Save('C:\Windows\System32\oobe\info\backgrounds\backgroundDefault.jpg', [System.Drawing.Imaging.ImageFormat]::Jpeg); $graphics.Dispose(); $bitmap.Dispose();"
REM Set the custom black background image for the lock screen
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\Personalization" /v LockScreenImage /t REG_SZ /d "C:\Windows\System32\oobe\info\backgrounds\backgroundDefault.jpg" /f
REM Do not display last signed-in user name
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v DontDisplayLastUserName /t REG_DWORD /d 1 /f
REM Do not display the username and other information during sign-in
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v DontDisplayLockedUserId /t REG_DWORD /d 3 /f
REM Disable Windows animations during sign-in
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v DisableStatusMessages /t REG_DWORD /d 1 /f
REM Disable verbose status messages
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v VerboseStatus /t REG_DWORD /d 0 /f
REM Disable the Welcome screen and reduce animation delay
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v DelayedDesktopSwitchTimeout /t REG_DWORD /d 0 /f
REM Disable lock screen transitions
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\System" /v DisableLockScreenAppNotifications /t REG_DWORD /d 1 /f
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\System" /v DisableLogonUIAnimations /t REG_DWORD /d 1 /f
echo Disable Startup Delay
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Serialize" /f
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Serialize" /v StartupDelayInMSec /t REG_DWORD /d 0 /f
echo Improve Windows Explorer Process Priority
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\explorer.exe\PerfOptions" /v CpuPriorityClass /t REG_DWORD /d 3 /f
echo Adjust Large System Cache
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v LargeSystemCache /t REG_DWORD /d 1 /f
echo Enabling No GUI Boot
bcdedit /set {current} quietboot on
PowerShell -Command "Enable-WindowsOptionalFeature -Online -FeatureName 'DeviceLockdown' -All"
PowerShell -Command "Enable-WindowsOptionalFeature -Online -FeatureName 'Custom Logon' -All"
echo Registry modifications are complete.
echo Steam Big Picture set as default shell.
echo Automatic logon enabled.
echo Boot UI disabled.
pause

View File

@@ -1,59 +0,0 @@
@echo off
setlocal enabledelayedexpansion
:: Log file
set log_file=%~dp0modify_winlogon.log
set temp_dir=C:\Temp
set vs_install_log=%temp_dir%\vs_buildtools_install.log
set vs_install_error_log=%temp_dir%\vs_buildtools_install_error.log
echo Script started at %date% %time% > %log_file%
echo Script started at %date% %time%
:: Ensure running as administrator
openfiles >nul 2>&1
if %errorlevel% neq 0 (
echo This script must be run as administrator! >> %log_file%
echo This script must be run as administrator!
pause
exit /b
)
:: Ensure Temp Directory Exists and has Correct Permissions
echo Ensuring temp directory exists and has correct permissions... >> %log_file%
if not exist "%temp_dir%" (
mkdir "%temp_dir%"
)
icacls "%temp_dir%" /grant Everyone:(F) >> %log_file% 2>&1
if %errorlevel% neq 0 (
echo Failed to set permissions for the temp directory. >> %log_file%
pause
exit /b
)
echo Temp directory permissions set. >> %log_file%
:: Download Visual Studio Build Tools Installer
set installer=%temp_dir%\vs_buildtools.exe
echo Downloading Visual Studio Build Tools... >> %log_file%
powershell -Command "Invoke-WebRequest -Uri 'https://aka.ms/vs/16/release/vs_buildtools.exe' -OutFile '%installer%'" >> %log_file% 2>&1
if %errorlevel% neq 0 (
echo Failed to download Visual Studio Build Tools installer. >> %log_file%
pause
exit /b
)
echo Visual Studio Build Tools installer downloaded successfully. >> %log_file%
:: Run Visual Studio Build Tools Installer
echo Running Visual Studio Build Tools installer... >> %log_file%
powershell -Command "Start-Process -Wait -FilePath '%installer%' -ArgumentList '--add Microsoft.VisualStudio.Workload.VCTools --includeRecommended --passive --norestart' -RedirectStandardOutput '%vs_install_log%' -RedirectStandardError '%vs_install_error_log%' -NoNewWindow" >> %log_file% 2>&1
if %errorlevel% neq 0 (
echo Failed to install Visual Studio Build Tools. >> %log_file%
echo Check the install log for details: %vs_install_log% and %vs_install_error_log% >> %log_file%
pause
exit /b
)
echo Visual Studio Build Tools installed successfully. >> %log_file%
:: Indicate end of script
echo Script completed successfully. >> %log_file%
pause

View File

@@ -1,11 +1,15 @@
Transform your Windows Computer into a Video Game console first, PC second!
**This script is a WIP. Currently, the main functionality works as intended. Steam Big Picture launches automatically when the OS boots, then explorer starts automatically after a delay, which allows you to exit to desktop via the menu without needing to launch a shortcut for Explorer.exe first.**
**This script is a WIP. Currently, the main functionality works as intended. Steam Big Picture (or Playnite) launches automatically when the OS boots with high priority set as as the shell, then explorer starts automatically after a delay, which allows you to exit to desktop via the menu without needing to launch a shortcut for Explorer.exe first.**
**Note: Steam or Playnite must be installed, you must be signed in to Steam if using the Steam variant, and finally the Steam Autostart entry in task manager must be disabled/deleted before running the script.**
**This script must be run as admin!**
# GamesDows
The Enable GamesDows batch script makes Windows boot straight into Steam Big Picture without displaying any Explorer UI elements to ensure a Game Console like experience on Windows. I made this because I have a Steam Deck and I want the experience to mirror that of Steam OS as closely as possible. However, this will work on any Windows PC, the commands are not specific to the Steam Deck.
The Enable GamesDows batch script makes Windows boot straight into Steam Big Picture or Playnite without displaying any Explorer UI elements to ensure a Game Console like experience on Windows. I made this because I have a Steam Deck and I want the experience to mirror that of Steam OS as closely as possible. However, this will work on any Windows PC, the commands are not specific to the Steam Deck.
**How the main functionality works: The enable Game Mode batch script sets steam big picture as the shell > batch launches steam as lower privileged (so the virtual mouse and keyboard don't work on system prompts such as task manager yet, it needs to run as admin to fix that. One of the 4 remaining problems) The enable Game Mode batch script creates a VBS script to suppress the command prompt window set as the shell at boot > The VBS script launches a second batch script created by the enable script run as admin > The second batch script is run by a scheduled task after a 20 second delay > delayed explorer batch script resets the shell to to explorer.exe, then launches explorer in the background so that it's possible to exit big picture without running a shortcut (menu performs as expected and exits directly to desktop).**
**How the main functionality works: The enable Game Mode batch script sets steam big picture as the shell and creates a manifest file in the Steam folder which allows it to always start as admin. The enable Game Mode batch script creates a VBS script to suppress the command prompt window when Explorer.exe launches in the background > The VBS script launches a second batch script created by the enable script creates and launches the second batch script via a scheduled task after a 20 second delay > delayed explorer batch script resets the shell to to explorer.exe, then launches explorer in the background so that it's possible to exit big picture without running a shortcut (menu performs as expected and exits directly to desktop without manually launching a separate shortcut).**
After another delay once explorer.exe is started (it retains elevated permissions once started), the default shell is reset to Steam Big Picture so that it boots directly to Big Picture as expected upon reboot.
@@ -56,12 +60,12 @@ What remains to be fixed:
1. Completely suppressing the taskbar from appearing when Windows Explorer automatically launches in the background. The taskbar displays temporarily for ~1 second when explorer.exe launches, which makes it appear over the Big Picture UI; and then it disappears. This is not intended behavior, and it is visually distracting.
2. Disabling the Windows welcome sign-in UI animation (user picture, user name, spinning wheel) entirely. Currently the Boot logo is removed as intended, and the script is set to log the user account which ran the script in automatically. The welcome sign-in animation still remains, and will be disabled in future versions of the script. Going to have to write a custom C++ application to do so since there is no off the shelf way to disable the Welcome Screen on Windows 11.
2. Disabling the Windows welcome sign-in UI animation (user picture, user name, spinning wheel) entirely. Currently the Boot logo is removed as intended, and the script is set to log the user account which ran the script in automatically. The welcome sign-in animation still remains, and will be disabled in future versions of the script. Going to have to write a custom C++ application or a custom credential provider to do so since there is no off the shelf way to disable the Welcome Screen on Windows 11.
3. Setting Steam to start as admin (VBS script to suppress the command prompt window set as the shell at boot > VBS script launches the batch script > batch sets steam big picture as the shell > batch launches steam as admin > delayed explorer batch script resets the shell to the VBS script so Steam launches as the default shell at boot.)
4. Disabling the Steam client update window which displays momentarily when Steam updates (this only occurs when the Steam Client has an update, otherwise it will not appear) before launching Big Picture.
3. Disabling the Steam client update window which displays momentarily when Steam updates (this only occurs when the Steam Client has an update, otherwise it will not appear) before launching Big Picture.
**Please let me know if you have any issues with existing functionality and I'll try to get the bugs fixed up if any arise.**
I will gladly take PRs to fix the 4 remaining issues if anyone knows how to solve them.
I will gladly take PRs to fix the 3 remaining issues if anyone knows how to solve them.
**Note: If for any reason explorer doesn't start and you get a black screen and cannot view the desktop, it needs to be launched manually via task manager by launching explorer.exe. It needs to be set as the shell first before it is launched from task manager for the desktop to appear when launched a single time, otherwise it will just launch a file browser window. Due to this limitation, you must start explorer.exe twice from task manager to load the Desktop**

View File

@@ -0,0 +1 @@
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "C:\Windows\explorer.exe" /f

View File

@@ -1,222 +0,0 @@
@echo off
setlocal enabledelayedexpansion
:: Log file
set log_file=%~dp0modify_winlogon.log
set compile_log=%~dp0compile.log
echo Script started at %date% %time% > %log_file%
:: Ensure running as administrator
openfiles >nul 2>&1
if %errorlevel% neq 0 (
echo This script must be run as administrator! >> %log_file%
echo This script must be run as administrator!
pause
exit /b
)
:: Paths and filenames
set exe_name=CustomLogonUI.exe
set cpp_code=CustomLogonUI.cpp
set src_path=%~dp0
set log_file=%~dp0modify_winlogon.log
set dst_path=C:\Windows\System32
set backup_logonui=logonui_backup.exe
set temp_dir=C:\Temp
set installer=%temp_dir%\vs_buildtools.exe
set vs_install_log=%temp_dir%\vs_buildtools_install.log
set vs_install_error_log=%temp_dir%\vs_buildtools_install_error.log
echo Script started at %date% %time% > %log_file%
echo Script started at %date% %time%
:: Ensure Temp Directory Exists and has Correct Permissions
echo Ensuring temp directory exists and has correct permissions... >> %log_file%
if not exist "%temp_dir%" (
mkdir "%temp_dir%"
)
icacls "%temp_dir%" /grant Everyone:(F) >> %log_file% 2>&1
if %errorlevel% neq 0 (
echo Failed to set permissions for the temp directory. >> %log_file%
pause
exit /b
)
echo Temp directory permissions set. >> %log_file%
:: Step 2: Install .NET Framework 4.8 (NetFx4-AdvSrvs)
echo Installing .NET Framework 4.8 (NetFx4-AdvSrvs)... >> %log_file%
echo Installing .NET Framework 4.8 (NetFx4-AdvSrvs)...
dism /online /enable-feature /featurename:NetFx4-AdvSrvs /All /NoRestart >> %log_file% 2>&1
echo DISM command exit code: %errorlevel% >> %log_file%
if %errorlevel% neq 0 (
echo Failed to install .NET Framework 4.8 (NetFx4-AdvSrvs). >> %log_file%
echo Failed to install .NET Framework 4.8 (NetFx4-AdvSrvs). Check the log for details: %log_file%
exit /b
)
echo .NET Framework 4.8 (NetFx4-AdvSrvs) installed successfully. >> %log_file%
echo .NET Framework 4.8 (NetFx4-AdvSrvs) installed successfully.
:: Step 4: Install Windows SDK
echo Downloading Windows SDK... >> %log_file%
echo Downloading Windows SDK...
powershell -command "Invoke-WebRequest -Uri 'https://go.microsoft.com/fwlink/?linkid=2120843' -OutFile '%sdk_installer%'" >> %log_file% 2>&1
if %errorlevel% neq 0 (
echo Failed to download Windows SDK installer. >> %log_file%
echo Failed to download Windows SDK installer.
exit /b
)
echo Windows SDK installer downloaded successfully. >> %log_file%
echo Windows SDK installer downloaded successfully.
echo Installing Windows SDK... >> %log_file%
echo Installing Windows SDK...
start /wait "" "%sdk_installer%" /Quiet /NoRestart /Features + /InstallPath "%ProgramFiles%\Windows Kits\10" >> %log_file% 2>&1
if %errorlevel% neq 0 (
echo Failed to install Windows SDK. >> %log_file%
echo Failed to install Windows SDK.
exit /b
)
echo Windows SDK installed successfully. >> %log_file%
echo Windows SDK installed successfully.
@echo off
:: Install Visual C++ Redist
echo Downloading Visual C++ Redistributable installers...
:: Create a temporary directory to store the installers
set "TMP_DIR=%TEMP%\vcredist_installers"
mkdir "%TMP_DIR%"
:: Download the latest Visual C++ Redistributable installers
bitsadmin /transfer "VC2015-2022 x64" https://aka.ms/vs/17/release/vc_redist.x64.exe "%TMP_DIR%\VC_redist.x64.exe"
bitsadmin /transfer "VC2015-2022 x86" https://aka.ms/vs/17/release/vc_redist.x86.exe "%TMP_DIR%\VC_redist.x86.exe"
echo Installing Visual C++ Redistributable packages...
:: Install Visual C++ 2015-2022 Redistributable
start /wait "%TMP_DIR%\VC_redist.x64.exe" /install /quiet /norestart
start /wait "%TMP_DIR%\VC_redist.x86.exe" /install /quiet /norestart
echo Visual C++ Redistributable packages installed successfully!
:: Clean up the temporary directory
rmdir /s /q "%TMP_DIR%"
pause
:: Step 6: Download and Install Visual Studio Community Edition
echo Downloading Visual Studio Community Edition... >> %log_file%
echo Downloading Visual Studio Community Edition...
powershell -command "Invoke-WebRequest -Uri 'https://aka.ms/vs/16/release/vs_community.exe' -OutFile '%vs_community_installer%'" >> %log_file% 2>&1
if %errorlevel% neq 0 (
echo Failed to download Visual Studio Community installer. >> %log_file%
echo Failed to download Visual Studio Community installer.
exit /b
)
echo Visual Studio Community installer downloaded successfully. >> %log_file%
echo Visual Studio Community installer downloaded successfully.
echo Installing Visual Studio Community Edition... >> %log_file%
echo Installing Visual Studio Community Edition...
start /wait "" "%vs_community_installer%" --add Microsoft.VisualStudio.Workload.CoreEditor --includeRecommended --passive --norestart --log %vs_install_log% --loglevel verbose
if %errorlevel% neq 0 (
echo Failed to install Visual Studio Community. Check the install log for details: %vs_install_log% >> %log_file%
echo Failed to install Visual Studio Community. Check the install log for details: %vs_install_log%
exit /b
)
echo Visual Studio Community installed successfully. >> %log_file%
echo Visual Studio Community installed successfully.
:: Download Visual Studio Build Tools Installer
set installer=%temp_dir%\vs_buildtools.exe
echo Downloading Visual Studio Build Tools... >> %log_file%
powershell -Command "Invoke-WebRequest -Uri 'https://aka.ms/vs/16/release/vs_buildtools.exe' -OutFile '%installer%'" >> %log_file% 2>&1
if %errorlevel% neq 0 (
echo Failed to download Visual Studio Build Tools installer. >> %log_file%
pause
exit /b
)
echo Visual Studio Build Tools installer downloaded successfully. >> %log_file%
:: Run Visual Studio Build Tools Installer
echo Running Visual Studio Build Tools installer... >> %log_file%
powershell -Command "Start-Process -Wait -FilePath '%installer%' -ArgumentList '--add Microsoft.VisualStudio.Workload.VCTools --includeRecommended --passive --norestart' -RedirectStandardOutput '%vs_install_log%' -RedirectStandardError '%vs_install_error_log%' -NoNewWindow" >> %log_file% 2>&1
if %errorlevel% neq 0 (
echo Failed to install Visual Studio Build Tools. >> %log_file%
echo Check the install log for details: %vs_install_log% and %vs_install_error_log% >> %log_file%
pause
exit /b
)
echo Visual Studio Build Tools installed successfully. >> %log_file%
:: Indicate end of script
echo Script completed successfully. >> %log_file%
pause
:: Step 5: Create the C++ source file using PowerShell
echo Creating C++ source file using PowerShell... >> %log_file%
powershell -command "Add-Content -Path '%cpp_code%' -Value '#include <windows.h>'; Add-Content -Path '%cpp_code%' -Value 'int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)'; Add-Content -Path '%cpp_code%' -Value '{'; Add-Content -Path '%cpp_code%' -Value ' return 0;'; Add-Content -Path '%cpp_code%' -Value '}';"
if %errorlevel% neq 0 (
echo Failed to create the C++ source file using PowerShell. >> %log_file%
echo Failed to create the C++ source file using PowerShell.
pause
exit /b
)
echo C++ source file created successfully using PowerShell. >> %log_file%
:: Step 6: Compile the C++ code to create the custom executable
echo Compiling the C++ source file... >> %log_file%
call "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" x86 >> %log_file% 2>&1
if %errorlevel% neq 0 (
echo Failed to set up Visual Studio environment. >> %log_file%
echo Failed to set up Visual Studio environment.
pause
exit /b
)
cl %cpp_code% /Fe:%exe_name% /link /SUBSYSTEM:WINDOWS > %compile_log% 2>&1
if %errorlevel% neq 0 (
echo Compilation failed. >> %log_file%
echo Compilation failed. Check the compile.log for details. >> %log_file%
pause
exit /b
)
echo C++ source file compiled successfully. >> %log_file%
:: Step 7: Ensure the custom executable was created
if not exist "%src_path%%exe_name%" (
echo Custom executable %exe_name% not found in %src_path%. >> %log_file%
echo Custom executable %exe_name% not found in %src_path%.
pause
exit /b
)
echo Custom executable found. >> %log_file%
pause
:: Step 8: Backup the original logonui.exe
echo Backing up the original logonui.exe... >> %log_file%
copy "%dst_path%\logonui.exe" "%dst_path%\%backup_logonui%" >> %log_file% 2>&1
if %errorlevel% neq 0 (
echo Failed to backup the original logonui.exe. >> %log_file%
echo Failed to backup the original logonui.exe.
pause
exit /b
)
echo Original logonui.exe backed up successfully. >> %log_file%
pause
:: Step 9: Replace the original logonui.exe with the custom executable
echo Replacing the original logonui.exe with the custom executable... >> %log_file%
copy "%src_path%%exe_name%" "%dst_path%\logonui.exe" >> %log_file% 2>&1
if %errorlevel% neq 0 (
echo Failed to replace logonui.exe. >> %log_file%
echo Failed to replace logonui.exe.
pause
exit /b
)
echo logonui.exe replaced successfully. >> %log_file%
pause
echo All changes applied successfully. Please restart your computer. >> %log_file%
echo All changes applied successfully. Please restart your computer.
pause

830
decky_builder.py Normal file
View File

@@ -0,0 +1,830 @@
import os
import subprocess
import shutil
import argparse
from pathlib import Path
import sys
import time
import PyInstaller
import atexit
import requests
import psutil
import re
class DeckyBuilder:
def __init__(self, release: str = None):
self.release = release or self.prompt_for_version()
self.root_dir = Path(__file__).resolve().parent
self.app_dir = self.root_dir / "app"
self.src_dir = self.root_dir / "src"
self.dist_dir = self.root_dir / "dist"
self.homebrew_dir = self.dist_dir / "homebrew"
self.temp_files = [] # Track temporary files for cleanup
atexit.register(self.cleanup) # Register cleanup on exit
# Setup user homebrew directory
self.user_home = Path.home()
self.user_homebrew_dir = self.user_home / "homebrew"
self.homebrew_folders = [
"data",
"logs",
"plugins",
"services",
"settings",
"themes"
]
def cleanup(self):
"""Clean up temporary files and directories"""
try:
# Clean up any temporary files we created
for temp_file in self.temp_files:
if os.path.exists(temp_file):
try:
if os.path.isfile(temp_file):
os.remove(temp_file)
elif os.path.isdir(temp_file):
shutil.rmtree(temp_file, ignore_errors=True)
except Exception as e:
print(f"Warning: Failed to remove temporary file {temp_file}: {e}")
# Clean up PyInstaller temp files
for dir_name in ['build', 'dist']:
dir_path = self.root_dir / dir_name
if dir_path.exists():
try:
shutil.rmtree(dir_path, ignore_errors=True)
except Exception as e:
print(f"Warning: Failed to remove {dir_name} directory: {e}")
# Clean up PyInstaller spec files
for spec_file in self.root_dir.glob("*.spec"):
try:
os.remove(spec_file)
except Exception as e:
print(f"Warning: Failed to remove spec file {spec_file}: {e}")
except Exception as e:
print(f"Warning: Error during cleanup: {e}")
def safe_remove_directory(self, path):
"""Safely remove a directory with retries for Windows"""
max_retries = 3
retry_delay = 1 # seconds
for attempt in range(max_retries):
try:
if path.exists():
# On Windows, sometimes we need to remove .git directory separately
git_dir = path / '.git'
if git_dir.exists():
for item in git_dir.glob('**/*'):
if item.is_file():
try:
item.chmod(0o777) # Give full permissions
item.unlink()
except:
pass
shutil.rmtree(path, ignore_errors=True)
return
except Exception as e:
print(f"Attempt {attempt + 1} failed to remove {path}: {str(e)}")
if attempt < max_retries - 1:
time.sleep(retry_delay)
continue
else:
print(f"Warning: Could not fully remove {path}. Continuing anyway...")
def setup_directories(self):
"""Setup directory structure"""
print("Setting up directories...")
# Clean up any existing directories
if self.app_dir.exists():
self.safe_remove_directory(self.app_dir)
if self.src_dir.exists():
self.safe_remove_directory(self.src_dir)
if self.homebrew_dir.exists():
self.safe_remove_directory(self.homebrew_dir)
# Create fresh directories
self.src_dir.mkdir(parents=True, exist_ok=True)
self.homebrew_dir.mkdir(parents=True, exist_ok=True)
def setup_homebrew(self):
"""Setup homebrew directory structure"""
print("Setting up homebrew directory structure...")
# Create dist directory
(self.homebrew_dir / "dist").mkdir(parents=True, exist_ok=True)
# Setup homebrew directory structure for both temp and user directories
print("Setting up homebrew directory structure...")
for directory in [self.homebrew_dir, self.user_homebrew_dir]:
if not directory.exists():
directory.mkdir(parents=True)
for folder in self.homebrew_folders:
folder_path = directory / folder
if not folder_path.exists():
folder_path.mkdir(parents=True)
def clone_repository(self):
"""Clone Decky Loader repository and checkout specific version"""
print(f"\nCloning Decky Loader repository version: {self.release}")
# Clean up existing directory
if os.path.exists(self.app_dir):
print("Removing existing repository...")
self.safe_remove_directory(self.app_dir)
try:
# Clone the repository
subprocess.run([
'git', 'clone', '--no-checkout', # Don't checkout anything yet
'https://github.com/SteamDeckHomebrew/decky-loader.git',
str(self.app_dir)
], check=True)
os.chdir(self.app_dir)
# Fetch all refs
subprocess.run(['git', 'fetch', '--all', '--tags'], check=True)
# Try to checkout the exact version first
try:
subprocess.run(['git', 'checkout', self.release], check=True)
except subprocess.CalledProcessError:
# If exact version fails, try to find the commit for pre-releases
if '-pre' in self.release:
# Get all tags and their commit hashes
result = subprocess.run(
['git', 'ls-remote', '--tags', 'origin'],
capture_output=True, text=True, check=True
)
# Find the commit hash for our version
for line in result.stdout.splitlines():
commit_hash, ref = line.split('\t')
ref = ref.replace('refs/tags/', '')
ref = ref.replace('^{}', '') # Remove annotated tag suffix
if ref == self.release:
print(f"Found commit {commit_hash} for version {self.release}")
subprocess.run(['git', 'checkout', commit_hash], check=True)
break
else:
raise Exception(f"Could not find commit for version {self.release}")
else:
raise
print(f"Successfully checked out version: {self.release}")
# Create version files in key locations with the requested version
version_files = [
'.loader.version',
'frontend/.loader.version',
'backend/.loader.version',
'backend/decky_loader/.loader.version'
]
for version_file in version_files:
file_path = os.path.join(self.app_dir, version_file)
os.makedirs(os.path.dirname(file_path), exist_ok=True)
with open(file_path, 'w') as f:
f.write(self.release) # Use the requested version
except subprocess.CalledProcessError as e:
raise Exception(f"Failed to clone/checkout repository: {str(e)}")
finally:
os.chdir(self.root_dir)
def build_frontend(self):
"""Build frontend files"""
print("Building frontend...")
batch_file = None
original_dir = os.getcwd()
try:
frontend_dir = self.app_dir / "frontend"
if not frontend_dir.exists():
raise Exception(f"Frontend directory not found at {frontend_dir}")
print(f"Changing to frontend directory: {frontend_dir}")
os.chdir(frontend_dir)
# Create .loader.version file with the release tag
version_file = frontend_dir / ".loader.version"
with open(version_file, "w") as f:
f.write(self.release)
self.temp_files.append(str(version_file))
# Create a batch file to run the commands
batch_file = frontend_dir / "build_frontend.bat"
with open(batch_file, "w") as f:
f.write("@echo off\n")
f.write("call pnpm install\n")
f.write("if %errorlevel% neq 0 exit /b %errorlevel%\n")
f.write("call pnpm run build\n")
f.write("if %errorlevel% neq 0 exit /b %errorlevel%\n")
self.temp_files.append(str(batch_file))
print("Running build commands...")
result = subprocess.run([str(batch_file)], check=True, capture_output=True, text=True, shell=True)
print(result.stdout)
except subprocess.CalledProcessError as e:
print(f"Command failed: {e.cmd}")
print(f"Output: {e.output}")
print(f"Error: {e.stderr}")
raise Exception(f"Error building frontend: Command failed - {str(e)}")
except Exception as e:
print(f"Error building frontend: {str(e)}")
raise
finally:
# Always return to original directory
os.chdir(original_dir)
def prepare_backend(self):
"""Prepare backend files for building."""
print("Preparing backend files...")
print("Copying files according to Dockerfile structure...")
# Create src directory if it doesn't exist
os.makedirs(self.src_dir, exist_ok=True)
# Copy backend files from app/backend/decky_loader to src/decky_loader
print("Copying backend files...")
shutil.copytree(os.path.join(self.app_dir, "backend", "decky_loader"),
os.path.join(self.src_dir, "decky_loader"),
dirs_exist_ok=True)
# Copy static, locales, and plugin directories to maintain decky_loader structure
os.makedirs(os.path.join(self.src_dir, "decky_loader"), exist_ok=True)
shutil.copytree(os.path.join(self.app_dir, "backend", "decky_loader", "static"),
os.path.join(self.src_dir, "decky_loader", "static"),
dirs_exist_ok=True)
shutil.copytree(os.path.join(self.app_dir, "backend", "decky_loader", "locales"),
os.path.join(self.src_dir, "decky_loader", "locales"),
dirs_exist_ok=True)
shutil.copytree(os.path.join(self.app_dir, "backend", "decky_loader", "plugin"),
os.path.join(self.src_dir, "decky_loader", "plugin"),
dirs_exist_ok=True)
# Create legacy directory
os.makedirs(os.path.join(self.src_dir, "src", "legacy"), exist_ok=True)
# Copy main.py to src directory
shutil.copy2(os.path.join(self.app_dir, "backend", "main.py"),
os.path.join(self.src_dir, "main.py"))
# Create version file in the src directory
version_file = os.path.join(self.src_dir, ".loader.version")
with open(version_file, "w") as f:
f.write(self.release)
print("Backend preparation completed successfully!")
return True
def install_requirements(self):
"""Install Python requirements"""
print("Installing Python requirements...")
try:
# Try both requirements.txt and pyproject.toml
requirements_file = self.app_dir / "backend" / "requirements.txt"
pyproject_file = self.app_dir / "backend" / "pyproject.toml"
if requirements_file.exists():
subprocess.run([
sys.executable, "-m", "pip", "install", "--user", "-r", str(requirements_file)
], check=True)
elif pyproject_file.exists():
# Install core dependencies directly instead of using poetry
dependencies = [
"aiohttp>=3.8.1",
"psutil>=5.9.0",
"fastapi>=0.78.0",
"uvicorn>=0.17.6",
"python-multipart>=0.0.5",
"watchdog>=2.1.7",
"requests>=2.27.1",
"setuptools>=60.0.0",
"wheel>=0.37.1",
"winregistry>=1.1.1; platform_system == 'Windows'",
"pywin32>=303; platform_system == 'Windows'"
]
# Install each dependency
for dep in dependencies:
try:
subprocess.run([
sys.executable, "-m", "pip", "install", "--user", dep
], check=True)
except subprocess.CalledProcessError as e:
print(f"Warning: Failed to install {dep}: {str(e)}")
continue
else:
print("Warning: No requirements.txt or pyproject.toml found")
except Exception as e:
print(f"Error installing requirements: {str(e)}")
raise
def add_defender_exclusion(self, path):
"""Add Windows Defender exclusion for a path"""
try:
subprocess.run([
"powershell",
"-Command",
f"Add-MpPreference -ExclusionPath '{path}'"
], check=True, capture_output=True)
return True
except:
print("Warning: Could not add Windows Defender exclusion. You may need to run as administrator or manually add an exclusion.")
return False
def remove_defender_exclusion(self, path):
"""Remove Windows Defender exclusion for a path"""
try:
subprocess.run([
"powershell",
"-Command",
f"Remove-MpPreference -ExclusionPath '{path}'"
], check=True, capture_output=True)
except:
print("Warning: Could not remove Windows Defender exclusion.")
def build_executables(self):
"""Build executables using PyInstaller"""
print("\nBuilding executables...")
# Read version from .loader.version
version_file = os.path.join(self.app_dir, '.loader.version')
if not os.path.exists(version_file):
raise Exception("Version file not found. Run clone_repository first.")
with open(version_file, 'r') as f:
version = f.read().strip()
# Normalize version for Python packaging
# Convert v3.0.5-pre1 to 3.0.5rc1
py_version = version.lstrip('v') # Remove v prefix
if '-pre' in py_version:
py_version = py_version.replace('-pre', 'rc')
print(f"Building version: {version} (Python package version: {py_version})")
original_dir = os.getcwd()
backend_dir = os.path.join(self.app_dir, "backend")
dist_dir = os.path.join(backend_dir, "dist")
# Add Windows Defender exclusion for build directories
added_exclusion = self.add_defender_exclusion(backend_dir)
try:
os.chdir(backend_dir)
# Create setup.py with the correct version
setup_py = """
from setuptools import setup, find_packages
setup(
name="decky_loader",
version="%s",
packages=find_packages(),
package_data={
'decky_loader': [
'locales/*',
'static/*',
'.loader.version'
],
},
install_requires=[
'aiohttp>=3.8.1',
'certifi>=2022.6.15',
'packaging>=21.3',
'psutil>=5.9.1',
'requests>=2.28.1',
],
)
""" % py_version
with open("setup.py", "w") as f:
f.write(setup_py)
# Install the package in development mode
subprocess.run([sys.executable, "-m", "pip", "install", "-e", "."], check=True)
# Common PyInstaller arguments
pyinstaller_args = [
sys.executable,
"-m",
"PyInstaller",
"--clean",
"--noconfirm",
"pyinstaller.spec"
]
# First build console version
print("Building PluginLoader.exe (console version)...")
os.environ.pop('DECKY_NOCONSOLE', None) # Ensure env var is not set
subprocess.run(pyinstaller_args, check=True)
# Then build no-console version
print("Building PluginLoader_noconsole.exe...")
os.environ['DECKY_NOCONSOLE'] = '1'
subprocess.run(pyinstaller_args, check=True)
# Clean up environment
os.environ.pop('DECKY_NOCONSOLE', None)
# Copy the built executables to dist
os.makedirs(os.path.join(self.root_dir, "dist"), exist_ok=True)
if os.path.exists(os.path.join("dist", "PluginLoader.exe")):
shutil.copy2(
os.path.join("dist", "PluginLoader.exe"),
os.path.join(self.root_dir, "dist", "PluginLoader.exe")
)
else:
raise Exception("PluginLoader.exe not found after build")
if os.path.exists(os.path.join("dist", "PluginLoader_noconsole.exe")):
shutil.copy2(
os.path.join("dist", "PluginLoader_noconsole.exe"),
os.path.join(self.root_dir, "dist", "PluginLoader_noconsole.exe")
)
else:
raise Exception("PluginLoader_noconsole.exe not found after build")
print("Successfully built executables")
except subprocess.CalledProcessError as e:
raise Exception(f"Failed to build executables: {str(e)}")
finally:
if added_exclusion:
self.remove_defender_exclusion(backend_dir)
os.chdir(original_dir)
def install_files(self):
"""Install files to homebrew directory"""
print("\nInstalling files to homebrew directory...")
# Create homebrew directory if it doesn't exist
homebrew_dir = os.path.join(os.path.expanduser("~"), "homebrew")
services_dir = os.path.join(homebrew_dir, "services")
os.makedirs(services_dir, exist_ok=True)
try:
# Copy PluginLoader.exe and PluginLoader_noconsole.exe
for exe_name in ["PluginLoader.exe", "PluginLoader_noconsole.exe"]:
exe_source = os.path.join(self.root_dir, "dist", exe_name)
exe_dest = os.path.join(services_dir, exe_name)
if not os.path.exists(exe_source):
raise Exception(f"{exe_name} not found at {exe_source}")
shutil.copy2(exe_source, exe_dest)
# Create .loader.version file
version_file = os.path.join(services_dir, ".loader.version")
with open(version_file, "w") as f:
f.write(self.release)
print("Successfully installed files")
except Exception as e:
raise Exception(f"Failed to copy files to homebrew: {str(e)}")
def install_nodejs(self):
"""Install Node.js v18.18.0 with npm"""
print("Installing Node.js v18.18.0...")
try:
# First check if Node.js v18.18.0 is already installed in common locations
nodejs_paths = [
r"C:\Program Files\nodejs\node.exe",
r"C:\Program Files (x86)\nodejs\node.exe",
os.path.expandvars(r"%APPDATA%\Local\Programs\nodejs\node.exe")
]
# Try to use existing Node.js 18.18.0 first
for node_path in nodejs_paths:
if os.path.exists(node_path):
try:
version = subprocess.run([node_path, "--version"], capture_output=True, text=True).stdout.strip()
if version.startswith("v18.18.0"):
print(f"Found Node.js {version} at {node_path}")
node_dir = os.path.dirname(node_path)
if node_dir not in os.environ["PATH"]:
os.environ["PATH"] = node_dir + os.pathsep + os.environ["PATH"]
return True
except:
continue
# If we get here, we need to install Node.js 18.18.0
print("Installing Node.js v18.18.0...")
# Create temp directory for downloads
temp_dir = self.root_dir / "temp"
temp_dir.mkdir(exist_ok=True)
# Download Node.js installer
node_installer = temp_dir / "node-v18.18.0-x64.msi"
if not node_installer.exists():
print("Downloading Node.js installer...")
try:
import urllib.request
urllib.request.urlretrieve(
"https://nodejs.org/dist/v18.18.0/node-v18.18.0-x64.msi",
node_installer
)
except Exception as e:
print(f"Error downloading Node.js installer: {str(e)}")
raise
# Install Node.js silently
print("Installing Node.js (this may take a few minutes)...")
try:
# First try to uninstall any existing Node.js using PowerShell
uninstall_cmd = 'Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -like "*Node.js*" } | ForEach-Object { $_.Uninstall() }'
subprocess.run(["powershell", "-Command", uninstall_cmd], capture_output=True, timeout=60)
# Wait a bit for uninstallation to complete
time.sleep(5)
# Now install Node.js 18.18.0
subprocess.run(
["msiexec", "/i", str(node_installer), "/qn", "ADDLOCAL=ALL"],
check=True,
timeout=300 # 5 minute timeout
)
print("Waiting for Node.js installation to complete...")
time.sleep(10)
# Add to PATH
nodejs_path = r"C:\Program Files\nodejs"
npm_path = os.path.join(os.environ["APPDATA"], "npm")
# Update PATH for current process
if nodejs_path not in os.environ["PATH"]:
os.environ["PATH"] = nodejs_path + os.pathsep + os.environ["PATH"]
if npm_path not in os.environ["PATH"]:
os.environ["PATH"] = npm_path + os.pathsep + os.environ["PATH"]
# Verify installation
node_version = subprocess.run(["node", "--version"], capture_output=True, text=True, check=True).stdout.strip()
if not node_version.startswith("v18.18.0"):
raise Exception(f"Wrong Node.js version installed: {node_version}")
npm_version = subprocess.run(["npm", "--version"], capture_output=True, text=True, check=True).stdout.strip()
print(f"Successfully installed Node.js {node_version} with npm {npm_version}")
# Clean up
self.safe_remove_directory(temp_dir)
return True
except subprocess.TimeoutExpired:
print("Installation timed out. Please try installing Node.js v18.18.0 manually.")
raise
except Exception as e:
print(f"Installation failed: {str(e)}")
raise
except Exception as e:
print(f"Error installing Node.js: {str(e)}")
raise
def setup_steam_config(self):
"""Configure Steam for Decky Loader"""
print("Configuring Steam...")
try:
# Add -dev argument to Steam shortcut
import winreg
steam_path = None
# Try to find Steam installation path from registry
try:
with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\WOW6432Node\Valve\Steam") as key:
steam_path = winreg.QueryValueEx(key, "InstallPath")[0]
except:
try:
with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Valve\Steam") as key:
steam_path = winreg.QueryValueEx(key, "InstallPath")[0]
except:
print("Steam installation not found in registry")
if steam_path:
steam_exe = Path(steam_path) / "steam.exe"
if steam_exe.exists():
# Create .cef-enable-remote-debugging file
debug_file = Path(steam_path) / ".cef-enable-remote-debugging"
debug_file.touch()
print("Created .cef-enable-remote-debugging file")
# Create/modify Steam shortcut
desktop = Path.home() / "Desktop"
shortcut_path = desktop / "Steam.lnk"
import pythoncom
from win32com.client import Dispatch
shell = Dispatch("WScript.Shell")
shortcut = shell.CreateShortCut(str(shortcut_path))
shortcut.Targetpath = str(steam_exe)
shortcut.Arguments = "-dev"
shortcut.save()
print("Created Steam shortcut with -dev argument")
except Exception as e:
print(f"Error configuring Steam: {str(e)}")
raise
def setup_autostart(self):
"""Setup PluginLoader to run at startup"""
print("Setting up autostart...")
try:
# Get the path to the no-console executable
services_dir = os.path.join(os.path.expanduser("~"), "homebrew", "services")
plugin_loader = os.path.join(services_dir, "PluginLoader_noconsole.exe")
# Get the Windows Startup folder path
startup_folder = os.path.join(os.environ["APPDATA"], "Microsoft", "Windows", "Start Menu", "Programs", "Startup")
# Create a batch file in the startup folder
startup_bat = os.path.join(startup_folder, "start_decky.bat")
# Write the batch file with proper path escaping
with open(startup_bat, "w") as f:
f.write(f'@echo off\n"{plugin_loader}"')
print(f"Created startup script at: {startup_bat}")
return True
except Exception as e:
print(f"Error setting up autostart: {str(e)}")
return False
def check_python_version(self):
"""Check if correct Python version is being used"""
print("Checking Python version...")
if sys.version_info.major != 3 or sys.version_info.minor != 11:
raise Exception("This script requires Python 3.11. Please run using decky_builder.bat")
def check_dependencies(self):
"""Check and install required dependencies"""
print("Checking dependencies...")
try:
# Check Node.js and npm first
try:
# Use shell=True to find node in PATH
node_version = subprocess.run("node --version", shell=True, check=True, capture_output=True, text=True).stdout.strip()
npm_version = subprocess.run("npm --version", shell=True, check=True, capture_output=True, text=True).stdout.strip()
# Check if version meets requirements
if not node_version.startswith("v18."):
print(f"Node.js {node_version} found, but v18.18.0 is required")
self.install_nodejs()
else:
print(f"Node.js {node_version} with npm {npm_version} is installed")
except Exception as e:
print(f"Node.js/npm not found or error: {str(e)}")
self.install_nodejs()
# Install pnpm globally if not present
try:
pnpm_version = subprocess.run("pnpm --version", shell=True, check=True, capture_output=True, text=True).stdout.strip()
print(f"pnpm version {pnpm_version} is installed")
except:
print("Installing pnpm globally...")
subprocess.run("npm i -g pnpm", shell=True, check=True)
pnpm_version = subprocess.run("pnpm --version", shell=True, check=True, capture_output=True, text=True).stdout.strip()
print(f"Installed pnpm version {pnpm_version}")
# Check git
try:
git_version = subprocess.run("git --version", shell=True, check=True, capture_output=True, text=True).stdout.strip()
print(f"{git_version} is installed")
except:
raise Exception("git is not installed. Please install git from https://git-scm.com/downloads")
print("All dependencies are satisfied")
except Exception as e:
print(f"Error checking dependencies: {str(e)}")
raise
def get_release_versions(self):
"""Get list of available release versions"""
print("Fetching available versions...")
try:
response = requests.get(
"https://api.github.com/repos/SteamDeckHomebrew/decky-loader/releases"
)
response.raise_for_status()
releases = response.json()
# Split releases into stable and pre-release
stable_releases = []
pre_releases = []
for release in releases:
version = release['tag_name']
if release['prerelease']:
pre_releases.append(version)
else:
stable_releases.append(version)
# Sort versions and take only the latest 3 of each
stable_releases.sort(reverse=True)
pre_releases.sort(reverse=True)
stable_releases = stable_releases[:3]
pre_releases = pre_releases[:3]
# Combine and sort all versions
all_versions = stable_releases + pre_releases
all_versions.sort(reverse=True)
return all_versions
except requests.RequestException as e:
raise Exception(f"Failed to fetch release versions: {str(e)}")
def prompt_for_version(self):
"""Prompt the user to select a version to install."""
versions = self.get_release_versions()
print("\nAvailable versions:")
print("Stable versions:")
stable_count = 0
for i, version in enumerate(versions):
if '-pre' not in version:
print(f"{i+1}. {version}")
stable_count += 1
print("\nPre-release versions:")
for i, version in enumerate(versions):
if '-pre' in version:
print(f"{i+1}. {version}")
while True:
try:
choice = input("\nSelect a version (1-{}): ".format(len(versions)))
index = int(choice) - 1
if 0 <= index < len(versions):
return versions[index]
print("Invalid selection, please try again.")
except ValueError:
print("Invalid input, please enter a number.")
def terminate_processes(self):
"""Terminate running instances of executables that may interfere with the build."""
for proc in psutil.process_iter(['pid', 'name', 'exe']):
if proc.info['name'] in ['PluginLoader.exe', 'PluginLoader_noconsole.exe']:
try:
proc.terminate()
proc.wait()
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
pass
def run(self):
"""Run the build and installation process."""
# Terminate interfering processes
self.terminate_processes()
try:
print("Starting Decky Loader build process...")
self.check_python_version()
self.check_dependencies()
self.setup_directories()
self.clone_repository()
self.setup_homebrew()
self.build_frontend()
self.prepare_backend()
self.install_requirements()
self.build_executables()
self.install_files()
self.setup_steam_config()
self.setup_autostart()
print("\nBuild process completed successfully!")
print("\nNext steps:")
print("1. Close Steam if it's running")
print("2. Launch Steam using the new shortcut on your desktop")
print("3. Enter Big Picture Mode")
print("4. Hold the STEAM button and press A to access the Decky menu")
except Exception as e:
print(f"Error during build process: {str(e)}")
raise
finally:
self.cleanup()
def main():
parser = argparse.ArgumentParser(description='Build and Install Decky Loader for Windows')
parser.add_argument('--release', required=False, default=None,
help='Release version/branch to build (if not specified, will prompt for version)')
args = parser.parse_args()
try:
builder = DeckyBuilder(args.release)
builder.run()
print(f"\nDecky Loader has been installed to: {builder.user_homebrew_dir}")
except Exception as e:
print(f"Error during build process: {str(e)}")
sys.exit(1)
if __name__ == "__main__":
main()

90
install_decky.bat Normal file
View File

@@ -0,0 +1,90 @@
@echo off
setlocal EnableDelayedExpansion
:: Check for admin privileges
net session >nul 2>&1
if %errorlevel% neq 0 (
echo This script requires administrator privileges.
echo Please run this script as administrator.
pause
exit /b 1
)
:: Check Python version
echo Checking Python version...
where python >nul 2>nul
if %errorlevel% neq 0 (
echo Python is not installed or not in PATH
echo Please install Python and try again
pause
exit /b 1
)
for /f "tokens=*" %%i in ('python -c "import sys; print(sys.executable)"') do set PYTHON_PATH=%%i
:: Check dependencies
echo Checking dependencies...
:: Check Node.js and npm
where node >nul 2>nul
if %errorlevel% neq 0 (
echo Node.js is not installed or not in PATH
echo Please install Node.js and try again
pause
exit /b 1
)
for /f "tokens=*" %%i in ('node -v') do set NODE_VERSION=%%i
for /f "tokens=*" %%i in ('npm -v') do set NPM_VERSION=%%i
echo Node.js !NODE_VERSION! with npm !NPM_VERSION! is installed
:: Add npm global path to PATH
for /f "tokens=*" %%i in ('npm config get prefix') do set NPM_PREFIX=%%i
set "PATH=%NPM_PREFIX%;%PATH%"
:: Ensure pnpm is installed globally
where pnpm >nul 2>nul
if %errorlevel% neq 0 (
echo Installing pnpm globally...
npm install -g pnpm
)
:: Get pnpm version
for /f "tokens=*" %%i in ('pnpm -v') do set PNPM_VERSION=%%i
echo pnpm version !PNPM_VERSION! is installed
:: Check git
where git >nul 2>nul
if %errorlevel% neq 0 (
echo git is not installed or not in PATH
echo Please install git and try again
pause
exit /b 1
)
for /f "tokens=*" %%i in ('git --version') do set GIT_VERSION=%%i
echo !GIT_VERSION! is installed
echo All dependencies are satisfied
:: Get the directory of this batch file
set "SCRIPT_DIR=%~dp0"
:: Run the Python script with full environment
echo Running Decky Loader installer...
"%PYTHON_PATH%" "%SCRIPT_DIR%decky_builder.py"
if errorlevel 1 (
echo Error during build process: %ERRORLEVEL%
:: Clean up any remaining processes
taskkill /F /IM python.exe /T >nul 2>&1
taskkill /F /IM node.exe /T >nul 2>&1
exit /b %ERRORLEVEL%
)
:: Clean up any remaining processes
taskkill /F /IM python.exe /T >nul 2>&1
taskkill /F /IM node.exe /T >nul 2>&1
echo Build completed successfully.
pause