[MSWSOCK] Revert r74753 and r74755 as it showed regressions
authorPeter Hater <7element@mail.bg>
Sat, 3 Jun 2017 00:30:20 +0000 (00:30 +0000)
committerPeter Hater <7element@mail.bg>
Sat, 3 Jun 2017 00:30:20 +0000 (00:30 +0000)
svn path=/trunk/; revision=74756

reactos/dll/win32/mswsock/CMakeLists.txt
reactos/dll/win32/mswsock/extensions.c
reactos/dll/win32/mswsock/nsplookup.c

index ffb839a..8721463 100644 (file)
@@ -16,7 +16,6 @@ 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)
index 05221d9..2ec3301 100644 (file)
@@ -12,9 +12,6 @@
 #include <winsock2.h>
 #include <mswsock.h>
 
-#include <wine/debug.h>
-WINE_DEFAULT_DEBUG_CHANNEL(mswsock);
-
 LPFN_TRANSMITFILE pfnTransmitFile = NULL;
 LPFN_GETACCEPTEXSOCKADDRS pfnGetAcceptExSockaddrs = NULL;
 LPFN_ACCEPTEX pfnAcceptEx = NULL;
@@ -31,37 +28,29 @@ TransmitFile(SOCKET Socket,
              LPTRANSMIT_FILE_BUFFERS TransmitBuffers,
              DWORD Flags)
 {
-    GUID  TransmitFileGUID = WSAID_TRANSMITFILE;
+    GUID TransmitFileGUID = WSAID_TRANSMITFILE;
     DWORD cbBytesReturned;
-    BOOL  Ret;
 
-    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)
+    if (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;
     }
 
-    Ret = pfnTransmitFile(Socket,
-                          File,
-                          NumberOfBytesToWrite,
-                          NumberOfBytesPerSend,
-                          Overlapped,
-                          TransmitBuffers,
-                          Flags);
-    if (!Ret)
-    {
-        ERR("TransmitFile %lx\n", WSAGetLastError());
-    }
-    return Ret;
+    return pfnTransmitFile(Socket,
+                           File,
+                           NumberOfBytesToWrite,
+                           NumberOfBytesPerSend,
+                           Overlapped,
+                           TransmitBuffers,
+                           Flags);
 }
 
 /*
@@ -81,51 +70,42 @@ AcceptEx(SOCKET ListenSocket,
     GUID AcceptExGUID = WSAID_ACCEPTEX;
     GUID GetAcceptExSockaddrsGUID = WSAID_GETACCEPTEXSOCKADDRS;
     DWORD cbBytesReturned;
-    BOOL  Ret;
 
-    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)
+    if (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 (!pfnGetAcceptExSockaddrs && WSAIoctl(ListenSocket,
-                                             SIO_GET_EXTENSION_FUNCTION_POINTER,
-                                             &GetAcceptExSockaddrsGUID,
-                                             sizeof(GetAcceptExSockaddrsGUID),
-                                             &pfnGetAcceptExSockaddrs,
-                                             sizeof(pfnGetAcceptExSockaddrs),
-                                             &cbBytesReturned,
-                                             NULL,
-                                             NULL) == SOCKET_ERROR)
+    if (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;
     }
 
-    Ret = pfnAcceptEx(ListenSocket,
-                      AcceptSocket,
-                      OutputBuffer,
-                      ReceiveDataLength,
-                      LocalAddressLength,
-                      RemoteAddressLength,
-                      BytesReceived,
-                      Overlapped);
-    if (!Ret)
-    {
-        ERR("AcceptEx %lx\n", WSAGetLastError());
-    }
-    return Ret;
+    return pfnAcceptEx(ListenSocket,
+                       AcceptSocket,
+                       OutputBuffer,
+                       ReceiveDataLength,
+                       LocalAddressLength,
+                       RemoteAddressLength,
+                       BytesReceived,
+                       Overlapped);
 }
 
 
@@ -143,19 +123,16 @@ GetAcceptExSockaddrs(PVOID OutputBuffer,
                      LPSOCKADDR* RemoteSockaddr,
                      LPINT RemoteSockaddrLength)
 {
-    TRACE("AcceptEx %p %ld %ld %ld %p %p %p %p\n", OutputBuffer, ReceiveDataLength, LocalAddressLength, RemoteAddressLength, LocalSockaddr, LocalSockaddrLength, RemoteSockaddr, RemoteSockaddrLength);
-    if (!pfnGetAcceptExSockaddrs)
+    if (pfnGetAcceptExSockaddrs)
     {
-        ERR("GetAcceptExSockaddrs is NULL\n");
-        return;
+        pfnGetAcceptExSockaddrs(OutputBuffer,
+                                ReceiveDataLength,
+                                LocalAddressLength,
+                                RemoteAddressLength,
+                                LocalSockaddr,
+                                LocalSockaddrLength,
+                                RemoteSockaddr,
+                                RemoteSockaddrLength);
     }
-    pfnGetAcceptExSockaddrs(OutputBuffer,
-                            ReceiveDataLength,
-                            LocalAddressLength,
-                            RemoteAddressLength,
-                            LocalSockaddr,
-                            LocalSockaddrLength,
-                            RemoteSockaddr,
-                            RemoteSockaddrLength);
 }
 /* EOF */
index e86f4d4..b11712a 100644 (file)
@@ -14,8 +14,8 @@
 
 #include "mswhelper.h"
 
-#include <wine/debug.h>
-WINE_DEFAULT_DEBUG_CHANNEL(mswsock);
+#define NDEBUG
+#include <debug.h>
 
 #define NSP_CALLID_DNS 0x0001
 #define NSP_CALLID_HOSTNAME 0x0002
@@ -23,32 +23,34 @@ WINE_DEFAULT_DEBUG_CHANNEL(mswsock);
 #define NSP_CALLID_SERVICEBYNAME 0x0004
 
 #ifndef BUFSIZ
-  #define BUFSIZ 1024
+#define BUFSIZ 1024
 #endif // BUFSIZ
 #ifndef WS2_INTERNAL_MAX_ALIAS
