winws: fix windivert init race condition

This commit is contained in:
bol-van 2024-05-01 13:55:11 +03:00
parent e8241a4fa3
commit f39f25666a
5 changed files with 14 additions and 6 deletions

Binary file not shown.

View File

@ -1,3 +1,2 @@
start "zapret: http,https" "%~dp0winws.exe" --wf-tcp=80,443 --dpi-desync=fake,disorder2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig start "zapret: http,https" "%~dp0winws.exe" --wf-tcp=80,443 --dpi-desync=fake,disorder2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig
timeout /t 1
start "zapret: quic" "%~dp0winws.exe" --wf-udp=443 --dpi-desync=fake --dpi-desync-repeats=11 start "zapret: quic" "%~dp0winws.exe" --wf-udp=443 --dpi-desync=fake --dpi-desync-repeats=11

View File

@ -1,3 +1,2 @@
start "zapret: http,https,autohostlist" "%~dp0winws.exe" --wf-tcp=80,443 --dpi-desync=fake,disorder2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig --hostlist-auto="%~dp0autohostlist.txt" start "zapret: http,https,autohostlist" "%~dp0winws.exe" --wf-tcp=80,443 --dpi-desync=fake,disorder2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig --hostlist-auto="%~dp0autohostlist.txt"
timeout /t 1
start "zapret: quic,autohostlist" "%~dp0winws.exe" --wf-udp=443 --dpi-desync=fake --dpi-desync-repeats=10 --hostlist-auto="%~dp0autohostlist.txt" start "zapret: quic,autohostlist" "%~dp0winws.exe" --wf-udp=443 --dpi-desync=fake --dpi-desync-repeats=10 --hostlist-auto="%~dp0autohostlist.txt"

View File

@ -959,19 +959,29 @@ void tcp_rewrite_winsize(struct tcphdr *tcp, uint16_t winsize, uint8_t scale_fac
static HANDLE w_filter = NULL; static HANDLE w_filter = NULL;
static OVERLAPPED ovl = { .hEvent = NULL }; static OVERLAPPED ovl = { .hEvent = NULL };
;
static HANDLE windivert_init_filter(const char *filter, UINT64 flags) static HANDLE windivert_init_filter(const char *filter, UINT64 flags)
{ {
LPTSTR errormessage = NULL; LPTSTR errormessage = NULL;
DWORD errorcode = 0; DWORD errorcode = 0;
HANDLE h; HANDLE h, hMutex;
const char *mutex_name = "Global\\winws_windivert_mutex";
// windivert driver start in windivert.dll has race conditions
hMutex = CreateMutexA(NULL,TRUE,mutex_name);
if (hMutex && GetLastError()==ERROR_ALREADY_EXISTS)
WaitForSingleObject(hMutex,INFINITE);
h = WinDivertOpen(filter, WINDIVERT_LAYER_NETWORK, 0, flags); h = WinDivertOpen(filter, WINDIVERT_LAYER_NETWORK, 0, flags);
if (h != INVALID_HANDLE_VALUE)
if (hMutex)
{ {
return h; ReleaseMutex(hMutex);
CloseHandle(hMutex);
} }
if (h != INVALID_HANDLE_VALUE) return h;
errorcode = GetLastError(); errorcode = GetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, errorcode, MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), (LPTSTR)&errormessage, 0, NULL); NULL, errorcode, MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), (LPTSTR)&errormessage, 0, NULL);