From f58ddd3b46ee7811a68d24ebe4c79d50b7fe4156 Mon Sep 17 00:00:00 2001 From: Peter Hater <7element@mail.bg> Date: Mon, 10 Oct 2016 06:54:56 +0000 Subject: [PATCH 1/1] [WINHTTP] Properly initialize winsock. Based on wine tests CORE-12104 svn path=/trunk/; revision=72951 --- reactos/dll/win32/winhttp/net.c | 26 ++++++++++++++++++++++++++ reactos/dll/win32/winhttp/session.c | 10 ++++------ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/reactos/dll/win32/winhttp/net.c b/reactos/dll/win32/winhttp/net.c index bdb778716c9..dcf6aee772f 100644 --- a/reactos/dll/win32/winhttp/net.c +++ b/reactos/dll/win32/winhttp/net.c @@ -276,6 +276,28 @@ static BOOL ensure_cred_handle(void) return ret; } +#ifdef __REACTOS__ +static BOOL winsock_initialized = FALSE; +BOOL netconn_init_winsock() +{ + WSADATA wsaData; + int error; + if (!winsock_initialized) + { + error = WSAStartup(MAKEWORD(1, 1), &wsaData); + if (error) + { + ERR("WSAStartup failed: %d\n", error); + return FALSE; + } + else + winsock_initialized = TRUE; + } + return winsock_initialized; +} + +#endif + BOOL netconn_init( netconn_t *conn ) { memset(conn, 0, sizeof(*conn)); @@ -291,6 +313,10 @@ void netconn_unload( void ) #ifndef HAVE_GETADDRINFO DeleteCriticalSection(&cs_gethostbyname); #endif +#ifdef __REACTOS__ + if(winsock_initialized) + WSACleanup(); +#endif } BOOL netconn_connected( netconn_t *conn ) diff --git a/reactos/dll/win32/winhttp/session.c b/reactos/dll/win32/winhttp/session.c index 6ac56220cc5..960619aa7a3 100644 --- a/reactos/dll/win32/winhttp/session.c +++ b/reactos/dll/win32/winhttp/session.c @@ -83,9 +83,6 @@ static void session_destroy( object_header_t *hdr ) heap_free( session->proxy_username ); heap_free( session->proxy_password ); heap_free( session ); -#ifdef __REACTOS__ - WSACleanup(); -#endif } static BOOL session_query_option( object_header_t *hdr, DWORD option, LPVOID buffer, LPDWORD buflen ) @@ -194,6 +191,9 @@ static const object_vtbl_t session_vtbl = session_set_option }; +#ifdef __REACTOS__ +BOOL netconn_init_winsock(); +#endif /* __REACTOS__ */ /*********************************************************************** * WinHttpOpen (winhttp.@) */ @@ -202,9 +202,7 @@ HINTERNET WINAPI WinHttpOpen( LPCWSTR agent, DWORD access, LPCWSTR proxy, LPCWST session_t *session; HINTERNET handle = NULL; #ifdef __REACTOS__ - WSADATA wsaData; - int error = WSAStartup(MAKEWORD(2, 2), &wsaData); - if (error) ERR("WSAStartup failed: %d\n", error); + if (!netconn_init_winsock()) return NULL; #endif TRACE("%s, %u, %s, %s, 0x%08x\n", debugstr_w(agent), access, debugstr_w(proxy), debugstr_w(bypass), flags); -- 2.17.1