From 39d05eaf957feeee8c35a94e06ff87712124a8fe Mon Sep 17 00:00:00 2001 From: hater <7element@mail.bg> Date: Wed, 4 Nov 2015 09:08:23 +0200 Subject: [PATCH] Handle SO_PROTOCOL_INFO and use catalogEntryId from ProtocolInfo for WPUModifyIFSHandle --- reactos/dll/win32/msafd/misc/dllmain.c | 31 ++++++++++++++++++++----------- reactos/dll/win32/msafd/msafd.h | 2 +- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/reactos/dll/win32/msafd/misc/dllmain.c b/reactos/dll/win32/msafd/misc/dllmain.c index ff5dd4b..70d0746 100644 --- a/reactos/dll/win32/msafd/misc/dllmain.c +++ b/reactos/dll/win32/msafd/misc/dllmain.c @@ -19,7 +19,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(msafd); HANDLE GlobalHeap; WSPUPCALLTABLE Upcalls; -DWORD CatalogEntryId; /* CatalogEntryId for upcalls */ LPWPUCOMPLETEOVERLAPPEDREQUEST lpWPUCompleteOverlappedRequest; PSOCKET_INFORMATION SocketListHead = NULL; CRITICAL_SECTION SocketListLock; @@ -116,7 +115,6 @@ WSPSocket(int AddressFamily, Socket->SharedData.SizeOfRemoteAddress = HelperData->MaxWSAddressLength; Socket->SharedData.UseDelayedAcceptance = HelperData->UseDelayedAcceptance; Socket->SharedData.CreateFlags = dwFlags; - Socket->SharedData.CatalogEntryId = lpProtocolInfo->dwCatalogEntryId; Socket->SharedData.ServiceFlags1 = lpProtocolInfo->dwServiceFlags1; Socket->SharedData.ProviderFlags = lpProtocolInfo->dwProviderFlags; Socket->SharedData.GroupID = g; @@ -124,6 +122,7 @@ WSPSocket(int AddressFamily, Socket->SharedData.UseSAN = FALSE; Socket->SharedData.NonBlocking = FALSE; /* Sockets start blocking */ Socket->SanData = NULL; + RtlCopyMemory(&Socket->ProtocolInfo, lpProtocolInfo, sizeof(Socket->ProtocolInfo)); /* Ask alex about this */ if( Socket->SharedData.SocketType == SOCK_DGRAM || @@ -290,7 +289,7 @@ WSPSocket(int AddressFamily, CreateContext(Socket); /* Notify Winsock */ - Upcalls.lpWPUModifyIFSHandle(CatalogEntryId, (SOCKET)Sock, lpErrno); + Upcalls.lpWPUModifyIFSHandle(Socket->ProtocolInfo.dwCatalogEntryId, (SOCKET)Sock, lpErrno); /* Return Socket Handle */ TRACE("Success %x\n", Sock); @@ -1332,9 +1331,7 @@ WSPAccept(SOCKET Handle, } /* Create a new Socket */ - ProtocolInfo.dwCatalogEntryId = Socket->SharedData.CatalogEntryId; - ProtocolInfo.dwServiceFlags1 = Socket->SharedData.ServiceFlags1; - ProtocolInfo.dwProviderFlags = Socket->SharedData.ProviderFlags; + RtlCopyMemory(&ProtocolInfo, &Socket->ProtocolInfo, sizeof(WSAPROTOCOL_INFOW)); AcceptSocket = WSPSocket (Socket->SharedData.AddressFamily, Socket->SharedData.SocketType, @@ -2133,6 +2130,11 @@ WSPGetSockOpt(IN SOCKET Handle, break; case SO_LINGER: + if (Socket->SharedData.SocketType == SOCK_DGRAM) + { + *lpErrno = WSAENOPROTOOPT; + return SOCKET_ERROR; + } Buffer = &Socket->SharedData.LingerData; BufferSize = sizeof(struct linger); break; @@ -2182,11 +2184,14 @@ WSPGetSockOpt(IN SOCKET Handle, Buffer = &Socket->SharedData.RecvTimeout; BufferSize = sizeof(DWORD); break; + case SO_PROTOCOL_INFO: + Buffer = &Socket->ProtocolInfo; + BufferSize = sizeof(Socket->ProtocolInfo); + break; case SO_GROUP_ID: case SO_GROUP_PRIORITY: case SO_MAX_MSG_SIZE: - case SO_PROTOCOL_INFO: default: DbgPrint("MSAFD: Get unknown optname %x\n", OptionName); @@ -2205,7 +2210,8 @@ WSPGetSockOpt(IN SOCKET Handle, return 0; default: - break; + *lpErrno = WSAEINVAL; + return SOCKET_ERROR; } SendToHelper: @@ -2242,7 +2248,12 @@ WSPSetSockOpt( /* FIXME: We should handle some more cases here */ - if (level == SOL_SOCKET) + if (level != SOL_SOCKET) + { + *lpErrno = WSAEINVAL; + return SOCKET_ERROR; + } + else { switch (optname) { @@ -2412,8 +2423,6 @@ WSPStartup(IN WORD wVersionRequested, lpProcTable->lpWSPStringToAddress = WSPStringToAddress; lpWSPData->wVersion = MAKEWORD(2, 2); lpWSPData->wHighVersion = MAKEWORD(2, 2); - /* Save CatalogEntryId for all upcalls */ - CatalogEntryId = lpProtocolInfo->dwCatalogEntryId; } TRACE("Status (%d).\n", Status); diff --git a/reactos/dll/win32/msafd/msafd.h b/reactos/dll/win32/msafd/msafd.h index c999c42..cb6e3ca 100644 --- a/reactos/dll/win32/msafd/msafd.h +++ b/reactos/dll/win32/msafd/msafd.h @@ -72,7 +72,6 @@ typedef struct _SOCK_SHARED_INFO { BOOLEAN UseSAN:1; }; // Flags DWORD CreateFlags; - DWORD CatalogEntryId; DWORD ServiceFlags1; DWORD ProviderFlags; GROUP GroupID; @@ -106,6 +105,7 @@ typedef struct _SOCKET_INFORMATION { BOOL TrySAN; SOCKADDR WSLocalAddress; SOCKADDR WSRemoteAddress; + WSAPROTOCOL_INFOW ProtocolInfo; struct _SOCKET_INFORMATION *NextSocket; } SOCKET_INFORMATION, *PSOCKET_INFORMATION; -- 1.9.5.msysgit.0