-  #define WS2_INTERNAL_MAX_ALIAS 512
+#define WS2_INTERNAL_MAX_ALIAS 512
 #endif // WS2_INTERNAL_MAX_ALIAS
 
+//#define IP_LOCALHOST 0x0100007F
+
 //#define NSP_REDIRECT
 
 typedef struct {
-    WCHAR* hostnameW;
-    DWORD addr4;
-    WCHAR* servnameW;
-    WCHAR* servprotoW;
-    CHAR** servaliasesA; /* array */
-    WORD servport;
+  WCHAR* hostnameW;
+  DWORD addr4;
+  WCHAR* servnameW;
+  WCHAR* servprotoW;
+  CHAR** servaliasesA; /* array */
+  WORD servport;
 } WSHOSTINFOINTERN, *PWSHOSTINFOINTERN;
 
 typedef struct {
-    GUID providerId; /* Provider-ID */
-    DWORD dwControlFlags; /* dwControlFlags (WSALookupServiceBegin) */
-    DWORD CallID; /* List for LookupServiceNext-Calls */
-    DWORD CallIDCounter; /* call-count of the current CallID. */
-    WCHAR* hostnameW; /* hostbyname */
+  GUID providerId; /* Provider-ID */
+  DWORD dwControlFlags; /* dwControlFlags (WSALookupServiceBegin) */
+  DWORD CallID; /* List for LookupServiceNext-Calls */
+  DWORD CallIDCounter; /* call-count of the current CallID. */
+  WCHAR* hostnameW; /* hostbyname */
 #ifdef NSP_REDIRECT
-    HANDLE rdrLookup;
-    NSP_ROUTINE rdrproc;
+  HANDLE rdrLookup;
+  NSP_ROUTINE rdrproc;
 #endif
 } WSHANDLEINTERN, *PWSHANDLEINTERN;
 
@@ -87,208 +89,496 @@ NSP_ROUTINE rdrproc_nla;
 
 #endif /* NSP_REDIRECT */
 
-/* Implementations - Internal */
+/* Forwards */
+INT
+WINAPI
+mswNSPStartup(
+  LPGUID lpProviderId,
+  LPNSP_ROUTINE lpRout);
 
-/*
-    hostnameA / hostnameW
-    * only used by HOSTBYNAME
-    * only one should be set
+INT
+NSP_LookupServiceBeginW(
+  PWSHANDLEINTERN data,
+  CHAR* hostnameA,
+  WCHAR* hostnameW,
+  DWORD CallID);
 
-*/
 INT
