Socket: Fix connect issues when using ReShade
This commit is contained in:
parent
c04460d88b
commit
44028cbbb1
|
@ -3,6 +3,9 @@
|
||||||
|
|
||||||
#include "Common/SocketContext.h"
|
#include "Common/SocketContext.h"
|
||||||
|
|
||||||
|
#include "Common/Logging/Log.h"
|
||||||
|
#include "Common/Network.h"
|
||||||
|
|
||||||
namespace Common
|
namespace Common
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
@ -11,7 +14,23 @@ SocketContext::SocketContext()
|
||||||
std::lock_guard<std::mutex> g(s_lock);
|
std::lock_guard<std::mutex> g(s_lock);
|
||||||
if (s_num_objects == 0)
|
if (s_num_objects == 0)
|
||||||
{
|
{
|
||||||
static_cast<void>(WSAStartup(MAKEWORD(2, 2), &s_data));
|
const int ret = WSAStartup(MAKEWORD(2, 2), &s_data);
|
||||||
|
if (ret == 0)
|
||||||
|
{
|
||||||
|
INFO_LOG_FMT(COMMON, "WSAStartup succeeded, wVersion={}.{}, wHighVersion={}.{}",
|
||||||
|
int(LOBYTE(s_data.wVersion)), int(HIBYTE(s_data.wVersion)),
|
||||||
|
int(LOBYTE(s_data.wHighVersion)), int(HIBYTE(s_data.wHighVersion)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// The WSAStartup function directly returns the extended error code in the return value.
|
||||||
|
// A call to the WSAGetLastError function is not needed and should not be used.
|
||||||
|
//
|
||||||
|
// Source:
|
||||||
|
// https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsastartup
|
||||||
|
ERROR_LOG_FMT(COMMON, "WSAStartup failed with error {}: {}", ret,
|
||||||
|
Common::DecodeNetworkError(ret));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
s_num_objects++;
|
s_num_objects++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,6 +97,17 @@ s32 WiiSockMan::GetNetErrorCode(s32 ret, std::string_view caller, bool is_rw)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
s32 error_code = WSAGetLastError();
|
s32 error_code = WSAGetLastError();
|
||||||
|
// Some programs might hijack WinSock2 (e.g. ReShade) and alter the expected return value.
|
||||||
|
if (error_code == WSAEINVAL && caller == "SO_CONNECT")
|
||||||
|
{
|
||||||
|
// Note:
|
||||||
|
// In order to preserve backward compatibility, this error is reported as WSAEINVAL to Windows
|
||||||
|
// Sockets 1.1 applications that link to either Winsock.dll or Wsock32.dll.
|
||||||
|
//
|
||||||
|
// Source:
|
||||||
|
// https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-connect
|
||||||
|
error_code = WSAEALREADY;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
s32 error_code = errno;
|
s32 error_code = errno;
|
||||||
#endif
|
#endif
|
||||||
|
@ -292,7 +303,7 @@ void WiiSocket::Update(bool read, bool write, bool except)
|
||||||
memory.CopyFromEmu(&addr, ioctl.buffer_in + 8, sizeof(WiiSockAddrIn));
|
memory.CopyFromEmu(&addr, ioctl.buffer_in + 8, sizeof(WiiSockAddrIn));
|
||||||
sockaddr_in local_name = WiiSockMan::ToNativeAddrIn(addr);
|
sockaddr_in local_name = WiiSockMan::ToNativeAddrIn(addr);
|
||||||
|
|
||||||
int ret = connect(fd, (sockaddr*)&local_name, sizeof(local_name));
|
const int ret = connect(fd, (sockaddr*)&local_name, sizeof(local_name));
|
||||||
ReturnValue = m_socket_manager.GetNetErrorCode(ret, "SO_CONNECT", false);
|
ReturnValue = m_socket_manager.GetNetErrorCode(ret, "SO_CONNECT", false);
|
||||||
UpdateConnectingState(ReturnValue);
|
UpdateConnectingState(ReturnValue);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue