summarylogtreecommitdiffstats
path: root/0001-HACK-ws2_32-Block-first-internet-connection-for-some.patch
blob: ef6135beb36103a507908ad438df17205ee52a0a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
From d0eee8a7ec74f370df43f342a8b2977f99e7cb40 Mon Sep 17 00:00:00 2001
From: NelloKudo <marshnelloosu@gmail.com>
Date: Thu, 14 Aug 2025 14:18:26 +0200
Subject: [PATCH] HACK: ws2_32: Block first internet connection for some games

Fixes launch issues/high CPU usage, can be disabled in-case of
various issues with WINE_DISABLE_DISCONNECT=1.
---
 dlls/ws2_32/socket.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index d4223e93bd1..3030d8df6bb 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -1262,6 +1262,25 @@ int WINAPI closesocket( SOCKET s )
     return 0;
 }
 
+static BOOL is_mhy(void)
+{
+    static volatile char cache = -1;
+    BOOL ret = cache;
+    if (ret == -1)
+    {
+        const WCHAR *p, *name = NtCurrentTeb()->Peb->ProcessParameters->ImagePathName.Buffer;
+        if ((p = wcsrchr(name, '/')))
+            name = p + 1;
+        if ((p = wcsrchr(name, '\\')))
+            name = p + 1;
+        ret = (!wcsicmp(name, L"GenshinImpact.exe") ||
+               !wcsicmp(name, L"StarRail.exe") ||
+               !wcsicmp(name, L"YuanShen.exe") ||
+               !wcsicmp(name, L"ZenlessZoneZero.exe"));
+        cache = ret;
+    }
+    return ret;
+}
 
 /***********************************************************************
  *      connect   (ws2_32.4)
@@ -1272,6 +1291,18 @@ int WINAPI connect( SOCKET s, const struct sockaddr *addr, int len )
     IO_STATUS_BLOCK io;
     HANDLE sync_event;
     NTSTATUS status;
+    static int count = 0;
+    const char* env = getenv("WINE_DISABLE_DISCONNECT");
+
+    // HACK: Block first connection for mhy games
+    // can be disabled with WINE_DISABLE_DISCONNECT=1
+    if (!count && !(env && atoi(env) == 1) && is_mhy())
+    {
+        FIXME("Toggle detected, disabling first connection..\n");
+        count = 1;
+        WSASetLastError(WSAECONNREFUSED);
+        return SOCKET_ERROR;
+    }
 
     TRACE( "socket %#Ix, addr %s, len %d\n", s, debugstr_sockaddr(addr), len );
 
-- 
2.50.1