-NSP_LookupServiceBeginW(PWSHANDLEINTERN data,
-                        CHAR* hostnameA,
-                        WCHAR* hostnameW,
-                        DWORD CallID)
-{
-    HANDLE hHeap;
+NSP_LookupServiceNextW(
+  _In_ PWSHANDLEINTERN data,
+  _In_ DWORD dwControlFlags,
+  _Inout_ LPWSAQUERYSETW lpRes,
+  _Inout_ LPDWORD lpResLen);
 
-    TRACE("NSP_LookupServiceBeginW %p %p %p %lx\n", data, hostnameA, hostnameW, CallID);
-    if (data->CallID != 0)
-        return WSAEFAULT;
+INT
+NSP_GetHostNameHeapAllocW(
+  _Out_ WCHAR** hostname);
 
-    data->CallID = CallID;
+INT
+NSP_GetHostByNameHeapAllocW(
+  _In_ PWSHANDLEINTERN data,
+  _In_ DWORD dwControlFlags,
+  _Out_ PWSHOSTINFOINTERN hostinfo);
 
-    if ((CallID == NSP_CALLID_HOSTBYNAME) ||
-        (CallID == NSP_CALLID_SERVICEBYNAME))
-    {
-        hHeap = GetProcessHeap();
+INT
+NSP_GetServiceByNameHeapAllocW(
+  _In_ PWSHANDLEINTERN data,
+  _In_ DWORD dwControlFlags,
+  _Out_ PWSHOSTINFOINTERN hostinfo);
 
-        if (data->hostnameW != NULL)
-            HeapFree(hHeap, 0, data->hostnameW);
+/* Implementations - Internal */
 
-        if (hostnameA != NULL)
-        {
-            data->hostnameW = StrA2WHeapAlloc(hHeap, hostnameA);
-        }
-        else
-        {
-            data->hostnameW = StrCpyHeapAllocW(hHeap, hostnameW);
-        }
-    }
-    else
-    {
-        ERR("NSP_LookupServiceBeginW unsupported CallID\n");
-        WSASetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-        return ERROR_CALL_NOT_IMPLEMENTED;
-    }
+INT
+WSAAPI
+mwsNSPCleanUp(_In_ LPGUID lpProviderId)
+{
+    //WSASetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+    //return ERROR_CALL_NOT_IMPLEMENTED;
+    return ERROR_SUCCESS;
+}
 
+INT
+mwsNSPInit(VOID)
+{
     return ERROR_SUCCESS;
 }
 
 INT
-NSP_GetHostNameHeapAllocW(_Out_ WCHAR** hostname)
+WSAAPI
+mwsNSPLookupServiceBegin(_In_ LPGUID lpProviderId,
+                         _In_ LPWSAQUERYSETW lpqsRestrictions,
+                         _In_ LPWSASERVICECLASSINFOW lpServiceClassInfo,
+                         _In_ DWORD dwControlFlags,
+                         _Out_ LPHANDLE lphLookup)
 {
-    WCHAR* name;
-    HANDLE hHeap = GetProcessHeap();
-    DWORD bufCharLen = 0;
+    PWSHANDLEINTERN pLook;
+    int wsaErr;
 
-    TRACE("NSP_GetHostNameHeapAllocW %p\n", hostname);
-    /* FIXME Use DnsGetHostName_W when available */
-    GetComputerNameExW(ComputerNameDnsHostname, NULL, &bufCharLen);
-    if (!bufCharLen)
+    if (IsEqualGUID(lpProviderId, &guid_mswsock_TcpIp))
     {
-        ERR("NSP_GetHostNameHeapAllocW zero size for computername returned\n");
-        WSASetLastError(WSAEFAULT);
+        //OK
+    }
+    else if (IsEqualGUID(lpProviderId, &guid_mswsock_NLA))
+    {
+        WSASetLastError(WSASERVICE_NOT_FOUND);
         return SOCKET_ERROR;
     }
-    name = HeapAlloc(hHeap, 0, bufCharLen*sizeof(WCHAR));
-    if (!GetComputerNameExW(ComputerNameDnsHostname,
-                            name,
-                            &bufCharLen))
+    else
+    {
+        return ERROR_CALL_NOT_IMPLEMENTED;
+    }
+
+    /* allocate internal structure */
+    pLook = HeapAlloc(GetProcessHeap(), 0, sizeof(WSHANDLEINTERN));
+    if (!pLook)
     {
-        ERR("NSP_GetHostNameHeapAllocW error obtaining computername %lx\n", GetLastError());
-        HeapFree(hHeap, 0, name);
         WSASetLastError(WSAEFAULT);
         return SOCKET_ERROR;
     }
 
-    *hostname = name;
-    return ERROR_SUCCESS;
-}
+    *lphLookup = (HANDLE)pLook;
 
-INT
-NSP_GetHostByNameHeapAllocW(_In_ PWSHANDLEINTERN data,
-                            _In_ DWORD dwControlFlags,
-                            _Out_ PWSHOSTINFOINTERN hostinfo)
-{
-    HANDLE hHeap = GetProcessHeap();
-    DNS_STATUS dns_status = { 0 };
-    /* include/WinDNS.h -- look up DNS_RECORD on MSDN */
-    PDNS_RECORDW dp;
-    PDNS_RECORDW curr;
-    INT result = ERROR_SUCCESS;
-    DWORD dwQueryFlags = DNS_QUERY_STANDARD;
-    PWCHAR Aliases[WS2_INTERNAL_MAX_ALIAS] = { 0 };
-    int AliasIndex = 0;
+    RtlZeroMemory(pLook, sizeof(*pLook));
 
-    TRACE("NSP_GetHostByNameHeapAllocW %p %lx %p\n", data, dwControlFlags, hostinfo);
-    /* needed to be cleaned up if != NULL */
-    dp = NULL;
+    /* Anyway the ControlFlags "should" be needed
+       in NSPLookupServiceNext. (see doku) But
+       thats not the fact ATM. */
+    pLook->dwControlFlags = dwControlFlags;
+    pLook->providerId = *lpProviderId;
 
-    if (!data->hostnameW)
+#ifdef NSP_REDIRECT
+
+    if (IsEqualGUID(lpProviderId, &guid_mswsock_TcpIp))
     {
-        result = ERROR_INVALID_PARAMETER;
-        goto cleanup;
+        pLook->rdrproc = rdrproc_tcpip;
     }
-
-    if ((data->dwControlFlags & LUP_DEEP) == 0)
+    else if (IsEqualGUID(lpProviderId, &guid_mswsock_NLA))
     {
-        TRACE("NSP_GetHostByNameHeapAllocW LUP_DEEP is not specified. Disabling recursion\n");
-        dwQueryFlags |= DNS_QUERY_NO_RECURSION;
+        pLook->rdrproc = rdrproc_nla;
     }
-
-    /* DNS_TYPE_A: include/WinDNS.h */
-    /* DnsQuery -- lib/dnsapi/dnsapi/query.c */
-    dns_status = DnsQuery_W(data->hostnameW,
-                            DNS_TYPE_A,
-                            dwQueryFlags,
-                            NULL /* extra dns servers */,
-                            &dp,
-                            NULL);
-    if (dns_status == ERROR_INVALID_NAME)
+    else
     {
-        ERR("NSP_GetHostByNameHeapAllocW invalid name\n");
-        WSASetLastError(WSAEFAULT);
-        result = ERROR_INVALID_PARAMETER;
-        goto cleanup;
+        return ERROR_CALL_NOT_IMPLEMENTED;
     }
 
-    if ((dns_status != 0) || (dp == NULL))
+    if (pLook->rdrproc.NSPLookupServiceBegin(lpProviderId,
+                                             lpqsRestrictions,
+                                             lpServiceClassInfo,
+                                             dwControlFlags,
+                                             &pLook->rdrLookup) == NO_ERROR)
     {
-        ERR("NSP_GetHostByNameHeapAllocW not found %lx %p\n", dns_status, dp);
-        result = WSAHOST_NOT_FOUND;
-        goto cleanup;
+        wsaErr = NO_ERROR;
     }
-
-    //ASSERT(dp->wType == DNS_TYPE_A);
-    //ASSERT(dp->wDataLength == sizeof(DNS_A_DATA));
-    curr = dp;
-    while ((curr->pNext != NULL) || (curr->wType != DNS_TYPE_A))
+    else
     {
-        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;
+        wsaErr = WSAGetLastError();
     }
 
-    if (curr->wType != DNS_TYPE_A)
+    /*
+    if (res)
+        res = WSAGetLastError();
+    */
+
+#else /* NSP_REDIRECT */
+
+    wsaErr = ERROR_CALL_NOT_IMPLEMENTED;
+    if (IsEqualGUID(lpqsRestrictions->lpServiceClassId, &guid_NULL))
     {
-        ERR("NSP_GetHostByNameHeapAllocW last record is not of type A %d\n", curr->wType);
-        result = WSASERVICE_NOT_FOUND;
-        goto cleanup;
+        wsaErr = ERROR_CALL_NOT_IMPLEMENTED;
     }
-    hostinfo->hostnameW = StrCpyHeapAllocW(hHeap, curr->pName);
-    hostinfo->addr4 = curr->Data.A.IpAddress;
-    if (AliasIndex)
+    else if (IsEqualGUID(lpqsRestrictions->lpServiceClassId, &guid_HOSTNAME))
     {
-        hostinfo->servaliasesA = StrAryCpyHeapAllocWToA(hHeap, (WCHAR**)&Aliases);
+        wsaErr = NSP_LookupServiceBeginW(pLook,
+                                         NULL,
+                                         NULL,
+                                         NSP_CALLID_HOSTNAME);
+    }
+    else if (IsEqualGUID(lpqsRestrictions->lpServiceClassId,
+                         &guid_INET_HOSTADDRBYNAME))
+    {
+       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);
+    }
+    else if (IsEqualGUID(lpqsRestrictions->lpServiceClassId,
+                         &guid_INET_HOSTADDRBYINETSTRING))
+    {
+        wsaErr = ERROR_CALL_NOT_IMPLEMENTED;
     }
-    result = ERROR_SUCCESS;
 
-cleanup:
-    if (dp != NULL)
-        DnsRecordListFree(dp, DnsFreeRecordList);
+#endif /* NSP_REDIRECT */
 
-    return result;
+    if (wsaErr != NO_ERROR)
+    {
+        WSASetLastError(wsaErr);
+        return SOCKET_ERROR;
+    }
+    return NO_ERROR;
 }
 
