zapret-discord-youtube/bat/service.bat
2025-06-21 15:23:25 +03:00

563 lines
14 KiB
Batchfile
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@echo off
@chcp 65001 >nul
set "LOCAL_VERSION=1.8.1"
:: Обработка аргументов
if "%~1"=="" goto help
if /i "%~1"=="install" goto service_install
if /i "%~1"=="remove" goto service_remove
if /i "%~1"=="status" goto service_status
if /i "%~1"=="diagnostics" goto service_diagnostics
if /i "%~1"=="updates" goto service_check_updates
if /i "%~1"=="game" goto game_switch
if /i "%~1"=="ipset" goto ipset_switch
if /i "%~1"=="ipset_update" goto ipset_update
if /i "%~1"=="status_zapret" call :test_service zapret soft & exit /b
if /i "%~1"=="check_updates" call :service_check_updates soft & exit /b
if /i "%~1"=="load_game_filter" call :game_switch_status & exit /b
:help
echo Использование: service.bat [install^|remove^|status^|diagnostics^|updates^|game^|ipset^|ipset_update]
echo Дополнительно: status_zapret, check_updates, load_game_filter
exit /b
:: External commands
if "%~1"=="status_zapret" (
call :test_service zapret soft
exit /b
)
if "%~1"=="check_updates" (
call :service_check_updates soft
exit /b
)
if "%~1"=="load_game_filter" (
call :game_switch_status
exit /b
)
if "%1"=="admin" (
echo Started with admin rights
) else (
echo Requesting admin rights...
powershell -Command "Start-Process 'cmd.exe' -ArgumentList '/c \"\"%~f0\" admin\"' -Verb RunAs"
exit /b
)
:: MENU ================================
setlocal EnableDelayedExpansion
:menu
cls
call :ipset_switch_status
call :game_switch_status
set "menu_choice=null"
echo =======================
echo 1. Install Service
echo 2. Remove Services
echo 3. Check Status
echo 4. Run Diagnostics
echo 5. Check Updates
echo 6. Switch Game Filter (%GameFilterStatus%)
echo 7. Switch ipset (%IPsetStatus%)
echo 8. Update ipset list
echo 0. Exit
set /p menu_choice=Enter choice (0-8):
if "%menu_choice%"=="1" goto service_install
if "%menu_choice%"=="2" goto service_remove
if "%menu_choice%"=="3" goto service_status
if "%menu_choice%"=="4" goto service_diagnostics
if "%menu_choice%"=="5" goto service_check_updates
if "%menu_choice%"=="6" goto game_switch
if "%menu_choice%"=="7" goto ipset_switch
if "%menu_choice%"=="8" goto ipset_update
if "%menu_choice%"=="0" exit /b
goto menu
:: STATUS ==============================
:service_status
cls
chcp 437 > nul
echo Checking services and tasks...
call :test_service zapret
call :test_service WinDivert
tasklist /FI "IMAGENAME eq winws.exe" | find /I "winws.exe" > nul
setlocal enabledelayedexpansion
if !errorlevel!==0 (
call :PrintGreen "Bypass is ACTIVE"
) else (
call :PrintRed "Bypass NOT FOUND"
)
pause
exit /k
:: --- Подпрограммы ---
:PrintGreen
echo %~1
exit /b
:PrintRed
echo %~1
exit /b
:test_service
set "ServiceName=%~1"
set "ServiceStatus="
for /f "tokens=3 delims=: " %%A in ('sc query "%ServiceName%" ^| findstr /i "STATE"') do set "ServiceStatus=%%A"
set "ServiceStatus=%ServiceStatus: =%"
if "%ServiceStatus%"=="RUNNING" (
if "%~2"=="soft" (
echo "%ServiceName%" is ALREADY RUNNING as service, use "service.bat" and choose "Remove Services" first if you want to run standalone bat.
pause
exit /b
) else (
echo "%ServiceName%" service is RUNNING.
)
) else if not "%~2"=="soft" (
echo "%ServiceName%" service is NOT running.
)
exit /b
:: REMOVE ==============================
:service_remove
cls
chcp 65001 > nul
set SRVCNAME=zapret
net stop %SRVCNAME%
sc delete %SRVCNAME%
net stop "WinDivert"
sc delete "WinDivert"
net stop "WinDivert14"
sc delete "WinDivert14"
pause
:: INSTALL =============================
:service_install
cls
chcp 65001 > nul
:: Включаем поддержку !variable!
setlocal enabledelayedexpansion
:: Main
cd /d "%~dp0"
set "BIN_PATH=%~dp0bin\"
set "LISTS_PATH=%~dp0lists\"
:: Searching for .bat files in current folder, except files that start with "service"
echo Pick one of the options:
set "count=0"
for %%f in (*.bat) do (
set "filename=%%~nxf"
if /i not "!filename:~0,7!"=="service" (
set /a count+=1
echo !count!. %%f
set "file!count!=%%f"
)
)
endlocal
:: Choosing file
set "choice="
set /p "choice=Input file index (number): "
if "!choice!"=="" goto :eof
set "selectedFile=!file%choice%!"
if not defined selectedFile (
echo Invalid choice, exiting...
pause
)
:: Args that should be followed by value
set "args_with_value=sni"
:: Parsing args (mergeargs: 2=start param|3=arg with value|1=params args|0=default)
set "args="
set "capture=0"
set "mergeargs=0"
set QUOTE="
for /f "tokens=*" %%a in ('type "!selectedFile!"') do (
set "line=%%a"
echo !line! | findstr /i "%BIN%winws.exe" >nul
if not errorlevel 1 (
set "capture=1"
)
if !capture!==1 (
if not defined args (
set "line=!line:*%BIN%winws.exe"=!"
)
set "temp_args="
for %%i in (!line!) do (
set "arg=%%i"
if not "!arg!"=="^" (
if "!arg:~0,2!" EQU "--" if not !mergeargs!==0 (
set "mergeargs=0"
)
if "!arg:~0,1!" EQU "!QUOTE!" (
set "arg=!arg:~1,-1!"
echo !arg! | findstr ":" >nul
if !errorlevel!==0 (
set "arg=\!QUOTE!!arg!\!QUOTE!"
) else if "!arg:~0,1!"=="@" (
set "arg=\!QUOTE!@%~dp0!arg:~1!\!QUOTE!"
) else if "!arg:~0,5!"=="%%BIN%%" (
set "arg=\!QUOTE!!BIN_PATH!!arg:~5!\!QUOTE!"
) else if "!arg:~0,7!"=="%%LISTS%%" (
set "arg=\!QUOTE!!LISTS_PATH!!arg:~7!\!QUOTE!"
) else (
set "arg=\!QUOTE!%~dp0!arg!\!QUOTE!"
)
) else if "!arg:~0,12!" EQU "%%GameFilter%%" (
set "arg=%GameFilter%"
)
if !mergeargs!==1 (
set "temp_args=!temp_args!,!arg!"
) else if !mergeargs!==3 (
set "temp_args=!temp_args!=!arg!"
set "mergeargs=1"
) else (
set "temp_args=!temp_args! !arg!"
)
if "!arg:~0,2!" EQU "--" (
set "mergeargs=2"
) else if !mergeargs!==2 (
set "mergeargs=1"
) else if !mergeargs!==1 (
for %%x in (!args_with_value!) do (
if /i "%%x"=="!arg!" (
set "mergeargs=3"
)
)
)
)
)
if not "!temp_args!"=="" (
set "args=!args! !temp_args!"
)
)
)
:: Creating service with parsed args
set ARGS=%args%
echo Final args: !ARGS!
set SRVCNAME=zapret
net stop %SRVCNAME% >nul 2>&1
sc delete %SRVCNAME% >nul 2>&1
sc create %SRVCNAME% binPath= "\"%BIN_PATH%winws.exe\" %ARGS%" DisplayName= "zapret" start= auto
sc description %SRVCNAME% "Zapret DPI bypass software"
sc start %SRVCNAME%
pause
:: CHECK UPDATES =======================
:service_check_updates
chcp 437 > nul
cls
:: Set current version and URLs
set "GITHUB_VERSION_URL=https://raw.githubusercontent.com/Flowseal/zapret-discord-youtube/main/.service/version.txt"
set "GITHUB_RELEASE_URL=https://github.com/Flowseal/zapret-discord-youtube/releases/tag/"
set "GITHUB_DOWNLOAD_URL=https://github.com/Flowseal/zapret-discord-youtube/releases/latest/download/zapret-discord-youtube-"
:: Get the latest version from GitHub
for /f "delims=" %%A in ('powershell -command "(Invoke-WebRequest -Uri \"%GITHUB_VERSION_URL%\" -Headers @{\"Cache-Control\"=\"no-cache\"} -TimeoutSec 5).Content.Trim()" 2^>nul') do set "GITHUB_VERSION=%%A"
:: Error handling
if not defined GITHUB_VERSION (
echo Warning: failed to fetch the latest version. Check your internet connection. This warning does not affect the operation of zapret
pause
if "%1"=="soft" exit /b
)
:: Version comparison
if "%LOCAL_VERSION%"=="%GITHUB_VERSION%" (
echo Latest version installed: %LOCAL_VERSION%
if "%1"=="soft" exit /b
pause
)
echo New version available: %GITHUB_VERSION%
echo Release page: %GITHUB_RELEASE_URL%%GITHUB_VERSION%
set "CHOICE="
set /p "CHOICE=Do you want to automatically download the new version? (Y/N) (default: Y) "
if "%CHOICE%"=="" set "CHOICE=Y"
if /i "%CHOICE%"=="y" set "CHOICE=Y"
if /i "%CHOICE%"=="Y" (
echo Opening the download page...
start "" "%GITHUB_DOWNLOAD_URL%%GITHUB_VERSION%.rar"
)
if "%1"=="soft" exit /b
pause
:: DIAGNOSTICS =========================
:service_diagnostics
chcp 437 > nul
cls
:: AdguardSvc.exe
tasklist /FI "IMAGENAME eq AdguardSvc.exe" | find /I "AdguardSvc.exe" > nul
if !errorlevel!==0 (
call :PrintRed "[X] Adguard process found. Adguard may cause problems with Discord"
call :PrintRed "https://github.com/Flowseal/zapret-discord-youtube/issues/417"
) else (
call :PrintGreen "Adguard check passed"
)
echo:
:: Killer
sc query | findstr /I "Killer" > nul
if !errorlevel!==0 (
call :PrintRed "[X] Killer services found. Killer conflicts with zapret"
call :PrintRed "https://github.com/Flowseal/zapret-discord-youtube/issues/2512#issuecomment-2821119513"
) else (
call :PrintGreen "Killer check passed"
)
echo:
:: Check Point
set "checkpointFound=0"
sc query | findstr /I "TracSrvWrapper" > nul
if !errorlevel!==0 (
set "checkpointFound=1"
)
sc query | findstr /I "EPWD" > nul
if !errorlevel!==0 (
set "checkpointFound=1"
)
if !checkpointFound!==1 (
call :PrintRed "[X] Check Point services found. Check Point conflicts with zapret"
call :PrintRed "Try to uninstall Check Point"
) else (
call :PrintGreen "Check Point check passed"
)
echo:
:: SmartByte
sc query | findstr /I "SmartByte" > nul
if !errorlevel!==0 (
call :PrintRed "[X] SmartByte services found. SmartByte conflicts with zapret"
call :PrintRed "Try to uninstall or disable SmartByte through services.msc"
) else (
call :PrintGreen "SmartByte check passed"
)
echo:
:: VPN
sc query | findstr /I "VPN" > nul
if !errorlevel!==0 (
call :PrintYellow "[?] Some VPN services found. Some VPNs can conflict with zapret"
call :PrintYellow "Make sure that all VPNs are disabled"
) else (
call :PrintGreen "VPN check passed"
)
echo:
:: DNS
set "dnsfound=0"
for /f "skip=1 tokens=*" %%a in ('wmic nicconfig where "IPEnabled=true" get DNSServerSearchOrder /format:table') do (
echo %%a | findstr /i "192.168." >nul
if !errorlevel!==0 (
set "dnsfound=1"
)
)
if !dnsfound!==1 (
call :PrintYellow "[?] DNS servers are probably not specified."
call :PrintYellow "Provider's DNS servers are automatically used, which may affect zapret. It is recommended to install well-known DNS servers and setup DoH"
) else (
call :PrintGreen "DNS check passed"
)
echo:
:: Discord cache clearing
set "CHOICE="
set /p "CHOICE=Do you want to clear the Discord cache? (Y/N) (default: Y) "
if "!CHOICE!"=="" set "CHOICE=Y"
if "!CHOICE!"=="y" set "CHOICE=Y"
if /i "!CHOICE!"=="Y" (
tasklist /FI "IMAGENAME eq Discord.exe" | findstr /I "Discord.exe" > nul
if !errorlevel!==0 (
echo Discord is running, closing...
taskkill /IM Discord.exe /F > nul
if !errorlevel! == 0 (
call :PrintGreen "Discord was successfully closed"
) else (
call :PrintRed "Unable to close Discord"
)
)
set "discordCacheDir=%appdata%\discord"
for %%d in ("Cache" "Code Cache" "GPUCache") do (
set "dirPath=!discordCacheDir!\%%~d"
if exist "!dirPath!" (
rd /s /q "!dirPath!"
if !errorlevel!==0 (
call :PrintGreen "Successfully deleted !dirPath!"
) else (
call :PrintRed "Failed to delete !dirPath!"
)
) else (
call :PrintRed "!dirPath! does not exist"
)
)
)
echo:
pause
:: GAME SWITCH ========================
:game_switch_status
chcp 437 > nul
set "gameFlagFile=%~dp0bin\game_filter.enabled"
if exist "%gameFlagFile%" (
set "GameFilterStatus=enabled"
set "GameFilter=1024-65535"
) else (
set "GameFilterStatus=disabled"
set "GameFilter=0"
)
exit /b
:game_switch
chcp 437 > nul
cls
if not exist "%gameFlagFile%" (
echo Enabling game filter...
echo ENABLED > "%gameFlagFile%"
call :PrintYellow "Restart the zapret to apply the changes"
) else (
echo Disabling game filter...
del /f /q "%gameFlagFile%"
call :PrintYellow "Restart the zapret to apply the changes"
)
pause
:: IPSET SWITCH =======================
:ipset_switch_status
chcp 437 > nul
findstr /R "^0\.0\.0\.0/32$" "%~dp0lists\ipset-all.txt" >nul
if !errorlevel!==0 (
set "IPsetStatus=empty"
) else (
set "IPsetStatus=loaded"
)
exit /b
:ipset_switch
chcp 437 > nul
cls
set "listFile=%~dp0lists\ipset-all.txt"
set "backupFile=%listFile%.backup"
findstr /R "^0\.0\.0\.0/32$" "%listFile%" >nul
if !errorlevel!==0 (
echo Enabling ipset based bypass...
if exist "%backupFile%" (
del /f /q "%listFile%"
ren "%backupFile%" "ipset-all.txt"
) else (
echo Error: no backup to restore. Update list from service menu by yourself
)
) else (
echo Disabling ipset based bypass...
if not exist "%backupFile%" (
ren "%listFile%" "ipset-all.txt.backup"
) else (
del /f /q "%backupFile%"
ren "%listFile%" "ipset-all.txt.backup"
)
>"%listFile%" (
echo 0.0.0.0/32
)
)
pause
:: IPSET UPDATE =======================
:ipset_update
chcp 437 > nul
cls
set "listFile=%~dp0lists\ipset-all.txt"
set "url=https://raw.githubusercontent.com/Flowseal/zapret-discord-youtube/refs/heads/main/lists/ipset-all.txt"
echo Updating ipset-all...
if exist "%SystemRoot%\System32\curl.exe" (
curl -L -o "%listFile%" "%url%"
) else (
powershell -Command ^
"$url = '%url%';" ^
"$out = '%listFile%';" ^
"$dir = Split-Path -Parent $out;" ^
"if (-not (Test-Path $dir)) { New-Item -ItemType Directory -Path $dir | Out-Null };" ^
"$res = Invoke-WebRequest -Uri $url -TimeoutSec 10 -UseBasicParsing;" ^
"if ($res.StatusCode -eq 200) { $res.Content | Out-File -FilePath $out -Encoding UTF8 } else { exit 1 }"
)
echo Finished
pause
:: Utility functions
:PrintGreen
powershell -Command "Write-Host \"%~1\" -ForegroundColor Green"
exit /b
:PrintRed
powershell -Command "Write-Host \"%~1\" -ForegroundColor Red"
exit /b
:PrintYellow
powershell -Command "Write-Host \"%~1\" -ForegroundColor Yellow"
exit /b