From d5ae9f5408fb2d8bf182f8700efa3f243d1a6464 Mon Sep 17 00:00:00 2001 From: Peter Hater <7element@mail.bg> Date: Fri, 2 Jun 2017 21:01:47 +0000 Subject: [PATCH] [MSWSOCK] Add wine debug messages on mswsock debug channel. Better cleanup some failure paths. Fix some error codes. Add some error checks. Add some comments. svn path=/trunk/; revision=74753 --- reactos/dll/win32/mswsock/CMakeLists.txt | 1 + reactos/dll/win32/mswsock/extensions.c | 127 +++++++------ reactos/dll/win32/mswsock/nsplookup.c | 219 ++++++++++++++++------- 3 files changed, 226 insertions(+), 121 deletions(-) diff --git a/reactos/dll/win32/mswsock/CMakeLists.txt b/reactos/dll/win32/mswsock/CMakeLists.txt index 87214631103..ffb839a02b6 100644 --- a/reactos/dll/win32/mswsock/CMakeLists.txt +++ b/reactos/dll/win32/mswsock/CMakeLists.txt @@ -16,6 +16,7 @@ add_library(mswsock SHARED ${CMAKE_CURRENT_BINARY_DIR}/mswsock.def) set_module_type(mswsock win32dll UNICODE) +target_link_libraries(mswsock wine) add_importlibs(mswsock ws2_32 advapi32 dnsapi msvcrt kernel32 ntdll) add_pch(mswsock precomp.h SOURCE) add_cd_file(TARGET mswsock DESTINATION reactos/system32 FOR all) diff --git a/reactos/dll/win32/mswsock/extensions.c b/reactos/dll/win32/mswsock/extensions.c index 2ec33012f9c..05221d9851b 100644 --- a/reactos/dll/win32/mswsock/extensions.c +++ b/reactos/dll/win32/mswsock/extensions.c @@ -12,6 +12,9 @@ #include #include +#include +WINE_DEFAULT_DEBUG_CHANNEL(mswsock); + LPFN_TRANSMITFILE pfnTransmitFile = NULL; LPFN_GETACCEPTEXSOCKADDRS pfnGetAcceptExSockaddrs = NULL; LPFN_ACCEPTEX pfnAcceptEx = NULL; @@ -28,29 +31,37 @@ TransmitFile(SOCKET Socket, LPTRANSMIT_FILE_BUFFERS TransmitBuffers, DWORD Flags) { - GUID TransmitFileGUID = WSAID_TRANSMITFILE; + GUID TransmitFileGUID = WSAID_TRANSMITFILE; DWORD cbBytesReturned; + BOOL Ret; - if (WSAIoctl(Socket, - SIO_GET_EXTENSION_FUNCTION_POINTER, - &TransmitFileGUID, - sizeof(TransmitFileGUID), - &pfnTransmitFile, - sizeof(pfnTransmitFile), - &cbBytesReturned, - NULL, - NULL) == SOCKET_ERROR) + TRACE("TransmitFile %p %p %ld %ld %p %p %lx\n", Socket, File, NumberOfBytesToWrite, NumberOfBytesPerSend, Overlapped, TransmitBuffers, Flags); + if (!pfnTransmitFile && WSAIoctl(Socket, + SIO_GET_EXTENSION_FUNCTION_POINTER, + &TransmitFileGUID, + sizeof(TransmitFileGUID), + &pfnTransmitFile, + sizeof(pfnTransmitFile), + &cbBytesReturned, + NULL, + NULL) == SOCKET_ERROR) { + ERR("TransmitFile WSAIoctl %lx\n", WSAGetLastError()); return FALSE; } - return pfnTransmitFile(Socket, - File, - NumberOfBytesToWrite, - NumberOfBytesPerSend, - Overlapped, - TransmitBuffers, - Flags); + Ret = pfnTransmitFile(Socket, + File, + NumberOfBytesToWrite, + NumberOfBytesPerSend, + Overlapped, + TransmitBuffers, + Flags); + if (!Ret) + { + ERR("TransmitFile %lx\n", WSAGetLastError()); + } + return Ret; } /* @@ -70,42 +81,51 @@ AcceptEx(SOCKET ListenSocket, GUID AcceptExGUID = WSAID_ACCEPTEX; GUID GetAcceptExSockaddrsGUID = WSAID_GETACCEPTEXSOCKADDRS; DWORD cbBytesReturned; + BOOL Ret; - if (WSAIoctl(ListenSocket, - SIO_GET_EXTENSION_FUNCTION_POINTER, - &AcceptExGUID, - sizeof(AcceptExGUID), - &pfnAcceptEx, - sizeof(pfnAcceptEx), - &cbBytesReturned, - NULL, - NULL) == SOCKET_ERROR) + TRACE("AcceptEx %p %p %p %ld %ld %ld %p %p\n", ListenSocket, AcceptSocket, OutputBuffer, ReceiveDataLength, LocalAddressLength, RemoteAddressLength, BytesReceived, Overlapped); + if (!pfnAcceptEx && WSAIoctl(ListenSocket, + SIO_GET_EXTENSION_FUNCTION_POINTER, + &AcceptExGUID, + sizeof(AcceptExGUID), + &pfnAcceptEx, + sizeof(pfnAcceptEx), + &cbBytesReturned, + NULL, + NULL) == SOCKET_ERROR) { + ERR("AcceptEx WSAIoctl %lx\n", WSAGetLastError()); return FALSE; } - if (WSAIoctl(ListenSocket, - SIO_GET_EXTENSION_FUNCTION_POINTER, - &GetAcceptExSockaddrsGUID, - sizeof(GetAcceptExSockaddrsGUID), - &pfnGetAcceptExSockaddrs, - sizeof(pfnGetAcceptExSockaddrs), - &cbBytesReturned, - NULL, - NULL) == SOCKET_ERROR) + if (!pfnGetAcceptExSockaddrs && WSAIoctl(ListenSocket, + SIO_GET_EXTENSION_FUNCTION_POINTER, + &GetAcceptExSockaddrsGUID, + sizeof(GetAcceptExSockaddrsGUID), + &pfnGetAcceptExSockaddrs, + sizeof(pfnGetAcceptExSockaddrs), + &cbBytesReturned, + NULL, + NULL) == SOCKET_ERROR) { + ERR("GetAcceptExSockaddrs WSAIoctl %lx\n", WSAGetLastError()); pfnAcceptEx = NULL; return FALSE; } - return pfnAcceptEx(ListenSocket, - AcceptSocket, - OutputBuffer, - ReceiveDataLength, - LocalAddressLength, - RemoteAddressLength, - BytesReceived, - Overlapped); + Ret = pfnAcceptEx(ListenSocket, + AcceptSocket, + OutputBuffer, + ReceiveDataLength, + LocalAddressLength, + RemoteAddressLength, + BytesReceived, + Overlapped); + if (!Ret) + { + ERR("AcceptEx %lx\n", WSAGetLastError()); + } + return Ret; } @@ -123,16 +143,19 @@ GetAcceptExSockaddrs(PVOID OutputBuffer, LPSOCKADDR* RemoteSockaddr, LPINT RemoteSockaddrLength) { - if (pfnGetAcceptExSockaddrs) + TRACE("AcceptEx %p %ld %ld %ld %p %p %p %p\n", OutputBuffer, ReceiveDataLength, LocalAddressLength, RemoteAddressLength, LocalSockaddr, LocalSockaddrLength, RemoteSockaddr, RemoteSockaddrLength); + if (!pfnGetAcceptExSockaddrs) { - pfnGetAcceptExSockaddrs(OutputBuffer, - ReceiveDataLength, - LocalAddressLength, - RemoteAddressLength, - LocalSockaddr, - LocalSockaddrLength, - RemoteSockaddr, - RemoteSockaddrLength); + ERR("GetAcceptExSockaddrs is NULL\n"); + return; } + pfnGetAcceptExSockaddrs(OutputBuffer, + ReceiveDataLength, + LocalAddressLength, + RemoteAddressLength, + LocalSockaddr, + LocalSockaddrLength, + RemoteSockaddr, + RemoteSockaddrLength); } /* EOF */ diff --git a/reactos/dll/win32/mswsock/nsplookup.c b/reactos/dll/win32/mswsock/nsplookup.c index b11712a75c8..24d41740565 100644 --- a/reactos/dll/win32/mswsock/nsplookup.c +++ b/reactos/dll/win32/mswsock/nsplookup.c @@ -14,8 +14,8 @@ #include "mswhelper.h" -#define NDEBUG -#include +#include +WINE_DEFAULT_DEBUG_CHANNEL(mswsock); #define NSP_CALLID_DNS 0x0001 #define NSP_CALLID_HOSTNAME 0x0002 @@ -154,17 +154,21 @@ mwsNSPLookupServiceBegin(_In_ LPGUID lpProviderId, PWSHANDLEINTERN pLook; int wsaErr; + TRACE("mwsNSPLookupServiceBegin %p %p %p %lx %p\n", lpProviderId, lpqsRestrictions, lpServiceClassInfo, dwControlFlags, lphLookup); if (IsEqualGUID(lpProviderId, &guid_mswsock_TcpIp)) { //OK + TRACE("TCPIP query\n"); } else if (IsEqualGUID(lpProviderId, &guid_mswsock_NLA)) { + ERR("NLA queries are not supported yet\n"); WSASetLastError(WSASERVICE_NOT_FOUND); return SOCKET_ERROR; } else { + ERR("Unsupported GUID\n"); return ERROR_CALL_NOT_IMPLEMENTED; } @@ -172,6 +176,7 @@ mwsNSPLookupServiceBegin(_In_ LPGUID lpProviderId, pLook = HeapAlloc(GetProcessHeap(), 0, sizeof(WSHANDLEINTERN)); if (!pLook) { + ERR("Error allocating %d for handle\n", sizeof(WSHANDLEINTERN)); WSASetLastError(WSAEFAULT); return SOCKET_ERROR; } @@ -224,10 +229,12 @@ mwsNSPLookupServiceBegin(_In_ LPGUID lpProviderId, wsaErr = ERROR_CALL_NOT_IMPLEMENTED; if (IsEqualGUID(lpqsRestrictions->lpServiceClassId, &guid_NULL)) { + ERR("NULL GUID service class is not implemented yet\n"); wsaErr = ERROR_CALL_NOT_IMPLEMENTED; } else if (IsEqualGUID(lpqsRestrictions->lpServiceClassId, &guid_HOSTNAME)) { + TRACE("HOSTNAME GUID\n"); wsaErr = NSP_LookupServiceBeginW(pLook, NULL, NULL, @@ -236,22 +243,25 @@ mwsNSPLookupServiceBegin(_In_ LPGUID lpProviderId, else if (IsEqualGUID(lpqsRestrictions->lpServiceClassId, &guid_INET_HOSTADDRBYNAME)) { - wsaErr = NSP_LookupServiceBeginW(pLook, - NULL, - lpqsRestrictions->lpszServiceInstanceName, - NSP_CALLID_HOSTBYNAME); + TRACE("INET_HOSTADDRBYNAME GUID\n"); + wsaErr = NSP_LookupServiceBeginW(pLook, + NULL, + lpqsRestrictions->lpszServiceInstanceName, + NSP_CALLID_HOSTBYNAME); } else if (IsEqualGUID(lpqsRestrictions->lpServiceClassId, &guid_INET_SERVICEBYNAME)) { - wsaErr = NSP_LookupServiceBeginW(pLook, - NULL, - lpqsRestrictions->lpszServiceInstanceName, - NSP_CALLID_SERVICEBYNAME); + TRACE("INET_SERVICEBYNAME\n"); + wsaErr = NSP_LookupServiceBeginW(pLook, + NULL, + lpqsRestrictions->lpszServiceInstanceName, + NSP_CALLID_SERVICEBYNAME); } else if (IsEqualGUID(lpqsRestrictions->lpServiceClassId, &guid_INET_HOSTADDRBYINETSTRING)) { + ERR("INET_HOSTADDRBYINETSTRING GUID service class is not implemented yet\n"); wsaErr = ERROR_CALL_NOT_IMPLEMENTED; } @@ -259,6 +269,7 @@ mwsNSPLookupServiceBegin(_In_ LPGUID lpProviderId, if (wsaErr != NO_ERROR) { + ERR("mwsNSPLookupServiceBegin wsaErr = %d\n", wsaErr); WSASetLastError(wsaErr); return SOCKET_ERROR; } @@ -276,6 +287,7 @@ mwsNSPLookupServiceNext(_In_ HANDLE hLookup, PWSHANDLEINTERN pLook = hLookup; int wsaErr = 0; + TRACE("mwsNSPLookupServiceNext %p %lx %p %p\n", pLook, dwControlFlags, lpdwBufferLength, lpqsResults); #ifdef NSP_REDIRECT INT res = pLook->rdrproc.NSPLookupServiceNext(pLook->rdrLookup, @@ -313,6 +325,7 @@ mwsNSPLookupServiceNext(_In_ HANDLE hLookup, End: if (wsaErr != 0) { + ERR("mwsNSPLookupServiceNext wsaErr = %d\n", wsaErr); WSASetLastError(wsaErr); return SOCKET_ERROR; } @@ -331,7 +344,8 @@ mwsNSPIoCtl(_In_ HANDLE hLookup, _In_opt_ LPWSACOMPLETION lpCompletion, _In_ LPWSATHREADID lpThreadId) { - WSASetLastError(ERROR_CALL_NOT_IMPLEMENTED); + ERR("mwsNSPIoCtl not implemented %p %lx %p %ld %p %ld %p %p %p\n", hLookup, dwControlCode, lpvInBuffer, cbInBuffer, lpvOutBuffer, cbOutBuffer, lpcbBytesReturned, lpCompletion, lpThreadId); + WSASetLastError(WSAEOPNOTSUPP); return ERROR_CALL_NOT_IMPLEMENTED; } @@ -339,14 +353,11 @@ INT WSAAPI mwsNSPLookupServiceEnd(_In_ HANDLE hLookup) { - PWSHANDLEINTERN pLook; - HANDLE hHeap; - INT res; - - res = NO_ERROR; - pLook = (PWSHANDLEINTERN)hLookup; - hHeap = GetProcessHeap(); + PWSHANDLEINTERN pLook = (PWSHANDLEINTERN)hLookup; + HANDLE hHeap = GetProcessHeap(); + INT res = NO_ERROR; + TRACE("mwsNSPLookupServiceEnd %p\n", pLook); #ifdef NSP_REDIRECT res = pLook->rdrproc.NSPLookupServiceEnd(pLook->rdrLookup); #endif @@ -366,7 +377,8 @@ mwsNSPSetService(_In_ LPGUID lpProviderId, _In_ WSAESETSERVICEOP essOperation, _In_ DWORD dwControlFlags) { - WSASetLastError(ERROR_CALL_NOT_IMPLEMENTED); + ERR("mwsNSPSetService not implemented %p %p %p %d %lx %ld %p %p %p\n", lpProviderId, lpServiceClassInfo, lpqsRegInfo, essOperation, dwControlFlags); + WSASetLastError(WSAEOPNOTSUPP); return ERROR_CALL_NOT_IMPLEMENTED; } @@ -375,7 +387,8 @@ WSAAPI mwsNSPInstallServiceClass(_In_ LPGUID lpProviderId, _In_ LPWSASERVICECLASSINFOW lpServiceClassInfo) { - WSASetLastError(ERROR_CALL_NOT_IMPLEMENTED); + ERR("mwsNSPInstallServiceClass not implemented %p %p\n", lpProviderId, lpServiceClassInfo); + WSASetLastError(WSAEOPNOTSUPP); return ERROR_CALL_NOT_IMPLEMENTED; } @@ -384,7 +397,8 @@ WSAAPI mwsNSPRemoveServiceClass(_In_ LPGUID lpProviderId, _In_ LPGUID lpServiceClassId) { - WSASetLastError(ERROR_CALL_NOT_IMPLEMENTED); + ERR("mwsNSPRemoveServiceClass not implemented %p %p\n", lpProviderId, lpServiceClassId); + WSASetLastError(WSAEOPNOTSUPP); return ERROR_CALL_NOT_IMPLEMENTED; } @@ -394,7 +408,8 @@ mwsNSPGetServiceClassInfo(_In_ LPGUID lpProviderId, _In_ LPDWORD lpdwBufSize, _In_ LPWSASERVICECLASSINFOW lpServiceClassInfo) { - WSASetLastError(ERROR_CALL_NOT_IMPLEMENTED); + ERR("mwsNSPGetServiceClassInfo not implemented %p %p %p\n", lpProviderId, lpdwBufSize, lpServiceClassInfo); + WSASetLastError(WSAEOPNOTSUPP); return ERROR_CALL_NOT_IMPLEMENTED; } @@ -412,6 +427,7 @@ NSP_LookupServiceBeginW(PWSHANDLEINTERN data, { HANDLE hHeap; + TRACE("NSP_LookupServiceBeginW %p %p %p %lx\n", data, hostnameA, hostnameW, CallID); if (data->CallID != 0) return WSAEFAULT; @@ -434,8 +450,12 @@ NSP_LookupServiceBeginW(PWSHANDLEINTERN data, data->hostnameW = StrCpyHeapAllocW(hHeap, hostnameW); } } - - WSASetLastError(0); + else + { + ERR("NSP_LookupServiceBeginW unsupported CallID\n"); + WSASetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return ERROR_CALL_NOT_IMPLEMENTED; + } return ERROR_SUCCESS; } @@ -445,15 +465,23 @@ NSP_GetHostNameHeapAllocW(_Out_ WCHAR** hostname) { WCHAR* name; HANDLE hHeap = GetProcessHeap(); - DWORD bufCharLen = MAX_COMPUTERNAME_LENGTH + 1; - DWORD bufByteLen = bufCharLen * sizeof(WCHAR); - - name = HeapAlloc(hHeap, 0, bufByteLen); + DWORD bufCharLen = 0; + TRACE("NSP_GetHostNameHeapAllocW %p\n", hostname); + /* FIXME Use DnsGetHostName_W when available */ + GetComputerNameExW(ComputerNameDnsHostname, NULL, &bufCharLen); + if (!bufCharLen) + { + ERR("NSP_GetHostNameHeapAllocW zero size for computername returned\n"); + WSASetLastError(WSAEFAULT); + return SOCKET_ERROR; + } + name = HeapAlloc(hHeap, 0, bufCharLen*sizeof(WCHAR)); if (!GetComputerNameExW(ComputerNameDnsHostname, name, &bufCharLen)) { + ERR("NSP_GetHostNameHeapAllocW error obtaining computername %lx\n", GetLastError()); HeapFree(hHeap, 0, name); WSASetLastError(WSAEFAULT); return SOCKET_ERROR; @@ -478,10 +506,11 @@ NSP_GetHostByNameHeapAllocW(_In_ PWSHANDLEINTERN data, PWCHAR Aliases[WS2_INTERNAL_MAX_ALIAS] = { 0 }; int AliasIndex = 0; + TRACE("NSP_GetHostByNameHeapAllocW %p %lx %p\n", data, dwControlFlags, hostinfo); /* needed to be cleaned up if != NULL */ dp = NULL; - if (data->hostnameW == NULL) + if (!data->hostnameW) { result = ERROR_INVALID_PARAMETER; goto cleanup; @@ -489,6 +518,7 @@ NSP_GetHostByNameHeapAllocW(_In_ PWSHANDLEINTERN data, if ((data->dwControlFlags & LUP_DEEP) == 0) { + TRACE("NSP_GetHostByNameHeapAllocW LUP_DEEP is not specified. Disabling recursion\n"); dwQueryFlags |= DNS_QUERY_NO_RECURSION; } @@ -502,6 +532,7 @@ NSP_GetHostByNameHeapAllocW(_In_ PWSHANDLEINTERN data, NULL); if (dns_status == ERROR_INVALID_NAME) { + ERR("NSP_GetHostByNameHeapAllocW invalid name\n"); WSASetLastError(WSAEFAULT); result = ERROR_INVALID_PARAMETER; goto cleanup; @@ -509,6 +540,7 @@ NSP_GetHostByNameHeapAllocW(_In_ PWSHANDLEINTERN data, if ((dns_status != 0) || (dp == NULL)) { + ERR("NSP_GetHostByNameHeapAllocW not found %lx %p\n", dns_status, dp); result = WSAHOST_NOT_FOUND; goto cleanup; } @@ -520,6 +552,7 @@ NSP_GetHostByNameHeapAllocW(_In_ PWSHANDLEINTERN data, { if (curr->wType == DNS_TYPE_CNAME) { + TRACE("NSP_GetHostByNameHeapAllocW found alias %ws\n", curr->Data.Cname.pNameHost); Aliases[AliasIndex++] = curr->Data.Cname.pNameHost; } curr = curr->pNext; @@ -527,6 +560,7 @@ NSP_GetHostByNameHeapAllocW(_In_ PWSHANDLEINTERN data, if (curr->wType != DNS_TYPE_A) { + ERR("NSP_GetHostByNameHeapAllocW last record is not of type A %d\n", curr->wType); result = WSASERVICE_NOT_FOUND; goto cleanup; } @@ -615,8 +649,9 @@ OpenNetworkDatabase(_In_ LPCWSTR Name) DWORD RegType; DWORD RegSize = 0; size_t StringLength; - HANDLE ret; + HANDLE Handle; + TRACE("OpenNetworkDatabase %p\n", Name); ExpandedPath = HeapAlloc(GetProcessHeap(), 0, MAX_PATH*sizeof(WCHAR)); if (!ExpandedPath) return INVALID_HANDLE_VALUE; @@ -629,6 +664,7 @@ OpenNetworkDatabase(_In_ LPCWSTR Name) &DatabaseKey); if (ErrorCode == NO_ERROR) { + TRACE("OpenNetworkDatabase registry key for network database exist\n"); /* Read the actual path */ ErrorCode = RegQueryValueEx(DatabaseKey, L"DatabasePath", @@ -637,9 +673,18 @@ OpenNetworkDatabase(_In_ LPCWSTR Name) NULL, &RegSize); + if (!RegSize) + { + ERR("OpenNetworkDatabase RegQueryValueEx failed to return size for DatabasePath %lx\n", ErrorCode); + RegCloseKey(DatabaseKey); + HeapFree(GetProcessHeap(), 0, ExpandedPath); + return INVALID_HANDLE_VALUE; + } DatabasePath = HeapAlloc(GetProcessHeap(), 0, RegSize); if (!DatabasePath) { + ERR("OpenNetworkDatabase could not allocate %d for DatabasePath\n", RegSize); + RegCloseKey(DatabaseKey); HeapFree(GetProcessHeap(), 0, ExpandedPath); return INVALID_HANDLE_VALUE; } @@ -655,6 +700,14 @@ OpenNetworkDatabase(_In_ LPCWSTR Name) /* Close the key */ RegCloseKey(DatabaseKey); + if (ErrorCode) + { + ERR("OpenNetworkDatabase RegQueryValueEx failed to return value for DatabasePath %lx\n", ErrorCode); + HeapFree(GetProcessHeap(), 0, DatabasePath); + HeapFree(GetProcessHeap(), 0, ExpandedPath); + return INVALID_HANDLE_VALUE; + } + /* Expand the name */ ExpandEnvironmentStrings(DatabasePath, ExpandedPath, MAX_PATH); @@ -662,6 +715,7 @@ OpenNetworkDatabase(_In_ LPCWSTR Name) } else { + TRACE("OpenNetworkDatabase registry key for network database doesn't exist\n"); /* Use defalt path */ GetSystemDirectory(ExpandedPath, MAX_PATH); StringCchLength(ExpandedPath, MAX_PATH, &StringLength); @@ -685,16 +739,16 @@ OpenNetworkDatabase(_In_ LPCWSTR Name) StringCchCat(ExpandedPath, MAX_PATH, Name); /* Return a handle to the file */ - ret = CreateFile(ExpandedPath, - FILE_READ_DATA, - FILE_SHARE_READ, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL); + Handle = CreateFile(ExpandedPath, + FILE_READ_DATA, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); HeapFree(GetProcessHeap(), 0, ExpandedPath); - return ret; + return Handle; } INT @@ -704,10 +758,10 @@ NSP_GetServiceByNameHeapAllocW(_In_ PWSHANDLEINTERN data, { BOOL Found = FALSE; HANDLE ServicesFile; - CHAR ServiceDBData[BUFSIZ * sizeof(WCHAR)] = {0}; + CHAR ServiceDBData[BUFSIZ * sizeof(WCHAR)] = { 0 }; PCHAR ThisLine = 0, NextLine = 0, ServiceName = 0, PortNumberStr = 0, ProtocolStr = 0, Comment = 0, EndValid; - PCHAR Aliases[WS2_INTERNAL_MAX_ALIAS] = {0}; + PCHAR Aliases[WS2_INTERNAL_MAX_ALIAS] = { 0 }; PCHAR* AliasPtr; UINT i = 0; DWORD ReadSize = 0; @@ -717,8 +771,10 @@ NSP_GetServiceByNameHeapAllocW(_In_ PWSHANDLEINTERN data, PCHAR nameProtoA = NULL; INT res = WSANO_RECOVERY; + TRACE("NSP_GetServiceByNameHeapAllocW %p %lx %p\n", data, dwControlFlags, hostinfo); if (!data->hostnameW) { + ERR("NSP_GetServiceByNameHeapAllocW service name not provided\n"); res = WSANO_RECOVERY; goto End; } @@ -731,6 +787,7 @@ NSP_GetServiceByNameHeapAllocW(_In_ PWSHANDLEINTERN data, nameProtoA = strchr(nameA, '/'); if (nameProtoA == NULL) { + ERR("NSP_GetServiceByNameHeapAllocW invalid service name %s\n", nameA); res = WSANO_RECOVERY; goto End; } @@ -744,6 +801,7 @@ NSP_GetServiceByNameHeapAllocW(_In_ PWSHANDLEINTERN data, ServicesFile = OpenNetworkDatabase(L"services"); if (ServicesFile == INVALID_HANDLE_VALUE) { + ERR("NSP_GetServiceByNameHeapAllocW unable to open services file\n"); return WSANO_RECOVERY; } @@ -755,11 +813,16 @@ NSP_GetServiceByNameHeapAllocW(_In_ PWSHANDLEINTERN data, */ /* Initial Read */ - ReadFile(ServicesFile, - ServiceDBData, - sizeof( ServiceDBData ) - 1, - &ReadSize, - NULL); + if (!ReadFile(ServicesFile, + ServiceDBData, + sizeof( ServiceDBData ) - 1, + &ReadSize, + NULL)) + { + ERR("NSP_GetServiceByNameHeapAllocW can't read services file %lx\n", GetLastError()); + CloseHandle(ServicesFile); + return WSANO_RECOVERY; + } ThisLine = NextLine = ServiceDBData; EndValid = ServiceDBData + ReadSize; @@ -775,17 +838,21 @@ NSP_GetServiceByNameHeapAllocW(_In_ PWSHANDLEINTERN data, if (ThisLine == ServiceDBData) { - //WS_DbgPrint(MIN_TRACE,("Line too long")); + ERR("NSP_GetServiceByNameHeapAllocW line too long\n"); + CloseHandle(ServicesFile); return WSANO_RECOVERY; } memmove(ServiceDBData, ThisLine, LineLen); - ReadFile(ServicesFile, - ServiceDBData + LineLen, - sizeof( ServiceDBData )-1 - LineLen, - &ReadSize, - NULL); + if (!ReadFile(ServicesFile, + ServiceDBData + LineLen, + sizeof( ServiceDBData )-1 - LineLen, + &ReadSize, + NULL)) + { + break; + } EndValid = ServiceDBData + LineLen + ReadSize; NextLine = ServiceDBData + LineLen; @@ -828,6 +895,7 @@ NSP_GetServiceByNameHeapAllocW(_In_ PWSHANDLEINTERN data, if (!Found) { + ERR("NSP_GetServiceByNameHeapAllocW service not found\n"); return WSANO_DATA; } @@ -840,10 +908,10 @@ NSP_GetServiceByNameHeapAllocW(_In_ PWSHANDLEINTERN data, res = NO_ERROR; End: - if (nameA != NULL) + if (nameA) HeapFree(hHeap, 0, nameA); - if (nameServiceA != NULL) + if (nameServiceA) HeapFree(hHeap, 0, nameServiceA); return res; @@ -864,6 +932,9 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data, CHAR* ServiceInstanceNameA = NULL; CHAR* ServiceProtocolNameA = NULL; + TRACE("NSP_LookupServiceNextW %p %lx %p %p\n", data, dwControlFlags, lpRes, lpResLen); + if (!data || (dwControlFlags & (~(DWORD)LUP_FLUSHPREVIOUS)) != 0 || !lpRes || !lpResLen || *lpResLen == 0) + return WSAEINVAL; RtlZeroMemory(&hostinfo, sizeof(hostinfo)); /* init and build result-buffer */ @@ -878,15 +949,18 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data, (data->CallID == NSP_CALLID_HOSTBYNAME) || (data->CallID == NSP_CALLID_SERVICEBYNAME)) { + /* FIXME remember what was returned and continue from there */ if (data->CallIDCounter >= 1) { - result = WSAENOMORE; + ERR("NSP_LookupServiceNextW LUP_FLUSHPREVIOUS and more than one call not supported yet\n", data, dwControlFlags, lpRes, lpResLen); + result = WSA_E_NO_MORE; goto End; } } else { - result = WSANO_RECOVERY; + ERR("NSP_LookupServiceNextW unsupported CallID %lx\n", data->CallID); + result = WSAEOPNOTSUPP; goto End; } data->CallIDCounter++; @@ -910,7 +984,7 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data, } else { - ASSERT(data->CallID == NSP_CALLID_SERVICEBYNAME); + //ASSERT(data->CallID == NSP_CALLID_SERVICEBYNAME); result = NSP_GetServiceByNameHeapAllocW(data, dwControlFlags, &hostinfo); @@ -925,29 +999,29 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data, { ServiceInstanceNameW = hostinfo.hostnameW; ServiceInstanceNameA = StrW2AHeapAlloc(hHeap, ServiceInstanceNameW); - if (ServiceInstanceNameA == NULL) + if (!ServiceInstanceNameA) { - result = WSAEFAULT; + ERR("NSP_LookupServiceNextW not enough memory\n"); + result = WSA_NOT_ENOUGH_MEMORY; goto End; - } } if (data->CallID == NSP_CALLID_SERVICEBYNAME) { ServiceInstanceNameW = hostinfo.servnameW; ServiceInstanceNameA = StrW2AHeapAlloc(hHeap, ServiceInstanceNameW); - if (ServiceInstanceNameA == NULL) + if (!ServiceInstanceNameA) { - result = WSAEFAULT; + ERR("NSP_LookupServiceNextW not enough memory\n"); + result = WSA_NOT_ENOUGH_MEMORY; goto End; - } ServiceProtocolNameA = StrW2AHeapAlloc(hHeap, hostinfo.servprotoW); - if (ServiceProtocolNameA == NULL) + if (!ServiceProtocolNameA) { - result = WSAEFAULT; + ERR("NSP_LookupServiceNextW not enough memory\n"); + result = WSA_NOT_ENOUGH_MEMORY; goto End; - } } } @@ -956,6 +1030,7 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data, { if (!mswBufferAppendAddr_AddrInfoW(&buf, lpRes, hostinfo.addr4)) { + ERR("NSP_LookupServiceNextW provided buffer is too small\n"); *lpResLen = buf.bytesUsed; result = WSAEFAULT; goto End; @@ -973,6 +1048,7 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data, ServiceInstanceNameA, hostinfo.addr4)) { + ERR("NSP_LookupServiceNextW provided buffer is too small\n"); *lpResLen = buf.bytesUsed; result = WSAEFAULT; goto End; @@ -988,6 +1064,7 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data, ServiceProtocolNameA, hostinfo.servport)) { + ERR("NSP_LookupServiceNextW provided buffer is too small\n"); *lpResLen = buf.bytesUsed; result = WSAEFAULT; goto End; @@ -995,7 +1072,8 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data, } else { - result = WSANO_RECOVERY; + ERR("NSP_LookupServiceNextW LUP_RETURN_BLOB is supported only for NSP_CALLID_HOSTBYNAME and NSP_CALLID_SERVICEBYNAME\n"); + result = WSAEINVAL; goto End; } } @@ -1007,6 +1085,7 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data, lpRes->lpszServiceInstanceName = (LPWSTR)mswBufferEndPtr(&buf); if (!mswBufferAppendStrW(&buf, ServiceInstanceNameW)) { + ERR("NSP_LookupServiceNextW provided buffer is too small\n"); lpRes->lpszServiceInstanceName = NULL; *lpResLen = buf.bytesUsed; result = WSAEFAULT; @@ -1034,6 +1113,7 @@ End: if (hostinfo.servprotoW != NULL) HeapFree(hHeap, 0, hostinfo.servprotoW); + TRACE("NSP_LookupServiceNextW returns %d needed bytes %ld\n", result, buf.bytesUsed); return result; } @@ -1048,10 +1128,11 @@ NSPStartup(_In_ LPGUID lpProviderId, { INT ret; - if ((lpRout == NULL) || - (lpRout->cbSize != sizeof(NSP_ROUTINE))) + TRACE("NSPStartup %p %p\n", lpProviderId, lpRout); + if (!lpRout || (lpRout->cbSize != sizeof(NSP_ROUTINE))) { - WSASetLastError(ERROR_INVALID_PARAMETER); + ERR("NSPStartup invalid parameter\n"); + WSASetLastError(WSAEINVAL); return ERROR_INVALID_PARAMETER; }