-#define SKIPWS(ptr, act) \
-{while(*ptr && isspace(*ptr)) ptr++; if(!*ptr) act;}
+INT
+WSAAPI
+mwsNSPLookupServiceNext(_In_ HANDLE hLookup,
+                        _In_ DWORD dwControlFlags,
+                        _Inout_ LPDWORD lpdwBufferLength,
+                        //_Out_writes_bytes_to_(*lpdwBufferLength, *lpdwBufferLength)
+                        LPWSAQUERYSETW lpqsResults)
+{
+    PWSHANDLEINTERN pLook = hLookup;
+    int wsaErr = 0;
 
-#define SKIPANDMARKSTR(ptr, act) \
-{while(*ptr && !isspace(*ptr)) ptr++; \
- if(!*ptr) {act;} else { *ptr = 0; ptr++; }}
+#ifdef NSP_REDIRECT
 
-static
-BOOL
-DecodeServEntFromString(IN PCHAR ServiceString,
-                        OUT PCHAR *ServiceName,
-                        OUT PCHAR *PortNumberStr,
-                        OUT PCHAR *ProtocolStr,
-                        IN PCHAR *Aliases,
-                        IN DWORD MaxAlias)
-{
-    UINT NAliases = 0;
+    INT res = pLook->rdrproc.NSPLookupServiceNext(pLook->rdrLookup,
+                                                  dwControlFlags,
+                                                  lpdwBufferLength,
+                                                  lpqsResults);
+    wsaErr = WSAGetLastError();
+    if (res != ERROR_SUCCESS)
+    {
+        wsaErr = WSAGetLastError();
 
-    //WS_DbgPrint(MAX_TRACE, ("Parsing service ent [%s]\n", ServiceString));
+        if (wsaErr == 0)
+            wsaErr = 0xFFFFFFFF;
+    }
 
-    SKIPWS(ServiceString, return FALSE);
-    *ServiceName = ServiceString;
-    SKIPANDMARKSTR(ServiceString, return FALSE);
-    SKIPWS(ServiceString, return FALSE);
-    *PortNumberStr = ServiceString;
-    SKIPANDMARKSTR(ServiceString, ;);
+#else /* NSP_REDIRECT */
 
-    while (*ServiceString && NAliases < MaxAlias - 1)
+    if ((lpdwBufferLength == NULL) || (*lpdwBufferLength == 0))
     {
-        SKIPWS(ServiceString, break);
-        if (*ServiceString)
-        {
-            SKIPWS(ServiceString, ;);
-            if (strlen(ServiceString))
+        wsaErr = WSA_NOT_ENOUGH_MEMORY;
+        goto End;
+    }
+
+    RtlZeroMemory(lpqsResults, *lpdwBufferLength);
+    lpqsResults->dwSize = sizeof(*lpqsResults);
+
+    wsaErr = NSP_LookupServiceNextW(pLook,
+                                    dwControlFlags,
+                                    lpqsResults,
+                                    lpdwBufferLength);
+
+
+#endif /* NSP_REDIRECT */
+
+End:
+    if (wsaErr != 0)
+    {
+        WSASetLastError(wsaErr);
+        return SOCKET_ERROR;
+    }
+    return NO_ERROR;
+}
+
+INT
+WSAAPI
+mwsNSPIoCtl(_In_ HANDLE hLookup,
+            _In_ DWORD dwControlCode,
+            _In_reads_bytes_(cbInBuffer) LPVOID lpvInBuffer,
+            _In_ DWORD cbInBuffer,
+            _Out_writes_bytes_to_(cbOutBuffer, *lpcbBytesReturned) LPVOID lpvOutBuffer,
+            _In_ DWORD cbOutBuffer,
+            _Out_ LPDWORD lpcbBytesReturned,
+            _In_opt_ LPWSACOMPLETION lpCompletion,
+            _In_ LPWSATHREADID lpThreadId)
+{
+    WSASetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+    return ERROR_CALL_NOT_IMPLEMENTED;
+}
+
+INT
+WSAAPI
+mwsNSPLookupServiceEnd(_In_ HANDLE hLookup)
+{
+    PWSHANDLEINTERN pLook;
+    HANDLE hHeap;
+    INT res;
+
+    res = NO_ERROR;
+    pLook = (PWSHANDLEINTERN)hLookup;
+    hHeap = GetProcessHeap();
+
+#ifdef NSP_REDIRECT
+    res = pLook->rdrproc.NSPLookupServiceEnd(pLook->rdrLookup);
+#endif
+
+    if (pLook->hostnameW != NULL)
+        HeapFree(hHeap, 0, pLook->hostnameW);
+
+    HeapFree(hHeap, 0, pLook);
+    return res;
+}
+
+INT
+WSAAPI
+mwsNSPSetService(_In_ LPGUID lpProviderId,
+                 _In_ LPWSASERVICECLASSINFOW lpServiceClassInfo,
+                 _In_ LPWSAQUERYSETW lpqsRegInfo,
+                 _In_ WSAESETSERVICEOP essOperation,
+                 _In_ DWORD dwControlFlags)
+{
+    WSASetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+    return ERROR_CALL_NOT_IMPLEMENTED;
+}
+
+INT
+WSAAPI
+mwsNSPInstallServiceClass(_In_ LPGUID lpProviderId,
+                          _In_ LPWSASERVICECLASSINFOW lpServiceClassInfo)
+{
+    WSASetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+    return ERROR_CALL_NOT_IMPLEMENTED;
+}
+
+INT
+WSAAPI
+mwsNSPRemoveServiceClass(_In_ LPGUID lpProviderId,
+                         _In_ LPGUID lpServiceClassId)
+{
+    WSASetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+    return ERROR_CALL_NOT_IMPLEMENTED;
+}
+
+INT
+WSAAPI
+mwsNSPGetServiceClassInfo(_In_ LPGUID lpProviderId,
+                          _In_ LPDWORD lpdwBufSize,
+                          _In_ LPWSASERVICECLASSINFOW lpServiceClassInfo)
+{
+    WSASetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+    return ERROR_CALL_NOT_IMPLEMENTED;
+}
+
+/*
+    hostnameA / hostnameW
+    * only used by HOSTBYNAME
+    * only one should be set
+
+*/
+INT
+NSP_LookupServiceBeginW(PWSHANDLEINTERN data,
+                        CHAR* hostnameA,
+                        WCHAR* hostnameW,
+                        DWORD CallID)
+{
+    HANDLE hHeap;
+
+    if (data->CallID != 0)
+        return WSAEFAULT;
+
+    data->CallID = CallID;
+
+    if ((CallID == NSP_CALLID_HOSTBYNAME) ||
+        (CallID == NSP_CALLID_SERVICEBYNAME))
+    {
+        hHeap = GetProcessHeap();
+
+        if (data->hostnameW != NULL)
+            HeapFree(hHeap, 0, data->hostnameW);
+
+        if (hostnameA != NULL)
+        {
+            data->hostnameW = StrA2WHeapAlloc(hHeap, hostnameA);
+        }
+        else
+        {
+            data->hostnameW = StrCpyHeapAllocW(hHeap, hostnameW);
+        }
+    }
+
+    WSASetLastError(0);
+
+    return ERROR_SUCCESS;
+}
+
+INT
+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);
+
+    if (!GetComputerNameExW(ComputerNameDnsHostname,
+                            name,
+                            &bufCharLen))
+    {
+        HeapFree(hHeap, 0, name);
+        WSASetLastError(WSAEFAULT);
+        return SOCKET_ERROR;
+    }
+
+    *hostname = name;
+    return ERROR_SUCCESS;
+}
+
+INT
+NSP_GetHostByNameHeapAllocW(_In_ PWSHANDLEINTERN data,
+                            _In_ DWORD dwControlFlags,
+                            _Out_ PWSHOSTINFOINTERN hostinfo)
+{
+    HANDLE hHeap = GetProcessHeap();
+    DNS_STATUS dns_status = { 0 };
+    /* include/WinDNS.h -- look up DNS_RECORD on MSDN */
+    PDNS_RECORDW dp;
+    PDNS_RECORDW curr;
+    INT result = ERROR_SUCCESS;
+    DWORD dwQueryFlags = DNS_QUERY_STANDARD;
+    PWCHAR Aliases[WS2_INTERNAL_MAX_ALIAS] = { 0 };
+    int AliasIndex = 0;
+
+    /* needed to be cleaned up if != NULL */
+    dp = NULL;
+
+    if (data->hostnameW == NULL)
+    {
+        result = ERROR_INVALID_PARAMETER;
+        goto cleanup;
+    }
+
+    if ((data->dwControlFlags & LUP_DEEP) == 0)
+    {
+        dwQueryFlags |= DNS_QUERY_NO_RECURSION;
+    }
+
+    /* DNS_TYPE_A: include/WinDNS.h */
+    /* DnsQuery -- lib/dnsapi/dnsapi/query.c */
+    dns_status = DnsQuery_W(data->hostnameW,
+                            DNS_TYPE_A,
+                            dwQueryFlags,
+                            NULL /* extra dns servers */,
+                            &dp,
+                            NULL);
+    if (dns_status == ERROR_INVALID_NAME)
+    {
+        WSASetLastError(WSAEFAULT);
+        result = ERROR_INVALID_PARAMETER;
+        goto cleanup;
+    }
+
+    if ((dns_status != 0) || (dp == NULL))
+    {
+        result = WSAHOST_NOT_FOUND;
+        goto cleanup;
+    }
+
+    //ASSERT(dp->wType == DNS_TYPE_A);
+    //ASSERT(dp->wDataLength == sizeof(DNS_A_DATA));
+    curr = dp;
+    while ((curr->pNext != NULL) || (curr->wType != DNS_TYPE_A))
+    {
+        if (curr->wType == DNS_TYPE_CNAME)
+        {
+            Aliases[AliasIndex++] = curr->Data.Cname.pNameHost;
+        }
+        curr = curr->pNext;
+    }
+
+    if (curr->wType != DNS_TYPE_A)
+    {
+        result = WSASERVICE_NOT_FOUND;
+        goto cleanup;
+    }
+    hostinfo->hostnameW = StrCpyHeapAllocW(hHeap, curr->pName);
+    hostinfo->addr4 = curr->Data.A.IpAddress;
+    if (AliasIndex)
+    {
+        hostinfo->servaliasesA = StrAryCpyHeapAllocWToA(hHeap, (WCHAR**)&Aliases);
+    }
+    result = ERROR_SUCCESS;
+
+cleanup:
+    if (dp != NULL)
+        DnsRecordListFree(dp, DnsFreeRecordList);
+
+    return result;
+}
+
+#define SKIPWS(ptr, act) \
+{while(*ptr && isspace(*ptr)) ptr++; if(!*ptr) act;}
+
+#define SKIPANDMARKSTR(ptr, act) \
+{while(*ptr && !isspace(*ptr)) ptr++; \
+ if(!*ptr) {act;} else { *ptr = 0; ptr++; }}
+
+static
+BOOL
+DecodeServEntFromString(IN PCHAR ServiceString,
+                        OUT PCHAR *ServiceName,
+                        OUT PCHAR *PortNumberStr,
+                        OUT PCHAR *ProtocolStr,
+                        IN PCHAR *Aliases,
+                        IN DWORD MaxAlias)
+{
+    UINT NAliases = 0;
+
+    //WS_DbgPrint(MAX_TRACE, ("Parsing service ent [%s]\n", ServiceString));
+
+    SKIPWS(ServiceString, return FALSE);
+    *ServiceName = ServiceString;
+    SKIPANDMARKSTR(ServiceString, return FALSE);
+    SKIPWS(ServiceString, return FALSE);
+    *PortNumberStr = ServiceString;
+    SKIPANDMARKSTR(ServiceString, ;);
+
+    while (*ServiceString && NAliases < MaxAlias - 1)
+    {
+        SKIPWS(ServiceString, break);
+        if (*ServiceString)
+        {
+            SKIPWS(ServiceString, ;);
+            if (strlen(ServiceString))
             {
                 //WS_DbgPrint(MAX_TRACE, ("Alias: %s\n", ServiceString));
                 *Aliases++ = ServiceString;
@@ -325,9 +615,8 @@ OpenNetworkDatabase(_In_ LPCWSTR Name)
     DWORD RegType;
     DWORD RegSize = 0;
     size_t StringLength;
-    HANDLE Handle;
+    HANDLE ret;
 
-    TRACE("OpenNetworkDatabase %p\n", Name);
     ExpandedPath = HeapAlloc(GetProcessHeap(), 0, MAX_PATH*sizeof(WCHAR));
     if (!ExpandedPath)
         return INVALID_HANDLE_VALUE;
@@ -340,7 +629,6 @@ 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",
@@ -349,18 +637,9 @@ 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;
         }
@@ -376,14 +655,6 @@ 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);
 
@@ -391,7 +662,6 @@ 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);
@@ -415,16 +685,16 @@ OpenNetworkDatabase(_In_ LPCWSTR Name)
     StringCchCat(ExpandedPath, MAX_PATH, Name);
 
     /* Return a handle to the file */
-    Handle = CreateFile(ExpandedPath,
-                        FILE_READ_DATA,
-                        FILE_SHARE_READ,
-                        NULL,
-                        OPEN_EXISTING,
-                        FILE_ATTRIBUTE_NORMAL,
-                        NULL);
+    ret = CreateFile(ExpandedPath,
+                      FILE_READ_DATA,
+                      FILE_SHARE_READ,
+                      NULL,
+                      OPEN_EXISTING,
+                      FILE_ATTRIBUTE_NORMAL,
+                      NULL);
 
     HeapFree(GetProcessHeap(), 0, ExpandedPath);
-    return Handle;
+    return ret;
 }
 
 INT
