diff --git a/README.md b/README.md index c33d561..8e26348 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,9 @@ There have even been people with older Intel and AMD systems who have been locke ## Bad Microsoft! -If you are interested, you can read my original write up on discovering the CPU check [here](../../tree/old-kb4012218-19). +If you are interested, you can read my original write up on discovering the CPU check [here](../../tree/old-kb4012218-19). -Basically, inside a file called `wuaueng.dll` there are two functions: [`IsDeviceServiceable(void)`](https://gist.github.com/zeffy/e5ec266952932bc905eb0cbc6ed72185) and [`IsCPUSupported(void)`](https://gist.github.com/zeffy/1a8f8984d2bec97ae24af63a76278694). `IsDeviceServiceable(void)` is essentially a wrapper around `IsCPUSupported(void)` that caches the result it recieves and returns it on subsequent calls. +Basically, inside a file called `wuaueng.dll` there are two functions: [`IsDeviceServiceable(void)`](https://gist.github.com/zeffy/e5ec266952932bc905eb0cbc6ed72185) and [`IsCPUSupported(void)`](https://gist.github.com/zeffy/1a8f8984d2bec97ae24af63a76278694). `IsDeviceServiceable(void)` is essentially a wrapper around `IsCPUSupported(void)` that caches the result it recieves and recycles it on subsequent calls. My patch takes advantage of this result caching behavior by setting the "hasn't run once" value to `FALSE` and the cached result to `TRUE`. @@ -28,4 +28,21 @@ My patch takes advantage of this result caching behavior by setting the "hasn't - `wufuc` determines what service host process the Windows Update service (`wuauserv`) runs in, and injects itself into it. - Once injected, it applies a hook to `LoadLibraryEx` that automatically patches `wuaueng.dll` when it is loaded. - Any previously loaded `wuaueng.dll` is also patched. -- **No system files are modified!** + +### Several improvements over my script-based approach: +- **No system files are modified!*** +- Heuristic byte signature patching persists over new updates. +- C is best language. +- No external dependencies except for Microsoft Visual C++ 2015 Redistributable. + +### How to install/uninstall? + +Just run move the `wufuc` folder to wherever you want and run `install_wufuc.bat` as administrator. + +To uninstall run `uninstall_wufuc.bat` as administrator. + +To temporarily disable the patch, just go to the Task Scheduler and disable the `wufuc.{ ... }` task, then restart your computer. + +### How do I remove your old patch and use this instead? + +I've included a utility script called `repair_wuaueng.dll.bat` that will initiate an sfc scan and attempt to automatically revert any changes made to `wuaueng.dll`. diff --git a/install/install_wufuc.bat b/install/install_wufuc.bat index fcb25c1..b6fceb1 100644 --- a/install/install_wufuc.bat +++ b/install/install_wufuc.bat @@ -82,9 +82,9 @@ for %%a in (%SUPPORTED_HOTFIXES%) do ( ) echo. -echo Warning - Detected that no supported updates are installed! +echo WARNING - Detected that no supported updates are installed! echo. -echo This can be a false warning, if you are sure you know you need wufuc you +echo This can be a false warning, if you are certain that need wufuc then you echo can continue (there will be no side effects even if you don't need it) set /p CONTINUE=Enter 'Y' if you still want to continue: @@ -101,18 +101,26 @@ set /p CONTINUE=Enter 'Y' if you want to install wufuc: if /I not "%CONTINUE%"=="Y" goto :cancel echo. +set "vcredist_path=%~dp0_Redist\vcredist_%WINDOWS_ARCHITECTURE%.exe" +if exist "%vcredist_path%" ( + echo Installing Microsoft Visual C^+^+ 2017 Redistributable ^(%WINDOWS_ARCHITECTURE%^)... + "%vcredist_path%" /passive /norestart + goto :install +) + +echo Couldn't locate and install Microsoft Visual C^+^+ 2017 Redistributable ^(%WINDOWS_ARCHITECTURE%^). + +set /p CONTINUE=Enter 'Y' if you still want to continue: +if /I not "%CONTINUE%"=="Y" goto :cancel +echo. + :install set "wufuc_task=wufuc.{72EEE38B-9997-42BD-85D3-2DD96DA17307}" schtasks /Create /XML "%~dp0wufuc.xml" /TN "%wufuc_task%" /F -echo %ERRORLEVEL% schtasks /Change /TN "%wufuc_task%" /TR "'%systemroot%\system32\rundll32.exe' """%wufuc_dll%""",Rundll32Entry" -echo %ERRORLEVEL% schtasks /Change /TN "%wufuc_task%" /ENABLE -echo %ERRORLEVEL% rundll32 "%wufuc_dll%",Rundll32Unload -echo %ERRORLEVEL% schtasks /Run /TN "%wufuc_task%" -echo %ERRORLEVEL% echo. echo Installed and started wufuc! @@ -129,4 +137,4 @@ exit echo. echo Canceled by user, press any key to exit... pause >nul -exit \ No newline at end of file +exit diff --git a/install/repair_wuaueng.dll.bat b/install/repair_wuaueng.dll.bat new file mode 100644 index 0000000..771209d --- /dev/null +++ b/install/repair_wuaueng.dll.bat @@ -0,0 +1,51 @@ +@echo off +title install wufuc (repair wuaueng.dll) - v0.6 +:: 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 . + +echo Copyright (C) 2017 zeffy +echo This program comes with ABSOLUTELY NO WARRANTY. +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 +) + +:confirmation +echo You may want to use this script if you previously modified wuaueng.dll +echo with "aio-wuaueng.dll-patch.bat" or by other means. +echo. +echo This will run the sfc utility and it will restore any changes that were made. + +set /p CONTINUE=Enter 'Y' if you want to repair wuaueng.dll: +if /I not "%CONTINUE%"=="Y" goto :cancel + +sfc /SCANFILE="%systemroot%\System32\wuaueng.dll" + +:die +echo. +echo Press any key to exit... +pause >nul +exit + +:cancel +echo. +echo Canceled by user, press any key to exit... +pause >nul +exit diff --git a/install/uninstall_wufuc.bat b/install/uninstall_wufuc.bat index b0585d5..d747282 100644 --- a/install/uninstall_wufuc.bat +++ b/install/uninstall_wufuc.bat @@ -68,4 +68,4 @@ exit echo. echo Canceled by user, press any key to exit... pause >nul -exit \ No newline at end of file +exit