Bruno Jesus : ws2_32: Implement WSADuplicateSocket[A|W] using a helper function.
Alexandre Julliard
julliard at winehq.org
Mon Sep 9 16:08:08 CDT 2013
Module: wine
Branch: master
Commit: 0816f85b6b69dc1fa4f141c72a31d69b2e1ae1c3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0816f85b6b69dc1fa4f141c72a31d69b2e1ae1c3
Author: Bruno Jesus <00cpxxx at gmail.com>
Date: Sun Sep 8 01:47:46 2013 -0300
ws2_32: Implement WSADuplicateSocket[A|W] using a helper function.
---
dlls/ws2_32/socket.c | 51 ++++++++++++++++++++++---------------------------
1 files changed, 23 insertions(+), 28 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index ed55b64..833c713 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -1546,6 +1546,27 @@ static int ws_sockaddr_u2ws(const struct sockaddr* uaddr, struct WS_sockaddr* ws
return res;
}
+static INT WS_DuplicateSocket(BOOL unicode, SOCKET s, DWORD dwProcessId, LPWSAPROTOCOL_INFOW lpProtocolInfo)
+{
+ HANDLE hProcess;
+
+ TRACE("(unicode %d, socket %04lx, processid %x, buffer %p)\n",
+ unicode, s, dwProcessId, lpProtocolInfo);
+ memset(lpProtocolInfo, 0, unicode ? sizeof(WSAPROTOCOL_INFOW) : sizeof(WSAPROTOCOL_INFOA));
+ /* FIXME: WS_getsockopt(s, WS_SOL_SOCKET, SO_PROTOCOL_INFO, lpProtocolInfo, sizeof(*lpProtocolInfo)); */
+ /* I don't know what the real Windoze does next, this is a hack */
+ /* ...we could duplicate and then use ConvertToGlobalHandle on the duplicate, then let
+ * the target use the global duplicate, or we could copy a reference to us to the structure
+ * and let the target duplicate it from us, but let's do it as simple as possible */
+ hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, dwProcessId);
+ DuplicateHandle(GetCurrentProcess(), SOCKET2HANDLE(s),
+ hProcess, (LPHANDLE)&lpProtocolInfo->dwCatalogEntryId,
+ 0, FALSE, DUPLICATE_SAME_ACCESS);
+ CloseHandle(hProcess);
+ lpProtocolInfo->dwServiceFlags4 = 0xff00ff00; /* magic */
+ return 0;
+}
+
/*****************************************************************************
* WS_EnterSingleProtocolW [internal]
*
@@ -6405,22 +6426,7 @@ SOCKET WINAPI WSAAccept( SOCKET s, struct WS_sockaddr *addr, LPINT addrlen,
*/
int WINAPI WSADuplicateSocketA( SOCKET s, DWORD dwProcessId, LPWSAPROTOCOL_INFOA lpProtocolInfo )
{
- HANDLE hProcess;
-
- TRACE("(%ld,%x,%p)\n", s, dwProcessId, lpProtocolInfo);
- memset(lpProtocolInfo, 0, sizeof(*lpProtocolInfo));
- /* FIXME: WS_getsockopt(s, WS_SOL_SOCKET, SO_PROTOCOL_INFO, lpProtocolInfo, sizeof(*lpProtocolInfo)); */
- /* I don't know what the real Windoze does next, this is a hack */
- /* ...we could duplicate and then use ConvertToGlobalHandle on the duplicate, then let
- * the target use the global duplicate, or we could copy a reference to us to the structure
- * and let the target duplicate it from us, but let's do it as simple as possible */
- hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, dwProcessId);
- DuplicateHandle(GetCurrentProcess(), SOCKET2HANDLE(s),
- hProcess, (LPHANDLE)&lpProtocolInfo->dwCatalogEntryId,
- 0, FALSE, DUPLICATE_SAME_ACCESS);
- CloseHandle(hProcess);
- lpProtocolInfo->dwServiceFlags4 = 0xff00ff00; /* magic */
- return 0;
+ return WS_DuplicateSocket(FALSE, s, dwProcessId, (LPWSAPROTOCOL_INFOW) lpProtocolInfo);
}
/***********************************************************************
@@ -6428,18 +6434,7 @@ int WINAPI WSADuplicateSocketA( SOCKET s, DWORD dwProcessId, LPWSAPROTOCOL_INFOA
*/
int WINAPI WSADuplicateSocketW( SOCKET s, DWORD dwProcessId, LPWSAPROTOCOL_INFOW lpProtocolInfo )
{
- HANDLE hProcess;
-
- TRACE("(%ld,%x,%p)\n", s, dwProcessId, lpProtocolInfo);
-
- memset(lpProtocolInfo, 0, sizeof(*lpProtocolInfo));
- hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, dwProcessId);
- DuplicateHandle(GetCurrentProcess(), SOCKET2HANDLE(s),
- hProcess, (LPHANDLE)&lpProtocolInfo->dwCatalogEntryId,
- 0, FALSE, DUPLICATE_SAME_ACCESS);
- CloseHandle(hProcess);
- lpProtocolInfo->dwServiceFlags4 = 0xff00ff00; /* magic */
- return 0;
+ return WS_DuplicateSocket(TRUE, s, dwProcessId, lpProtocolInfo);
}
/***********************************************************************
More information about the wine-cvs
mailing list