@@ -434,10 +704,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;
@@ -447,10 +717,8 @@ 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;
     }
@@ -463,7 +731,6 @@ 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;
     }
@@ -477,7 +744,6 @@ 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;
     }
 
@@ -489,16 +755,11 @@ NSP_GetServiceByNameHeapAllocW(_In_ PWSHANDLEINTERN data,
     */
 
     /* Initial Read */
-    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;
-    }
+    ReadFile(ServicesFile,
+             ServiceDBData,
+             sizeof( ServiceDBData ) - 1,
+             &ReadSize,
+             NULL);
 
     ThisLine = NextLine = ServiceDBData;
     EndValid = ServiceDBData + ReadSize;
@@ -514,21 +775,17 @@ NSP_GetServiceByNameHeapAllocW(_In_ PWSHANDLEINTERN data,
 
                 if (ThisLine == ServiceDBData)
                 {
-                    ERR("NSP_GetServiceByNameHeapAllocW line too long\n");
-                    CloseHandle(ServicesFile);
+                    //WS_DbgPrint(MIN_TRACE,("Line too long"));
                     return WSANO_RECOVERY;
                 }
 
                 memmove(ServiceDBData, ThisLine, LineLen);
 
-                if (!ReadFile(ServicesFile,
-                              ServiceDBData + LineLen,
-                              sizeof( ServiceDBData )-1 - LineLen,
-                              &ReadSize,
-                              NULL))
-                {
-                    break;
-                }
+                ReadFile(ServicesFile,
+                         ServiceDBData + LineLen,
+                         sizeof( ServiceDBData )-1 - LineLen,
+                         &ReadSize,
+                         NULL);
 
                 EndValid = ServiceDBData + LineLen + ReadSize;
                 NextLine = ServiceDBData + LineLen;
@@ -571,7 +828,6 @@ NSP_GetServiceByNameHeapAllocW(_In_ PWSHANDLEINTERN data,
 
     if (!Found)
     {
-        ERR("NSP_GetServiceByNameHeapAllocW service not found\n");
         return WSANO_DATA;
     }
 
@@ -584,10 +840,10 @@ NSP_GetServiceByNameHeapAllocW(_In_ PWSHANDLEINTERN data,
     res = NO_ERROR;
 
 End:
-    if (nameA)
+    if (nameA != NULL)
         HeapFree(hHeap, 0, nameA);
 
-    if (nameServiceA)
+    if (nameServiceA != NULL)
         HeapFree(hHeap, 0, nameServiceA);
 
     return res;
@@ -608,9 +864,6 @@ 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 */
@@ -625,18 +878,15 @@ 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)
         {
-            ERR("NSP_LookupServiceNextW LUP_FLUSHPREVIOUS and more than one call not supported yet\n", data, dwControlFlags, lpRes, lpResLen);
-            result = WSA_E_NO_MORE;
+            result = WSAENOMORE;
             goto End;
         }
     }
     else
     {
-        ERR("NSP_LookupServiceNextW unsupported CallID %lx\n", data->CallID);
-        result = WSAEOPNOTSUPP;
+        result = WSANO_RECOVERY;
         goto End;
     }
     data->CallIDCounter++;
@@ -660,7 +910,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);
@@ -675,29 +925,29 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data,
         {
             ServiceInstanceNameW = hostinfo.hostnameW;
             ServiceInstanceNameA = StrW2AHeapAlloc(hHeap, ServiceInstanceNameW);
-            if (!ServiceInstanceNameA)
+            if (ServiceInstanceNameA == NULL)
             {
-                ERR("NSP_LookupServiceNextW not enough memory\n");
-                result = WSA_NOT_ENOUGH_MEMORY;
+                result = WSAEFAULT;
                 goto End;
+
             }
         }
         if (data->CallID == NSP_CALLID_SERVICEBYNAME)
         {
             ServiceInstanceNameW = hostinfo.servnameW;
             ServiceInstanceNameA = StrW2AHeapAlloc(hHeap, ServiceInstanceNameW);
-            if (!ServiceInstanceNameA)
+            if (ServiceInstanceNameA == NULL)
             {
-                ERR("NSP_LookupServiceNextW not enough memory\n");
-                result = WSA_NOT_ENOUGH_MEMORY;
+                result = WSAEFAULT;
                 goto End;
+
             }
             ServiceProtocolNameA = StrW2AHeapAlloc(hHeap, hostinfo.servprotoW);
-            if (!ServiceProtocolNameA)
+            if (ServiceProtocolNameA == NULL)
             {
-                ERR("NSP_LookupServiceNextW not enough memory\n");
-                result = WSA_NOT_ENOUGH_MEMORY;
+                result = WSAEFAULT;
                 goto End;
+
             }
         }
     }
