Skip to content

Commit

Permalink
[MSAFD] Add an initial implementation of SIO_GET_EXTENSION_FUNCTION_P…
Browse files Browse the repository at this point in the history
…OINTER IOCTL

Also stub the related functions the IOCTL will return, namely: WSAID_ACCEPTEX,
WSAID_CONNECTEX, WSAID_DISCONNECTEX, WSAID_GETACCEPTEXSOCKADDRS

This will allow Steam client not to fail in an ASSERT
related to the Steam client PlatformSocketsInit function.

Even though, this doesn't fix Steam running on ReactOS since its UI requires
a Windows 7 API from Kernel32: SetThreadErrorMode().

Nota: its crash got fixed thanks to the Wine sync done recently.

CORE-14966
  • Loading branch information
HeisSpiter committed Feb 16, 2019
1 parent cc820b7 commit 2b1f6c8
Show file tree
Hide file tree
Showing 3 changed files with 159 additions and 1 deletion.
57 changes: 56 additions & 1 deletion dll/win32/msafd/misc/dllmain.c
Expand Up @@ -5,6 +5,7 @@
* PURPOSE: DLL entry point
* PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
* Alex Ionescu (alex@relsoft.net)
* Pierre Schweitzer (pierre@reactos.org)
* REVISIONS:
* CSH 01/09-2000 Created
* Alex 16/07/2004 - Complete Rewrite
Expand Down Expand Up @@ -2466,7 +2467,61 @@ WSPIoctl(IN SOCKET Handle,
Ret = NO_ERROR;
break;
case SIO_GET_EXTENSION_FUNCTION_POINTER:
Errno = WSAEINVAL;
if (cbOutBuffer == 0)
{
cbRet = sizeof(PVOID);
Errno = WSAEFAULT;
break;
}

if (cbInBuffer < sizeof(GUID) ||
cbOutBuffer < sizeof(PVOID))
{
Errno = WSAEINVAL;
break;
}

{
GUID AcceptExGUID = WSAID_ACCEPTEX;
GUID ConnectExGUID = WSAID_CONNECTEX;
GUID DisconnectExGUID = WSAID_DISCONNECTEX;
GUID GetAcceptExSockaddrsGUID = WSAID_GETACCEPTEXSOCKADDRS;

if (IsEqualGUID(&AcceptExGUID, lpvInBuffer))
{
*((PVOID *)lpvOutBuffer) = WSPAcceptEx;
cbRet = sizeof(PVOID);
Errno = NO_ERROR;
Ret = NO_ERROR;
}
else if (IsEqualGUID(&ConnectExGUID, lpvInBuffer))
{
*((PVOID *)lpvOutBuffer) = WSPConnectEx;
cbRet = sizeof(PVOID);
Errno = NO_ERROR;
Ret = NO_ERROR;
}
else if (IsEqualGUID(&DisconnectExGUID, lpvInBuffer))
{
*((PVOID *)lpvOutBuffer) = WSPDisconnectEx;
cbRet = sizeof(PVOID);
Errno = NO_ERROR;
Ret = NO_ERROR;
}
else if (IsEqualGUID(&GetAcceptExSockaddrsGUID, lpvInBuffer))
{
*((PVOID *)lpvOutBuffer) = WSPGetAcceptExSockaddrs;
cbRet = sizeof(PVOID);
Errno = NO_ERROR;
Ret = NO_ERROR;
}
else
{
ERR("Querying unknown extension function: %x\n", ((GUID*)lpvInBuffer)->Data1);
Errno = WSAEOPNOTSUPP;
}
}

break;
case SIO_ADDRESS_LIST_QUERY:
if (IS_INTRESOURCE(lpvOutBuffer) || cbOutBuffer == 0)
Expand Down
61 changes: 61 additions & 0 deletions dll/win32/msafd/misc/stubs.c
Expand Up @@ -53,4 +53,65 @@ WSPJoinLeaf(
return (SOCKET)0;
}

BOOL
WSPAPI
WSPAcceptEx(
IN SOCKET sListenSocket,
IN SOCKET sAcceptSocket,
OUT PVOID lpOutputBuffer,
IN DWORD dwReceiveDataLength,
IN DWORD dwLocalAddressLength,
IN DWORD dwRemoteAddressLength,
OUT LPDWORD lpdwBytesReceived,
IN OUT LPOVERLAPPED lpOverlapped)
{
UNIMPLEMENTED;

return FALSE;
}

BOOL
WSPAPI
WSPConnectEx(
IN SOCKET s,
IN const struct sockaddr *name,
IN int namelen,
IN PVOID lpSendBuffer,
IN DWORD dwSendDataLength,
OUT LPDWORD lpdwBytesSent,
IN OUT LPOVERLAPPED lpOverlapped)
{
UNIMPLEMENTED;

return FALSE;
}

BOOL
WSPAPI
WSPDisconnectEx(
IN SOCKET hSocket,
IN LPOVERLAPPED lpOverlapped,
IN DWORD dwFlags,
IN DWORD reserved)
{
UNIMPLEMENTED;

return FALSE;
}

VOID
WSPAPI
WSPGetAcceptExSockaddrs(
IN PVOID lpOutputBuffer,
IN DWORD dwReceiveDataLength,
IN DWORD dwLocalAddressLength,
IN DWORD dwRemoteAddressLength,
OUT struct sockaddr **LocalSockaddr,
OUT LPINT LocalSockaddrLength,
OUT struct sockaddr **RemoteSockaddr,
OUT LPINT RemoteSockaddrLength)
{
UNIMPLEMENTED;
}

/* EOF */
42 changes: 42 additions & 0 deletions dll/win32/msafd/msafd.h
Expand Up @@ -426,6 +426,48 @@ WSPStringToAddress(
IN OUT LPINT lpAddressLength,
OUT LPINT lpErrno);

BOOL
WSPAPI
WSPAcceptEx(
IN SOCKET sListenSocket,
IN SOCKET sAcceptSocket,
OUT PVOID lpOutputBuffer,
IN DWORD dwReceiveDataLength,
IN DWORD dwLocalAddressLength,
IN DWORD dwRemoteAddressLength,
OUT LPDWORD lpdwBytesReceived,
IN OUT LPOVERLAPPED lpOverlapped);

BOOL
WSPAPI
WSPConnectEx(
IN SOCKET s,
IN const struct sockaddr *name,
IN int namelen,
IN PVOID lpSendBuffer,
IN DWORD dwSendDataLength,
OUT LPDWORD lpdwBytesSent,
IN OUT LPOVERLAPPED lpOverlapped);

BOOL
WSPAPI
WSPDisconnectEx(
IN SOCKET hSocket,
IN LPOVERLAPPED lpOverlapped,
IN DWORD dwFlags,
IN DWORD reserved);

VOID
WSPAPI
WSPGetAcceptExSockaddrs(
IN PVOID lpOutputBuffer,
IN DWORD dwReceiveDataLength,
IN DWORD dwLocalAddressLength,
IN DWORD dwRemoteAddressLength,
OUT struct sockaddr **LocalSockaddr,
OUT LPINT LocalSockaddrLength,
OUT struct sockaddr **RemoteSockaddr,
OUT LPINT RemoteSockaddrLength);

PSOCKET_INFORMATION GetSocketStructure(
SOCKET Handle
Expand Down

0 comments on commit 2b1f6c8

Please sign in to comment.