ws2_32: Implement WSADuplicateSocket[A|W] using a helper function.

This commit is contained in:
Bruno Jesus 2013-09-08 01:47:46 -03:00 committed by Alexandre Julliard
parent d77522988b
commit 0816f85b6b
1 changed files with 23 additions and 28 deletions

View File

@ -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);
}
/***********************************************************************