@@ -706,7 +956,6 @@ 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;
@@ -724,7 +973,6 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data,
                                              ServiceInstanceNameA,
                                              hostinfo.addr4))
             {
-                ERR("NSP_LookupServiceNextW provided buffer is too small\n");
                 *lpResLen = buf.bytesUsed;
                 result = WSAEFAULT;
                 goto End;
@@ -740,7 +988,6 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data,
                                              ServiceProtocolNameA,
                                              hostinfo.servport))
             {
-                ERR("NSP_LookupServiceNextW provided buffer is too small\n");
                 *lpResLen = buf.bytesUsed;
                 result = WSAEFAULT;
                 goto End;
@@ -748,8 +995,7 @@ NSP_LookupServiceNextW(_In_ PWSHANDLEINTERN data,
         }
         else
         {
-            ERR("NSP_LookupServiceNextW LUP_RETURN_BLOB is supported only for NSP_CALLID_HOSTBYNAME and NSP_CALLID_SERVICEBYNAME\n");
-            result = WSAEINVAL;
+            result = WSANO_RECOVERY;
             goto End;
         }
     }
@@ -761,7 +1007,6 @@ 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;
@@ -789,293 +1034,9 @@ End:
     if (hostinfo.servprotoW != NULL)
         HeapFree(hHeap, 0, hostinfo.servprotoW);
 
