diff --git a/README.md b/README.md index a2ce599..51b01aa 100644 --- a/README.md +++ b/README.md @@ -44,21 +44,12 @@ If you are interested, you can read my original write up on discovering the CPU - Byte pattern-based patching, which means it will usually keep working even after new updates come out. - Absolutely zero dependencies. -## How to use unattended feature in the batch script setup +## How to use unattended feature in the batch setup scripts -`wufuc_setup.bat` supports three command line parameters, that can be combined to change the behavior of the script: +`install_wufuc.bat` and `uninstall_wufuc.bat` both support two command line parameters that can used alone or be combined to change the behavior of the scripts: -- `/NORESTART` - automatically declines rebooting after setup finishes. -- `/UNATTENDED` - skips all prompts for user interaction. **Beware: this will automatically restart your PC, unless combined with `/NORESTART`.** -- `/UNINSTALL` - skips the prompt that asks if you want to install or uninstall. - -You can also change the default behavior of the script by modifying these lines near the beginning of the script: - -```bat -call :set_uninstall 0 -call :set_unattended 0 -call :set_norestart 0 -``` +- `/NORESTART` - Automatically declines rebooting after the setup finishes. +- `/UNATTENDED` - Skips all prompts for user interaction, and automatically restarts unless `/NORESTART` is also specified. ## How it works diff --git a/setup-batch/setup_wufuc.bat b/setup-batch/install_wufuc.bat similarity index 63% rename from setup-batch/setup_wufuc.bat rename to setup-batch/install_wufuc.bat index 6444b40..c792cad 100644 --- a/setup-batch/setup_wufuc.bat +++ b/setup-batch/install_wufuc.bat @@ -1,5 +1,4 @@ @echo off -title wufuc installer :: Copyright (C) 2017 zeffy :: This program is free software: you can redistribute it and/or modify @@ -15,9 +14,6 @@ title wufuc installer :: You should have received a copy of the GNU General Public License :: along with this program. If not, see . -call :set_uninstall 0 -call :set_unattended 0 -call :set_norestart 0 echo Copyright ^(C^) 2017 zeffy echo This program comes with ABSOLUTELY NO WARRANTY. @@ -25,34 +21,47 @@ echo This is free software, and you are welcome to redistribute it echo under certain conditions; see COPYING.txt for details. echo. -fltmc >nul 2>&1 || ( - echo This batch script requires administrator privileges. Right-click on - echo %~nx0 and select "Run as administrator". - goto :die -) +call :set_uninstall 0 +call :set_unattended 0 +call :set_norestart 0 :loop_args -if [%1]==[] goto :check_requirements -if /I "%1"=="/UNATTENDED" call :set_unattended 1 +if [%1]==[] goto :check_admin if /I "%1"=="/UNINSTALL" call :set_uninstall 1 +if /I "%1"=="/UNATTENDED" call :set_unattended 1 if /I "%1"=="/NORESTART" call :set_norestart 1 -shift +shift /1 goto :loop_args +:set_uninstall + set "UNINSTALL=%~1" + exit /b +:set_unattended + set "UNATTENDED=%~1" + exit /b +:set_norestart + set "NORESTART=%~1" + exit /b + +:check_admin +fltmc >nul 2>&1 || ( + echo This batch script requires administrator privileges. Right-click on + echo the script and select "Run as administrator". + goto :die +) -:check_requirements echo Checking system requirements... set "systemfolder=%systemroot%\System32" if /I "%PROCESSOR_ARCHITECTURE%"=="AMD64" ( - goto :is_x64 + goto :is_x64 ) else ( - if /I "%PROCESSOR_ARCHITEW6432%"=="AMD64" ( - goto :is_wow64 - ) - if /I "%PROCESSOR_ARCHITECTURE%"=="x86" ( - goto :is_x86 - ) + if /I "%PROCESSOR_ARCHITEW6432%"=="AMD64" ( + goto :is_wow64 + ) + if /I "%PROCESSOR_ARCHITECTURE%"=="x86" ( + goto :is_x86 + ) ) goto :unsupported @@ -63,16 +72,14 @@ goto :dll_exists :is_wow64 set "systemfolder=%systemroot%\Sysnative" - :is_x64 set "WINDOWS_ARCHITECTURE=x64" set "wufuc_dll=wufuc64.dll" :dll_exists set "wufuc_dll_fullpath=%~dp0%wufuc_dll%" -if exist "%wufuc_dll_fullpath%" ( - goto :get_ver -) +if exist "%wufuc_dll_fullpath%" goto :check_winver + echo ERROR - Could not find %wufuc_dll_fullpath%! echo. echo This most likely means you tried to clone the repository. @@ -87,21 +94,14 @@ echo This error could also mean that your anti-virus deleted or quarantined %wuf echo in which case, you will need to make an exception and restore it. goto :die -:get_ver -call :get_filever "%wufuc_dll_fullpath%" -if "%UNINSTALL%"=="1" ( - title wufuc uninstaller - v%Version% -) else ( - title wufuc installer - v%Version% -) - +:check_winver ver | findstr " 6\.1\." >nul && ( - echo Detected supported operating system: Windows 7 %WINDOWS_ARCHITECTURE% - goto :check_mode + echo Detected supported operating system: Windows 7 %WINDOWS_ARCHITECTURE% + goto :check_mode ) ver | findstr " 6\.3\." >nul && ( - echo Detected supported operating system: Windows 8.1 %WINDOWS_ARCHITECTURE% - goto :check_mode + echo Detected supported operating system: Windows 8.1 %WINDOWS_ARCHITECTURE% + goto :check_mode ) :unsupported @@ -119,29 +119,8 @@ set "regkey=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Executi set "wufuc_dll_target=%systemfolder%\%wufuc_dll%" if "%UNINSTALL%"=="1" goto :confirm_uninstall -if "%UNATTENDED%"=="1" goto :install -:pick_mode -echo. -echo Please enter one of the following numbers: -echo. -echo 1 - Install -echo 2 - Uninstall -echo. -set /p INSTALL_MODE=Would you like to install or uninstall wufuc? - -if "%INSTALL_MODE%"=="1" ( - goto :confirm_install -) -if "%INSTALL_MODE%"=="2" ( - call :set_uninstall 1 - goto :confirm_uninstall -) -echo. -echo Invalid choice, please enter 1 for install or 2 for uninstall. -goto :pick_mode - -:: BEGIN INSTALL MODE +:: BEGIN INSTALL MODE ///////////////////////////////////////////////////////// :confirm_install if "%UNATTENDED%"=="1" goto :install echo. @@ -151,23 +130,23 @@ echo systems with Intel Kaby Lake, AMD Ryzen, or other unsupported processors. echo. echo Please be absolutely sure you really need wufuc before proceeding. echo. -set /p CONTINUE_INSTALL=Enter 'Y' if you want to install wufuc: +for /f "tokens=*" %%i in ('wmic /output:stdout datafile where "name='%wufuc_dll_fullpath:\=\\%'" get Version /value ^| find "="') do set "%%i" +set /p CONTINUE_INSTALL=Enter 'Y' if you want to install wufuc %Version%: if /I "%CONTINUE_INSTALL%"=="Y" goto :install goto :cancel :install call :uninstall copy /Y "%wufuc_dll_fullpath%" "%wufuc_dll_target%" && ( - reg add "%regkey%" /v GlobalFlag /t REG_DWORD /d 0x00000100 /f - reg add "%regkey%" /v VerifierDlls /t REG_SZ /d "%wufuc_dll%" /f + reg add "%regkey%" /v VerifierDlls /t REG_SZ /d "%wufuc_dll%" /f + reg add "%regkey%" /v GlobalFlag /t REG_DWORD /d 0x00000100 /f ) echo. -echo wufuc has been successfully installed! echo You will need to restart your PC to finish installing wufuc. goto :confirm_restart -:: END INSTALL MODE +:: END INSTALL MODE /////////////////////////////////////////////////////////// -:: BEGIN UNINSTALL MODE +:: BEGIN UNINSTALL MODE /////////////////////////////////////////////////////// :confirm_uninstall if "%UNATTENDED%"=="1" goto :uninstall_stub echo. @@ -181,23 +160,28 @@ echo You will need to restart your PC to finish uninstalling wufuc. goto :confirm_restart :uninstall -call :remove_legacy -reg query "%regkey%" >nul 2>&1 || ( - goto :delete_target -) -reg delete "%regkey%" /f || ( - goto :skip_delete -) + sfc /SCANFILE="%systemroot%\System32\wuaueng.dll" + set "wufuc_task=wufuc.{72EEE38B-9997-42BD-85D3-2DD96DA17307}" + schtasks /Query /TN "%wufuc_task%" >nul 2>&1 && ( + schtasks /Delete /TN "%wufuc_task%" /F + ) + rundll32 "%wufuc_dll_fullpath%",RUNDLL32_LegacyUnload + reg query "%regkey%" >nul 2>&1 || ( + goto :delete_target + ) + reg delete "%regkey%" /f || ( + goto :skip_delete + ) :delete_target -set "del_ext=.del-%random%" -if exist "%wufuc_dll_target%" ( - ren "%wufuc_dll_target%" "%wufuc_dll%%del_ext%" && ( - rundll32 "%wufuc_dll_fullpath%",RUNDLL32_DeleteFile "%wufuc_dll_target%%del_ext%" - ) -) + set "del_ext=.del-%random%" + if exist "%wufuc_dll_target%" ( + ren "%wufuc_dll_target%" "%wufuc_dll%%del_ext%" && ( + rundll32 "%wufuc_dll_fullpath%",RUNDLL32_DeleteFile "%wufuc_dll_target%%del_ext%" + ) + ) :skip_delete -exit /b -:: END UNINSTALL MODE + exit /b +:: END UNINSTALL MODE ///////////////////////////////////////////////////////// :confirm_restart if "%NORESTART%"=="1" goto :die @@ -206,45 +190,22 @@ echo. set /p CONTINUE_RESTART=Enter 'Y' if you would like to restart now: if /I "%CONTINUE_RESTART%"=="Y" goto :restart goto :die - :restart shutdown /r /t 0 goto :die :die echo. -echo Press any key to exit... -pause >nul -exit +if "%UNATTENDED%"=="1" ( + timeout /T 5 /NOBREAK +) else ( + echo Press any key to exit... + pause >nul +) +exit /b :cancel echo. echo Canceled by user, press any key to exit... pause >nul -exit - -:get_filever -set "file=%~1" -for /f "tokens=*" %%i in ('wmic /output:stdout datafile where "name='%file:\=\\%'" get Version /value ^| find "="') do set "%%i" -exit /b - -:remove_legacy -sfc /SCANFILE="%systemroot%\System32\wuaueng.dll" -set "wufuc_task=wufuc.{72EEE38B-9997-42BD-85D3-2DD96DA17307}" -schtasks /Query /TN "%wufuc_task%" >nul 2>&1 && ( - schtasks /Delete /TN "%wufuc_task%" /F -) -rundll32 "%wufuc_dll_fullpath%",RUNDLL32_LegacyUnload -exit /b - -:set_unattended -set "UNATTENDED=%~1" -exit /b - -:set_uninstall -set "UNINSTALL=%~1" -exit /b - -:set_norestart -set "NORESTART=%~1" exit /b diff --git a/setup-batch/uninstall_wufuc.bat b/setup-batch/uninstall_wufuc.bat new file mode 100644 index 0000000..01199e1 --- /dev/null +++ b/setup-batch/uninstall_wufuc.bat @@ -0,0 +1,17 @@ +@echo off +:: Copyright (C) 2017 zeffy + +:: This program is free software: you can redistribute it and/or modify +:: it under the terms of the GNU General Public License as published by +:: the Free Software Foundation, either version 3 of the License, or +:: (at your option) any later version. + +:: This program is distributed in the hope that it will be useful, +:: but WITHOUT ANY WARRANTY; without even the implied warranty of +:: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +:: GNU General Public License for more details. + +:: You should have received a copy of the GNU General Public License +:: along with this program. If not, see . + +call "%~dp0install_wufuc.bat" /UNINSTALL %* diff --git a/wufuc.sln b/wufuc.sln index 9ebb027..c21b9cb 100644 --- a/wufuc.sln +++ b/wufuc.sln @@ -10,9 +10,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution .gitignore = .gitignore appveyor.yml = appveyor.yml CONTRIBUTING.md = CONTRIBUTING.md + setup-batch\install_wufuc.bat = setup-batch\install_wufuc.bat LICENSE = LICENSE README.md = README.md - setup-batch\setup_wufuc.bat = setup-batch\setup_wufuc.bat + setup-batch\uninstall_wufuc.bat = setup-batch\uninstall_wufuc.bat EndProjectSection EndProject Global