-    TRACE("NSP_LookupServiceNextW returns %d needed bytes %ld\n", result, buf.bytesUsed);
     return result;
 }
 
-INT
-WSAAPI
-mwsNSPCleanUp(_In_ LPGUID lpProviderId)
-{
-    return ERROR_SUCCESS;
-}
-
-INT
-mwsNSPInit(VOID)
-{
-    return ERROR_SUCCESS;
-}
-
-INT
-WSAAPI
-mwsNSPLookupServiceBegin(_In_ LPGUID lpProviderId,
-                         _In_ LPWSAQUERYSETW lpqsRestrictions,
-                         _In_ LPWSASERVICECLASSINFOW lpServiceClassInfo,
-                         _In_ DWORD dwControlFlags,
-                         _Out_ LPHANDLE lphLookup)
-{
-    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;
-    }
-
-    /* allocate internal structure */
-    pLook = HeapAlloc(GetProcessHeap(), 0, sizeof(WSHANDLEINTERN));
-    if (!pLook)
-    {
-        ERR("Error allocating %d for handle\n", sizeof(WSHANDLEINTERN));
-        WSASetLastError(WSAEFAULT);
-        return SOCKET_ERROR;
-    }
-
-    *lphLookup = (HANDLE)pLook;
-
-    RtlZeroMemory(pLook, sizeof(*pLook));
-
-    /* Anyway the ControlFlags "should" be needed
-       in NSPLookupServiceNext. (see doku) But
-       thats not the fact ATM. */
-    pLook->dwControlFlags = dwControlFlags;
-    pLook->providerId = *lpProviderId;
-
-#ifdef NSP_REDIRECT
-
-    if (IsEqualGUID(lpProviderId, &guid_mswsock_TcpIp))
-    {
-        pLook->rdrproc = rdrproc_tcpip;
-    }
-    else if (IsEqualGUID(lpProviderId, &guid_mswsock_NLA))
-    {
-        pLook->rdrproc = rdrproc_nla;
-    }
-    else
-    {
-        return ERROR_CALL_NOT_IMPLEMENTED;
-    }
-
-    if (pLook->rdrproc.NSPLookupServiceBegin(lpProviderId,
-                                             lpqsRestrictions,
-                                             lpServiceClassInfo,
-                                             dwControlFlags,
-                                             &pLook->rdrLookup) == NO_ERROR)
-    {
-        wsaErr = NO_ERROR;
-    }
-    else
-    {
-        wsaErr = WSAGetLastError();
-    }
-
-    /*
-    if (res)
-        res = WSAGetLastError();
-    */
-
-#else /* NSP_REDIRECT */
-
-    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,
-                                         NSP_CALLID_HOSTNAME);
-    }
-    else if (IsEqualGUID(lpqsRestrictions->lpServiceClassId,
-                         &guid_INET_HOSTADDRBYNAME))
-    {
-        TRACE("INET_HOSTADDRBYNAME GUID\n");
-        wsaErr = NSP_LookupServiceBeginW(pLook,
-                                         NULL,
-                                         lpqsRestrictions->lpszServiceInstanceName,
-                                         NSP_CALLID_HOSTBYNAME);
-    }
-    else if (IsEqualGUID(lpqsRestrictions->lpServiceClassId,
-                         &guid_INET_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;
-    }
-
-#endif /* NSP_REDIRECT */
-
-    if (wsaErr != NO_ERROR)
-    {
-        ERR("mwsNSPLookupServiceBegin wsaErr = %d\n", wsaErr);
-        WSASetLastError(wsaErr);
-        return SOCKET_ERROR;
-    }
-    return NO_ERROR;
-}
-
-INT
-WSAAPI
-mwsNSPLookupServiceNext(_In_ HANDLE hLookup,
-                        _In_ DWORD dwControlFlags,
-                        _Inout_ LPDWORD lpdwBufferLength,
-                        //_Out_writes_bytes_to_(*lpdwBufferLength, *lpdwBufferLength)
-                        LPWSAQUERYSETW lpqsResults)
-{
-    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,
-                                                  dwControlFlags,
-                                                  lpdwBufferLength,
-                                                  lpqsResults);
-    wsaErr = WSAGetLastError();
-    if (res != ERROR_SUCCESS)
-    {
-        wsaErr = WSAGetLastError();
-
-        if (wsaErr == 0)
-            wsaErr = 0xFFFFFFFF;
-    }
-
-#else /* NSP_REDIRECT */
-
-    if ((lpdwBufferLength == NULL) || (*lpdwBufferLength == 0))
-    {
-        wsaErr = WSA_NOT_ENOUGH_MEMORY;
-        goto End;
-    }
-
-    RtlZeroMemory(lpqsResults, *lpdwBufferLength);
-    lpqsResults->dwSize = sizeof(*lpqsResults);
-
-    wsaErr = NSP_LookupServiceNextW(pLook,
-                                    dwControlFlags,
-                                    lpqsResults,
-                                    lpdwBufferLength);
-
-
-#endif /* NSP_REDIRECT */
-
-End:
-    if (wsaErr != 0)
-    {
-        ERR("mwsNSPLookupServiceNext wsaErr = %d\n", wsaErr);
-        WSASetLastError(wsaErr);
-        return SOCKET_ERROR;
-    }
-    return NO_ERROR;
-}
-
-INT
-WSAAPI
-mwsNSPIoCtl(_In_ HANDLE hLookup,
-            _In_ DWORD dwControlCode,
-            _In_reads_bytes_(cbInBuffer) LPVOID lpvInBuffer,
-            _In_ DWORD cbInBuffer,
-            _Out_writes_bytes_to_(cbOutBuffer, *lpcbBytesReturned) LPVOID lpvOutBuffer,
-            _In_ DWORD cbOutBuffer,
-            _Out_ LPDWORD lpcbBytesReturned,
-            _In_opt_ LPWSACOMPLETION lpCompletion,
-            _In_ LPWSATHREADID lpThreadId)
-{
-    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;
-}
-
-INT
-WSAAPI
-mwsNSPLookupServiceEnd(_In_ HANDLE hLookup)
-{
-    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
-
-    if (pLook->hostnameW != NULL)
-        HeapFree(hHeap, 0, pLook->hostnameW);
-
-    HeapFree(hHeap, 0, pLook);
-    return res;
-}
-
-INT
-WSAAPI
-mwsNSPSetService(_In_ LPGUID lpProviderId,
-                 _In_ LPWSASERVICECLASSINFOW lpServiceClassInfo,
-                 _In_ LPWSAQUERYSETW lpqsRegInfo,
-                 _In_ WSAESETSERVICEOP essOperation,
-                 _In_ DWORD dwControlFlags)
-{
-    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;
-}
-
-INT
-WSAAPI
-mwsNSPInstallServiceClass(_In_ LPGUID lpProviderId,
-                          _In_ LPWSASERVICECLASSINFOW lpServiceClassInfo)
-{
-    ERR("mwsNSPInstallServiceClass not implemented %p %p\n", lpProviderId, lpServiceClassInfo);
-    WSASetLastError(WSAEOPNOTSUPP);
-    return ERROR_CALL_NOT_IMPLEMENTED;
-}
-
-INT
-WSAAPI
-mwsNSPRemoveServiceClass(_In_ LPGUID lpProviderId,
-                         _In_ LPGUID lpServiceClassId)
-{
-    ERR("mwsNSPRemoveServiceClass not implemented %p %p\n", lpProviderId, lpServiceClassId);
-    WSASetLastError(WSAEOPNOTSUPP);
-    return ERROR_CALL_NOT_IMPLEMENTED;
-}
-
-INT
-WSAAPI
-mwsNSPGetServiceClassInfo(_In_ LPGUID lpProviderId,
-                          _In_ LPDWORD lpdwBufSize,
-                          _In_ LPWSASERVICECLASSINFOW lpServiceClassInfo)
-{
-    ERR("mwsNSPGetServiceClassInfo not implemented %p %p %p\n", lpProviderId, lpdwBufSize, lpServiceClassInfo);
-    WSASetLastError(WSAEOPNOTSUPP);
-    return ERROR_CALL_NOT_IMPLEMENTED;
-}
-
 /* Implementations - Exports */
 /*
  * @implemented
@@ -1087,11 +1048,10 @@ NSPStartup(_In_ LPGUID lpProviderId,
 {
     INT ret;
 
-    TRACE("NSPStartup %p %p\n", lpProviderId, lpRout);
-    if (!lpRout || (lpRout->cbSize != sizeof(NSP_ROUTINE)))
+    if ((lpRout == NULL) ||
+        (lpRout->cbSize != sizeof(NSP_ROUTINE)))
     {
-        ERR("NSPStartup invalid parameter\n");
-        WSASetLastError(WSAEINVAL);
+        WSASetLastError(ERROR_INVALID_PARAMETER);
         return ERROR_INVALID_PARAMETER;
     }