[WS2_32]
[reactos.git] / reactos / dll / win32 / ws2_32 / misc / dllmain.c
index bdf0e4d..12620c6 100644 (file)
@@ -7,14 +7,14 @@
  * REVISIONS:
  *   CSH 01/09-2000 Created
  */
-#include <roscfg.h>
+
 #include <w32api.h>
 #include <ws2_32.h>
 #include <catalog.h>
 #include <handle.h>
 #include <upcall.h>
 
-#ifdef DBG
+#if DBG
 
 /* See debug.h for debug/trace constants */
 //DWORD DebugTraceLevel = MIN_TRACE;
@@ -24,11 +24,11 @@ DWORD DebugTraceLevel = 0;
 #endif /* DBG */
 
 /* To make the linker happy */
-VOID STDCALL KeBugCheck (ULONG BugCheckCode) {}
-
+VOID WINAPI KeBugCheck (ULONG BugCheckCode) {}
 
+HINSTANCE g_hInstDll;
 HANDLE GlobalHeap;
-BOOL WsaInitialized = FALSE;   /* TRUE if WSAStartup() has been successfully called */
+BOOL WsaInitialized = FALSE;    /* TRUE if WSAStartup() has been successfully called */
 WSPUPCALLTABLE UpcallTable;
 
 
@@ -39,15 +39,7 @@ INT
 EXPORT
 WSAGetLastError(VOID)
 {
-  
-PWINSOCK_THREAD_BLOCK p = NtCurrentTeb()->WinSockData;
-
-  if (p) {
-    return p->LastErrorValue;
-  } else {
-    /* FIXME: What error code should we use here? Can this even happen? */
-    return ERROR_BAD_ENVIRONMENT;
-  }
+    return GetLastError();
 }
 
 
@@ -56,13 +48,9 @@ PWINSOCK_THREAD_BLOCK p = NtCurrentTeb()->WinSockData;
  */
 VOID
 EXPORT
-WSASetLastError(
-    IN  INT iError)
+WSASetLastError(IN INT iError)
 {
-  PWINSOCK_THREAD_BLOCK p = NtCurrentTeb()->WinSockData;
-
-  if (p)
-      p->LastErrorValue = iError;
+    SetLastError(iError);
 }
 
 
@@ -71,23 +59,68 @@ WSASetLastError(
  */
 INT
 EXPORT
-WSAStartup(
-    IN  WORD wVersionRequested,
-    OUT LPWSADATA lpWSAData)
+WSAStartup(IN  WORD wVersionRequested,
+           OUT LPWSADATA lpWSAData)
 {
-  WS_DbgPrint(MAX_TRACE, ("WSAStartup of ws2_32.dll\n"));
+    BYTE Low, High;
+
+    WS_DbgPrint(MAX_TRACE, ("WSAStartup of ws2_32.dll\n"));
+
+    if (!g_hInstDll)
+        return WSASYSNOTREADY;
+
+    if (lpWSAData == NULL)
+        return WSAEFAULT;
+
+    Low = LOBYTE(wVersionRequested);
+    High  = HIBYTE(wVersionRequested);
+
+    if (Low < 1)
+    {
+        WS_DbgPrint(MAX_TRACE, ("Bad winsock version requested, %d,%d", Low, High));
+        return WSAVERNOTSUPPORTED;
+    }
+
+    if (Low == 1)
+    {
+        if (High == 0)
+        {
+            lpWSAData->wVersion = wVersionRequested;
+        }
+        else
+        {
+            lpWSAData->wVersion = MAKEWORD(1, 1);
+        }
+    }
+    else if (Low == 2)
+    {
+        if (High <= 2)
+        {
+            lpWSAData->wVersion = MAKEWORD(2, High);
+        }
+        else
+        {
+            lpWSAData->wVersion = MAKEWORD(2, 2);
+        }
+    }
+    else
+    {
+        lpWSAData->wVersion = MAKEWORD(2, 2);
+    }
+
+    lpWSAData->wVersion     = wVersionRequested;
+    lpWSAData->wHighVersion = MAKEWORD(2,2);
+    lstrcpyA(lpWSAData->szDescription, "WinSock 2.2");
+    lstrcpyA(lpWSAData->szSystemStatus, "Running");
+    lpWSAData->iMaxSockets  = 0;
+    lpWSAData->iMaxUdpDg    = 0;
+    lpWSAData->lpVendorInfo = NULL;
 
-  lpWSAData->wVersion     = wVersionRequested;
-  lpWSAData->wHighVersion = 2;
-  lstrcpyA(lpWSAData->szDescription, "WinSock 2.0");
-  lstrcpyA(lpWSAData->szSystemStatus, "Running");
-  lpWSAData->iMaxSockets  = 0;
-  lpWSAData->iMaxUdpDg    = 0;
-  lpWSAData->lpVendorInfo = NULL;
+    /*FIXME: increment internal counter */
 
-  WSASETINITIALIZED;
+    WSASETINITIALIZED;
 
-  return NO_ERROR;
+    return NO_ERROR;
 }
 
 
@@ -98,14 +131,15 @@ INT
 EXPORT
 WSACleanup(VOID)
 {
-  WS_DbgPrint(MAX_TRACE, ("WSACleanup of ws2_32.dll\n"));
+    WS_DbgPrint(MAX_TRACE, ("WSACleanup of ws2_32.dll\n"));
 
-  if (!WSAINITIALIZED) {
-    WSASetLastError(WSANOTINITIALISED);
-    return WSANOTINITIALISED;
-  }
+    if (!WSAINITIALIZED)
+    {
+        WSASetLastError(WSANOTINITIALISED);
+        return WSANOTINITIALISED;
+    }
 
-  return NO_ERROR;
+    return NO_ERROR;
 }
 
 
@@ -114,12 +148,16 @@ WSACleanup(VOID)
  */
 SOCKET
 EXPORT
-socket(
-  IN  INT af,
-  IN  INT type,
-  IN  INT protocol)
+socket(IN  INT af,
+       IN  INT type,
+       IN  INT protocol)
 {
-  return WSASocketA(af, type, protocol, NULL, 0, 0);
+    return WSASocketW(af,
+                      type,
+                      protocol,
+                      NULL,
+                      0,
+                      0);
 }
 
 
@@ -128,44 +166,45 @@ socket(
  */
 SOCKET
 EXPORT
-WSASocketA(
-    IN  INT af,
-    IN  INT type,
-    IN  INT protocol,
-    IN  LPWSAPROTOCOL_INFOA lpProtocolInfo,
-    IN  GROUP g,
-    IN  DWORD dwFlags)
+WSASocketA(IN  INT af,
+           IN  INT type,
+           IN  INT protocol,
+           IN  LPWSAPROTOCOL_INFOA lpProtocolInfo,
+           IN  GROUP g,
+           IN  DWORD dwFlags)
 /*
  * FUNCTION: Creates a new socket
  */
 {
-  WSAPROTOCOL_INFOW ProtocolInfoW;
-  LPWSAPROTOCOL_INFOW p;
-  UNICODE_STRING StringU;
-  ANSI_STRING StringA;
+    WSAPROTOCOL_INFOW ProtocolInfoW;
+    LPWSAPROTOCOL_INFOW p;
+    UNICODE_STRING StringU;
+    ANSI_STRING StringA;
 
-       WS_DbgPrint(MAX_TRACE, ("af (%d)  type (%d)  protocol (%d).\n",
+    WS_DbgPrint(MAX_TRACE, ("af (%d)  type (%d)  protocol (%d).\n",
     af, type, protocol));
 
-  if (lpProtocolInfo) {
-    memcpy(&ProtocolInfoW,
-      lpProtocolInfo,
-      sizeof(WSAPROTOCOL_INFOA) -
-      sizeof(CHAR) * (WSAPROTOCOL_LEN + 1));
-    RtlInitAnsiString(&StringA, (LPSTR)lpProtocolInfo->szProtocol);
-    RtlInitUnicodeString(&StringU, (LPWSTR)&ProtocolInfoW.szProtocol);
-    RtlAnsiStringToUnicodeString(&StringU, &StringA, FALSE);
-    p = &ProtocolInfoW;
-  } else {
-    p = NULL;
-  }
-
-  return WSASocketW(af,
-    type,
-    protocol,
-    p,
-    g,
-    dwFlags);
+    if (lpProtocolInfo)
+    {
+        memcpy(&ProtocolInfoW,
+               lpProtocolInfo,
+               sizeof(WSAPROTOCOL_INFOA) - sizeof(CHAR) * (WSAPROTOCOL_LEN + 1));
+        RtlInitAnsiString(&StringA, (LPSTR)lpProtocolInfo->szProtocol);
+        RtlInitUnicodeString(&StringU, (LPWSTR)&ProtocolInfoW.szProtocol);
+        RtlAnsiStringToUnicodeString(&StringU, &StringA, FALSE);
+        p = &ProtocolInfoW;
+    }
+    else
+    {
+        p = NULL;
+    }
+
+    return WSASocketW(af,
+                      type,
+                      protocol,
+                      p,
+                      g,
+                      dwFlags);
 }
 
 
@@ -174,13 +213,12 @@ WSASocketA(
  */
 SOCKET
 EXPORT
-WSASocketW(
-    IN  INT af,
-    IN  INT type,
-    IN  INT protocol,
-    IN  LPWSAPROTOCOL_INFOW lpProtocolInfo,
-    IN  GROUP g,
-    IN  DWORD dwFlags)
+WSASocketW(IN  INT af,
+           IN  INT type,
+           IN  INT protocol,
+           IN  LPWSAPROTOCOL_INFOW lpProtocolInfo,
+           IN  GROUP g,
+           IN  DWORD dwFlags)
 /*
  * FUNCTION: Creates a new socket descriptor
  * ARGUMENTS:
@@ -194,72 +232,76 @@ WSASocketW(
  *     Created socket descriptor, or INVALID_SOCKET if it could not be created
  */
 {
-  INT Status;
-  SOCKET Socket;
-  PCATALOG_ENTRY Provider;
-  WSAPROTOCOL_INFOW ProtocolInfo;
-
-  WS_DbgPrint(MAX_TRACE, ("af (%d)  type (%d)  protocol (%d).\n",
-      af, type, protocol));
-
-  if (!WSAINITIALIZED) {
-      WS_DbgPrint(MAX_TRACE, ("af (%d)  type (%d)  protocol (%d) = WSANOTINITIALISED.\n",
-          af, type, protocol));
-      WSASetLastError(WSANOTINITIALISED);
-      return INVALID_SOCKET;
-  }
-
-  if (!lpProtocolInfo) {
-    lpProtocolInfo = &ProtocolInfo;
-    ZeroMemory(&ProtocolInfo, sizeof(WSAPROTOCOL_INFOW));
-
-    ProtocolInfo.iAddressFamily = af;
-    ProtocolInfo.iSocketType    = type;
-    ProtocolInfo.iProtocol      = protocol;
-  }
-
-  Provider = LocateProvider(lpProtocolInfo);
-  if (!Provider) {
-    WS_DbgPrint(MAX_TRACE, ("af (%d)  type (%d)  protocol (%d) = WSAEAFNOSUPPORT.\n",
-      af, type, protocol));
-    WSASetLastError(WSAEAFNOSUPPORT);
-    return INVALID_SOCKET;
-  }
-
-  Status = LoadProvider(Provider, lpProtocolInfo);
-  if (Status != NO_ERROR) {
-    WS_DbgPrint(MAX_TRACE, ("af (%d)  type (%d)  protocol (%d) = %d.\n",
-      af, type, protocol, Status));
-    WSASetLastError(Status);
-    return INVALID_SOCKET;
-  }
-
-  WS_DbgPrint(MAX_TRACE, ("Calling WSPSocket at (0x%X).\n",
-    Provider->ProcTable.lpWSPSocket));
-
-  assert(Provider->ProcTable.lpWSPSocket);
-
-  WS_DbgPrint(MAX_TRACE,("About to call provider socket fn\n"));
-
-  Socket = Provider->ProcTable.lpWSPSocket(
-      af,
-      type,
-      protocol,
-      lpProtocolInfo,
-      g,
-      dwFlags,
-      &Status);
-
-  WS_DbgPrint(MAX_TRACE,("Socket: %x, Status: %x\n", Socket, Status));
-
-  if (Status != NO_ERROR) {
-      WSASetLastError(Status);
-      return INVALID_SOCKET;
-  }
-  
-  WS_DbgPrint(MAX_TRACE,("Status: %x\n", Status));
-
-  return Socket;
+    INT Status;
+    SOCKET Socket;
+    PCATALOG_ENTRY Provider;
+    WSAPROTOCOL_INFOW ProtocolInfo;
+
+    WS_DbgPrint(MAX_TRACE, ("af (%d)  type (%d)  protocol (%d).\n",
+                af, type, protocol));
+
+    if (!WSAINITIALIZED)
+    {
+        WS_DbgPrint(MAX_TRACE, ("af (%d)  type (%d)  protocol (%d) = WSANOTINITIALISED.\n",
+                  af, type, protocol));
+        WSASetLastError(WSANOTINITIALISED);
+        return INVALID_SOCKET;
+    }
+
+    if (!lpProtocolInfo)
+    {
+        lpProtocolInfo = &ProtocolInfo;
+        ZeroMemory(&ProtocolInfo, sizeof(WSAPROTOCOL_INFOW));
+
+        ProtocolInfo.iAddressFamily = af;
+        ProtocolInfo.iSocketType    = type;
+        ProtocolInfo.iProtocol      = protocol;
+    }
+
+    Provider = LocateProvider(lpProtocolInfo);
+    if (!Provider)
+    {
+        WS_DbgPrint(MAX_TRACE, ("af (%d)  type (%d)  protocol (%d) = WSAEAFNOSUPPORT.\n",
+                    af, type, protocol));
+        WSASetLastError(WSAEAFNOSUPPORT);
+        return INVALID_SOCKET;
+    }
+
+    Status = LoadProvider(Provider, lpProtocolInfo);
+    if (Status != NO_ERROR)
+    {
+        WS_DbgPrint(MAX_TRACE, ("af (%d)  type (%d)  protocol (%d) = %d.\n",
+                    af, type, protocol, Status));
+        WSASetLastError(Status);
+        return INVALID_SOCKET;
+    }
+
+    WS_DbgPrint(MAX_TRACE, ("Calling WSPSocket at (0x%X).\n",
+                Provider->ProcTable.lpWSPSocket));
+
+    assert(Provider->ProcTable.lpWSPSocket);
+
+    WS_DbgPrint(MAX_TRACE,("About to call provider socket fn\n"));
+
+    Socket = Provider->ProcTable.lpWSPSocket(af,
+                                             type,
+                                             protocol,
+                                             lpProtocolInfo,
+                                             g,
+                                             dwFlags,
+                                             &Status);
+
+    WS_DbgPrint(MAX_TRACE,("Socket: %x, Status: %x\n", Socket, Status));
+
+    if (Status != NO_ERROR)
+    {
+        WSASetLastError(Status);
+        return INVALID_SOCKET;
+    }
+
+    WS_DbgPrint(MAX_TRACE,("Status: %x\n", Status));
+
+    return Socket;
 }
 
 
@@ -268,8 +310,7 @@ WSASocketW(
  */
 INT
 EXPORT
-closesocket(
-    IN  SOCKET s)
+closesocket(IN  SOCKET s)
 /*
  * FUNCTION: Closes a socket descriptor
  * ARGUMENTS:
@@ -278,40 +319,42 @@ closesocket(
  *     0, or SOCKET_ERROR if an error ocurred
  */
 {
-  PCATALOG_ENTRY Provider;
-  INT Status;
-  INT Errno;
+    PCATALOG_ENTRY Provider;
+    INT Status;
+    INT Errno;
 
-  WS_DbgPrint(MAX_TRACE, ("s (0x%X).\n", s));
+    WS_DbgPrint(MAX_TRACE, ("s (0x%X).\n", s));
 
-  if (!WSAINITIALIZED) {
-    WSASetLastError(WSANOTINITIALISED);
-    return SOCKET_ERROR;
-  }
+    if (!WSAINITIALIZED)
+    {
+        WSASetLastError(WSANOTINITIALISED);
+        return SOCKET_ERROR;
+    }
 
-  if (!ReferenceProviderByHandle((HANDLE)s, &Provider)) {
-    WSASetLastError(WSAENOTSOCK);
-    return SOCKET_ERROR;
-  }
+    if (!ReferenceProviderByHandle((HANDLE)s, &Provider))
+    {
+        WSASetLastError(WSAENOTSOCK);
+        return SOCKET_ERROR;
+    }
 
-  CloseProviderHandle((HANDLE)s);
+    CloseProviderHandle((HANDLE)s);
 
-  WS_DbgPrint(MAX_TRACE,("DereferenceProviderByHandle\n"));
+    WS_DbgPrint(MAX_TRACE,("DereferenceProviderByHandle\n"));
 
-  DereferenceProviderByPointer(Provider);
+    DereferenceProviderByPointer(Provider);
 
-  WS_DbgPrint(MAX_TRACE,("DereferenceProviderByHandle Done\n"));
+    WS_DbgPrint(MAX_TRACE,("DereferenceProviderByHandle Done\n"));
 
-  Status = Provider->ProcTable.lpWSPCloseSocket(s, &Errno);
+    Status = Provider->ProcTable.lpWSPCloseSocket(s, &Errno);
 
-  WS_DbgPrint(MAX_TRACE,("Provider Close Done\n"));
+    WS_DbgPrint(MAX_TRACE,("Provider Close Done\n"));
 
-  if (Status == SOCKET_ERROR)
-    WSASetLastError(Errno);
+    if (Status == SOCKET_ERROR)
+        WSASetLastError(Errno);
 
-  WS_DbgPrint(MAX_TRACE,("Returning success\n"));
+    WS_DbgPrint(MAX_TRACE,("Returning success\n"));
 
-  return 0;
+    return 0;
 }
 
 
@@ -320,12 +363,11 @@ closesocket(
  */
 INT
 EXPORT
-select(
-    IN      INT nfds, 
-    IN OUT  LPFD_SET readfds, 
-    IN OUT  LPFD_SET writefds, 
-    IN OUT  LPFD_SET exceptfds, 
-    IN      CONST struct timeval *timeout)
+select(IN      INT nfds,
+       IN OUT  LPFD_SET readfds,
+       IN OUT  LPFD_SET writefds,
+       IN OUT  LPFD_SET exceptfds,
+       IN      CONST struct timeval *timeout)
 /*
  * FUNCTION: Returns status of one or more sockets
  * ARGUMENTS:
@@ -339,73 +381,97 @@ select(
  *     Number of ready socket descriptors, or SOCKET_ERROR if an error ocurred
  */
 {
-  PCATALOG_ENTRY Provider = NULL;
-  INT Count;
-  INT Errno;
-
-  WS_DbgPrint(MAX_TRACE, ("readfds (0x%X)  writefds (0x%X)  exceptfds (0x%X).\n",
-    readfds, writefds, exceptfds));
-
-  if (!WSAINITIALIZED) {
-    WSASetLastError(WSANOTINITIALISED);
-    WS_DbgPrint(MID_TRACE,("Not initialized\n"));
-    return SOCKET_ERROR;
-  }
-
-  /* FIXME: Sockets in FD_SETs should be sorted by their provider */
-
-  /* FIXME: For now, assume only one service provider */
-  if ((readfds != NULL) && (readfds->fd_count > 0)) {
-    if (!ReferenceProviderByHandle((HANDLE)readfds->fd_array[0], &Provider)) {
-      WSASetLastError(WSAENOTSOCK);
-      WS_DbgPrint(MID_TRACE,("No provider (read)\n"));
-      return SOCKET_ERROR;
-    }
-  } else if ((writefds != NULL) && (writefds->fd_count > 0)) {
-    if (!ReferenceProviderByHandle((HANDLE)writefds->fd_array[0], &Provider)) {
-      WSASetLastError(WSAENOTSOCK);
-      WS_DbgPrint(MID_TRACE,("No provider (write)\n"));
-      return SOCKET_ERROR;
-    }
-  } else if ((exceptfds != NULL) && (exceptfds->fd_count > 0)) {
-    if (!ReferenceProviderByHandle((HANDLE)exceptfds->fd_array[0], &Provider)) {
-      WSASetLastError(WSAENOTSOCK);
-      WS_DbgPrint(MID_TRACE,("No provider (err)\n"));
-      return SOCKET_ERROR;
+    PCATALOG_ENTRY Provider = NULL;
+    INT Count;
+    INT Errno;
+
+    WS_DbgPrint(MAX_TRACE, ("readfds (0x%X)  writefds (0x%X)  exceptfds (0x%X).\n",
+                readfds, writefds, exceptfds));
+
+    if (!WSAINITIALIZED)
+    {
+        WSASetLastError(WSANOTINITIALISED);
+        WS_DbgPrint(MID_TRACE,("Not initialized\n"));
+        return SOCKET_ERROR;
+    }
+
+    /* FIXME: Sockets in FD_SETs should be sorted by their provider */
+
+    /* FIXME: For now, assume only one service provider */
+    if ((readfds != NULL) && (readfds->fd_count > 0))
+    {
+        if (!ReferenceProviderByHandle((HANDLE)readfds->fd_array[0],
+                                       &Provider))
+        {
+            WSASetLastError(WSAENOTSOCK);
+            WS_DbgPrint(MID_TRACE,("No provider (read)\n"));
+            return SOCKET_ERROR;
+        }
     }
+    else if ((writefds != NULL) && (writefds->fd_count > 0))
+    {
+        if (!ReferenceProviderByHandle((HANDLE)writefds->fd_array[0],
+                                       &Provider))
+        {
+            WSASetLastError(WSAENOTSOCK);
+            WS_DbgPrint(MID_TRACE,("No provider (write)\n"));
+            return SOCKET_ERROR;
+        }
+    }
+    else if ((exceptfds != NULL) && (exceptfds->fd_count > 0))
+    {
+        if (!ReferenceProviderByHandle((HANDLE)exceptfds->fd_array[0], &Provider))
+        {
+            WSASetLastError(WSAENOTSOCK);
+            WS_DbgPrint(MID_TRACE,("No provider (err)\n"));
+            return SOCKET_ERROR;
+        }
 #if 0 /* XXX empty select is not an error */
-  } else {
-    WSASetLastError(WSAEINVAL);
-    return SOCKET_ERROR;
+    }
+    else
+    {
+        WSASetLastError(WSAEINVAL);
+        return SOCKET_ERROR;
 #endif
-  }
-
-  if( !Provider ) {
-      if( timeout ) {
-         WS_DbgPrint(MID_TRACE,("Select: used as timer\n"));
-         Sleep( timeout->tv_sec * 1000 + (timeout->tv_usec / 1000) );
-      }
-      return 0;
-  } else if (Provider->ProcTable.lpWSPSelect) {
-      WS_DbgPrint(MID_TRACE,("Calling WSPSelect:%x\n", Provider->ProcTable.lpWSPSelect));
-      Count = Provider->ProcTable.lpWSPSelect(
-         nfds, readfds, writefds, exceptfds, (LPTIMEVAL)timeout, &Errno);
-      
-      WS_DbgPrint(MAX_TRACE, ("[%x] Select: Count %d Errno %x\n", 
-                             Provider, Count, Errno));
-      
-      DereferenceProviderByPointer(Provider);
-      
-      if (Errno != NO_ERROR) {
-         WSASetLastError(Errno);
-         return SOCKET_ERROR;
-      }
-  } else {
-      WSASetLastError(WSAEINVAL);
-      return SOCKET_ERROR;
-  }
-
-  return Count;
+    }
+
+    if ( !Provider )
+    {
+        if ( timeout )
+        {
+            WS_DbgPrint(MID_TRACE,("Select: used as timer\n"));
+            Sleep( timeout->tv_sec * 1000 + (timeout->tv_usec / 1000) );
+        }
+        return 0;
+    }
+    else if (Provider->ProcTable.lpWSPSelect)
+    {
+        WS_DbgPrint(MID_TRACE,("Calling WSPSelect:%x\n", Provider->ProcTable.lpWSPSelect));
+        Count = Provider->ProcTable.lpWSPSelect(nfds,
+                                                readfds,
+                                                writefds,
+                                                exceptfds,
+                                                (LPTIMEVAL)timeout,
+                                                &Errno);
+
+        WS_DbgPrint(MAX_TRACE, ("[%x] Select: Count %d Errno %x\n",
+                    Provider, Count, Errno));
+
+        DereferenceProviderByPointer(Provider);
+
+        if (Count == SOCKET_ERROR)
+        {
+            WSASetLastError(Errno);
+            return SOCKET_ERROR;
+        }
+    }
+    else
+    {
+        WSASetLastError(WSAEINVAL);
+        return SOCKET_ERROR;
+    }
+
+    return Count;
 }
 
 
@@ -414,38 +480,43 @@ select(
  */
 INT
 EXPORT
-bind(
-  IN  SOCKET s,
-  IN  CONST struct sockaddr *name,
-  IN  INT namelen)
+bind(IN SOCKET s,
+     IN CONST struct sockaddr *name,
+     IN INT namelen)
 {
-  PCATALOG_ENTRY Provider;
-  INT Status;
-  INT Errno;
-
-  if (!WSAINITIALIZED) {
-    WSASetLastError(WSANOTINITIALISED);
-    return SOCKET_ERROR;
-  }
+    PCATALOG_ENTRY Provider;
+    INT Status;
+    INT Errno;
+
+    if (!WSAINITIALIZED)
+    {
+        WSASetLastError(WSANOTINITIALISED);
+        return SOCKET_ERROR;
+    }
 
-  if (!ReferenceProviderByHandle((HANDLE)s, &Provider)) {
-    WSASetLastError(WSAENOTSOCK);
-    return SOCKET_ERROR;
-  }
+    if (!ReferenceProviderByHandle((HANDLE)s,
+                                   &Provider))
+    {
+        WSASetLastError(WSAENOTSOCK);
+        return SOCKET_ERROR;
+    }
 
 #if (__W32API_MAJOR_VERSION < 2 || __W32API_MINOR_VERSION < 5)
-  Status = Provider->ProcTable.lpWSPBind(
-    s, (CONST LPSOCKADDR) name, namelen, &Errno);
+    Status = Provider->ProcTable.lpWSPBind(s,
+                                           (CONST LPSOCKADDR)name,
+                                           namelen,
+                                           &Errno);
 #else
-  Status = Provider->ProcTable.lpWSPBind(
-    s, name, namelen, &Errno);
+    Status = Provider->ProcTable.lpWSPBind(s,
+                                           name,
+                                           namelen,
+                                           &Errno);
 #endif /* __W32API_MAJOR_VERSION < 2 || __W32API_MINOR_VERSION < 5 */
 
-  DereferenceProviderByPointer(Provider);
+    DereferenceProviderByPointer(Provider);
 
-  if (Status == SOCKET_ERROR) {
-    WSASetLastError(Errno);
-  }
+    if (Status == SOCKET_ERROR)
+        WSASetLastError(Errno);
 
   return Status;
 }
@@ -456,34 +527,36 @@ bind(
  */
 INT
 EXPORT
-listen(
-    IN  SOCKET s,
-    IN  INT backlog)
+listen(IN SOCKET s,
+       IN INT backlog)
 {
-  PCATALOG_ENTRY Provider;
-  INT Status;
-  INT Errno;
-
-  if (!WSAINITIALIZED) {
-    WSASetLastError(WSANOTINITIALISED);
-    return SOCKET_ERROR;
-  }
+    PCATALOG_ENTRY Provider;
+    INT Status;
+    INT Errno;
+
+    if (!WSAINITIALIZED)
+    {
+        WSASetLastError(WSANOTINITIALISED);
+        return SOCKET_ERROR;
+    }
 
-  if (!ReferenceProviderByHandle((HANDLE)s, &Provider)) {
-    WSASetLastError(WSAENOTSOCK);
-    return SOCKET_ERROR;
-  }
+    if (!ReferenceProviderByHandle((HANDLE)s,
+                                   &Provider))
+    {
+        WSASetLastError(WSAENOTSOCK);
+        return SOCKET_ERROR;
+    }
 
-  Status = Provider->ProcTable.lpWSPListen(
-    s, backlog, &Errno);
+    Status = Provider->ProcTable.lpWSPListen(s,
+                                             backlog,
+                                             &Errno);
 
-  DereferenceProviderByPointer(Provider);
+    DereferenceProviderByPointer(Provider);
 
-  if (Status == SOCKET_ERROR) {
-    WSASetLastError(Errno);
-  }
+    if (Status == SOCKET_ERROR)
+        WSASetLastError(Errno);
 
-  return Status;
+    return Status;
 }
 
 
@@ -492,12 +565,15 @@ listen(
  */
 SOCKET
 EXPORT
-accept(
-  IN  SOCKET s,
-  OUT LPSOCKADDR addr,
-  OUT INT FAR* addrlen)
+accept(IN  SOCKET s,
+       OUT LPSOCKADDR addr,
+       OUT INT FAR* addrlen)
 {
-  return WSAAccept(s, addr, addrlen, NULL, 0);
+  return WSAAccept(s,
+                   addr,
+                   addrlen,
+                   NULL,
+                   0);
 }
 
 
@@ -506,12 +582,19 @@ accept(
  */
 INT
 EXPORT
-ioctlsocket(
-    IN      SOCKET s,
-    IN      LONG cmd,
-    IN OUT  ULONG FAR* argp)
+ioctlsocket(IN     SOCKET s,
+            IN     LONG cmd,
+            IN OUT ULONG FAR* argp)
 {
-  return WSAIoctl(s, cmd, argp, sizeof(ULONG), argp, sizeof(ULONG), argp, 0, 0);
+    return WSAIoctl(s,
+                    cmd,
+                    argp,
+                    sizeof(ULONG),
+                    argp,
+                    sizeof(ULONG),
+                    argp,
+                    0,
+                    0);
 }
 
 
@@ -520,53 +603,58 @@ ioctlsocket(
  */
 SOCKET
 EXPORT
-WSAAccept(
-  IN      SOCKET s,
-  OUT     LPSOCKADDR addr,
-  IN OUT  LPINT addrlen,
-  IN      LPCONDITIONPROC lpfnCondition,
-  IN      DWORD dwCallbackData)
+WSAAccept(IN     SOCKET s,
+          OUT    LPSOCKADDR addr,
+          IN OUT LPINT addrlen,
+          IN     LPCONDITIONPROC lpfnCondition,
+          IN     DWORD_PTR dwCallbackData)
 {
-  PCATALOG_ENTRY Provider;
-  SOCKET Socket;
-  INT Errno;
-
-  if (!WSAINITIALIZED) {
-    WSASetLastError(WSANOTINITIALISED);
-    return SOCKET_ERROR;
-  }
-
-  if (!ReferenceProviderByHandle((HANDLE)s, &Provider)) {
-    WSASetLastError(WSAENOTSOCK);
-    return SOCKET_ERROR;
-  }
-
-  WS_DbgPrint(MAX_TRACE,("Calling provider accept\n"));
-
-  Socket = Provider->ProcTable.lpWSPAccept(
-    s, addr, addrlen, lpfnCondition, dwCallbackData, &Errno);
-
-  WS_DbgPrint(MAX_TRACE,("Calling provider accept -> Socket %x, Errno %x\n",
-                        Socket, Errno));
-
-  DereferenceProviderByPointer(Provider);
-
-  if (Socket == INVALID_SOCKET) {
-    WSASetLastError(Errno);
-  }
-
-  if( addr ) {
-#ifdef DBG
-      LPSOCKADDR_IN sa = (LPSOCKADDR_IN)addr;
-      WS_DbgPrint(MAX_TRACE,("Returned address: %d %s:%d (len %d)\n", 
-                             sa->sin_family,
-                             inet_ntoa(sa->sin_addr), 
-                             ntohs(sa->sin_port),
-                             *addrlen));
+    PCATALOG_ENTRY Provider;
+    SOCKET Socket;
+    INT Errno;
+
+    if (!WSAINITIALIZED)
+    {
+        WSASetLastError(WSANOTINITIALISED);
+        return SOCKET_ERROR;
+    }
+
+    if (!ReferenceProviderByHandle((HANDLE)s, &Provider))
+    {
+        WSASetLastError(WSAENOTSOCK);
+        return SOCKET_ERROR;
+    }
+
+    WS_DbgPrint(MAX_TRACE,("Calling provider accept\n"));
+
+    Socket = Provider->ProcTable.lpWSPAccept(s,
+                                             addr,
+                                             addrlen,
+                                             lpfnCondition,
+                                             dwCallbackData,
+                                             &Errno);
+
+    WS_DbgPrint(MAX_TRACE,("Calling provider accept -> Socket %x, Errno %x\n",
+                Socket, Errno));
+
+    DereferenceProviderByPointer(Provider);
+
+    if (Socket == INVALID_SOCKET)
+        WSASetLastError(Errno);
+
+    if ( addr )
+    {
+#if DBG
+        LPSOCKADDR_IN sa = (LPSOCKADDR_IN)addr;
+        WS_DbgPrint(MAX_TRACE,("Returned address: %d %s:%d (len %d)\n",
+                               sa->sin_family,
+                               inet_ntoa(sa->sin_addr),
+                               ntohs(sa->sin_port),
+                               *addrlen));
 #endif
-  }
+    }
 
-  return Socket;
+    return Socket;
 }
 
 
@@ -575,12 +663,17 @@ WSAAccept(
  */
 INT
 EXPORT
-connect(
-  IN  SOCKET s,
-  IN  CONST struct sockaddr *name,
-  IN  INT namelen)
+connect(IN  SOCKET s,
+        IN  CONST struct sockaddr *name,
+        IN  INT namelen)
 {
-  return WSAConnect(s, name, namelen, NULL, NULL, NULL, NULL);
+  return WSAConnect(s,
+                    name,
+                    namelen,
+                    NULL,
+                    NULL,
+                    NULL,
+                    NULL);
 }
 
 
@@ -589,44 +682,56 @@ connect(
  */
 INT
 EXPORT
-WSAConnect(
-  IN  SOCKET s,
-  IN  CONST struct sockaddr *name,
-  IN  INT namelen,
-  IN  LPWSABUF lpCallerData,
-  OUT LPWSABUF lpCalleeData,
-  IN  LPQOS lpSQOS,
-  IN  LPQOS lpGQOS)
+WSAConnect(IN  SOCKET s,
+           IN  CONST struct sockaddr *name,
+           IN  INT namelen,
+           IN  LPWSABUF lpCallerData,
+           OUT LPWSABUF lpCalleeData,
+           IN  LPQOS lpSQOS,
+           IN  LPQOS lpGQOS)
 {
-  PCATALOG_ENTRY Provider;
-  INT Status;
-  INT Errno;
-
-  if (!WSAINITIALIZED) {
-    WSASetLastError(WSANOTINITIALISED);
-    return SOCKET_ERROR;
-  }
+    PCATALOG_ENTRY Provider;
+    INT Status;
+    INT Errno;
+
+    if (!WSAINITIALIZED)
+    {
+        WSASetLastError(WSANOTINITIALISED);
+        return SOCKET_ERROR;
+    }
 
-  if (!ReferenceProviderByHandle((HANDLE)s, &Provider)) {
-    WSASetLastError(WSAENOTSOCK);
-    return SOCKET_ERROR;
-  }
+    if (!ReferenceProviderByHandle((HANDLE)s, &Provider))
+    {
+        WSASetLastError(WSAENOTSOCK);
+        return SOCKET_ERROR;
+    }
 
 #if (__W32API_MAJOR_VERSION < 2 || __W32API_MINOR_VERSION < 5)
-  Status = Provider->ProcTable.lpWSPConnect(
-    s, (CONST LPSOCKADDR) name, namelen, lpCallerData, lpCalleeData, lpSQOS, lpGQOS, &Errno);
+    Status = Provider->ProcTable.lpWSPConnect(s,
+                                              (CONST LPSOCKADDR)name,
+                                              namelen,
+                                              lpCallerData,
+                                              lpCalleeData,
+                                              lpSQOS,
+                                              lpGQOS,
+                                              &Errno);
 #else
-  Status = Provider->ProcTable.lpWSPConnect(
-    s, name, namelen, lpCallerData, lpCalleeData, lpSQOS, lpGQOS, &Errno);
+    Status = Provider->ProcTable.lpWSPConnect(s,
+                                              name,
+                                              namelen,
+                                              lpCallerData,
+                                              lpCalleeData,
+                                              lpSQOS,
+                                              lpGQOS,
+                                              &Errno);
 #endif
 
-  DereferenceProviderByPointer(Provider);
+    DereferenceProviderByPointer(Provider);
 
-  if (Status == SOCKET_ERROR) {
-    WSASetLastError(Errno);
-  }
+    if (Status == SOCKET_ERROR)
+        WSASetLastError(Errno);
 
-  return Status;
+    return Status;
 }
 
 
@@ -635,43 +740,50 @@ WSAConnect(
  */
 INT
 EXPORT
-WSAIoctl(
-    IN  SOCKET s,
-    IN  DWORD dwIoControlCode,
-    IN  LPVOID lpvInBuffer,
-    IN  DWORD cbInBuffer,
-    OUT LPVOID lpvOutBuffer,
-    IN  DWORD cbOutBuffer,
-    OUT LPDWORD lpcbBytesReturned,
-    IN  LPWSAOVERLAPPED lpOverlapped,
-    IN  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
+WSAIoctl(IN  SOCKET s,
+         IN  DWORD dwIoControlCode,
+         IN  LPVOID lpvInBuffer,
+         IN  DWORD cbInBuffer,
+         OUT LPVOID lpvOutBuffer,
+         IN  DWORD cbOutBuffer,
+         OUT LPDWORD lpcbBytesReturned,
+         IN  LPWSAOVERLAPPED lpOverlapped,
+         IN  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
 {
-  PCATALOG_ENTRY Provider;
-  INT Status;
-  INT Errno;
-
-  if (!WSAINITIALIZED) {
-    WSASetLastError(WSANOTINITIALISED);
-    return SOCKET_ERROR;
-  }
+    PCATALOG_ENTRY Provider;
+    INT Status;
+    INT Errno;
+
+    if (!WSAINITIALIZED)
+    {
+        WSASetLastError(WSANOTINITIALISED);
+        return SOCKET_ERROR;
+    }
 
-  if (!ReferenceProviderByHandle((HANDLE)s, &Provider)) {
-    WSASetLastError(WSAENOTSOCK);
-    return SOCKET_ERROR;
-  }
+    if (!ReferenceProviderByHandle((HANDLE)s, &Provider))
+    {
+        WSASetLastError(WSAENOTSOCK);
+        return SOCKET_ERROR;
+    }
 
-  Status = Provider->ProcTable.lpWSPIoctl(
-    s, dwIoControlCode, lpvInBuffer, cbInBuffer, lpvOutBuffer,
-    cbOutBuffer, lpcbBytesReturned, lpOverlapped, lpCompletionRoutine,
-    NULL /* lpThreadId */, &Errno);
+    Status = Provider->ProcTable.lpWSPIoctl(s,
+                                            dwIoControlCode,
+                                            lpvInBuffer,
+                                            cbInBuffer,
+                                            lpvOutBuffer,
+                                            cbOutBuffer,
+                                            lpcbBytesReturned,
+                                            lpOverlapped,
+                                            lpCompletionRoutine,
+                                            NULL /* lpThreadId */,
+                                            &Errno);
 
-  DereferenceProviderByPointer(Provider);
+    DereferenceProviderByPointer(Provider);
 
-  if (Status == SOCKET_ERROR) {
-    WSASetLastError(Errno);
-  }
+    if (Status == SOCKET_ERROR)
+        WSASetLastError(Errno);
 
-  return Status;
+    return Status;
 }
 
 /*
@@ -683,97 +795,102 @@ __WSAFDIsSet(SOCKET s, LPFD_SET set)
 {
     unsigned int i;
 
-    for( i = 0; i < set->fd_count; i++ )
-       if( set->fd_array[i] == s ) return TRUE;
+    for ( i = 0; i < set->fd_count; i++ )
+    if ( set->fd_array[i] == s ) return TRUE;
 
     return FALSE;
 }
 
-void free_winsock_thread_block(PWINSOCK_THREAD_BLOCK p) {
-  if(p) {
-    if(p->Hostent) { free_hostent(p->Hostent); p->Hostent = 0; }
-    if(p->Getservbyname){}
-    if(p->Getservbyport) {}
-
-
-  }
+void free_winsock_thread_block(PWINSOCK_THREAD_BLOCK p)
+{
+    if (p)
+    {
+        if (p->Hostent) { free_hostent(p->Hostent); p->Hostent = 0; }
+        if (p->Getservbyname){}
+        if (p->Getservbyport) {}
+    }
 }
 
 BOOL
-STDCALL
+WINAPI
 DllMain(HANDLE hInstDll,
         ULONG dwReason,
         LPVOID lpReserved)
 {
-  PWINSOCK_THREAD_BLOCK p;
-
-  WS_DbgPrint(MAX_TRACE, ("DllMain of ws2_32.dll.\n"));
-
-  switch (dwReason) {
-  case DLL_PROCESS_ATTACH:
-    GlobalHeap = GetProcessHeap();
-
-    CreateCatalog();
-
-    InitProviderHandleTable();
-
-    UpcallTable.lpWPUCloseEvent         = WPUCloseEvent;
-    UpcallTable.lpWPUCloseSocketHandle  = WPUCloseSocketHandle;
-    UpcallTable.lpWPUCreateEvent        = WPUCreateEvent;
-    UpcallTable.lpWPUCreateSocketHandle = WPUCreateSocketHandle;
-    UpcallTable.lpWPUFDIsSet            = WPUFDIsSet;
-    UpcallTable.lpWPUGetProviderPath    = WPUGetProviderPath;
-    UpcallTable.lpWPUModifyIFSHandle    = WPUModifyIFSHandle;
-    UpcallTable.lpWPUPostMessage        = PostMessageW;
-    UpcallTable.lpWPUQueryBlockingCallback    = WPUQueryBlockingCallback;
-    UpcallTable.lpWPUQuerySocketHandleContext = WPUQuerySocketHandleContext;
-    UpcallTable.lpWPUQueueApc           = WPUQueueApc;
-    UpcallTable.lpWPUResetEvent         = WPUResetEvent;
-    UpcallTable.lpWPUSetEvent           = WPUSetEvent;
-    UpcallTable.lpWPUOpenCurrentThread  = WPUOpenCurrentThread;
-    UpcallTable.lpWPUCloseThread        = WPUCloseThread;
-
-    /* Fall through to thread attachment handler */
-
-  case DLL_THREAD_ATTACH:
-    p = HeapAlloc(GlobalHeap, 0, sizeof(WINSOCK_THREAD_BLOCK));
-
-    WS_DbgPrint(MAX_TRACE, ("Thread block at 0x%X.\n", p));
-        
-    if (!p) {
-      return FALSE;
+    PWINSOCK_THREAD_BLOCK p;
+
+    WS_DbgPrint(MAX_TRACE, ("DllMain of ws2_32.dll.\n"));
+
+    switch (dwReason)
+    {
+        case DLL_PROCESS_ATTACH:
+        {
+            GlobalHeap = GetProcessHeap();
+
+            g_hInstDll = hInstDll;
+
+            CreateCatalog();
+
+            InitProviderHandleTable();
+
+            UpcallTable.lpWPUCloseEvent         = WPUCloseEvent;
+            UpcallTable.lpWPUCloseSocketHandle  = WPUCloseSocketHandle;
+            UpcallTable.lpWPUCreateEvent        = WPUCreateEvent;
+            UpcallTable.lpWPUCreateSocketHandle = WPUCreateSocketHandle;
+            UpcallTable.lpWPUFDIsSet            = WPUFDIsSet;
+            UpcallTable.lpWPUGetProviderPath    = WPUGetProviderPath;
+            UpcallTable.lpWPUModifyIFSHandle    = WPUModifyIFSHandle;
+            UpcallTable.lpWPUPostMessage        = PostMessageW;
+            UpcallTable.lpWPUQueryBlockingCallback    = WPUQueryBlockingCallback;
+            UpcallTable.lpWPUQuerySocketHandleContext = WPUQuerySocketHandleContext;
+            UpcallTable.lpWPUQueueApc           = WPUQueueApc;
+            UpcallTable.lpWPUResetEvent         = WPUResetEvent;
+            UpcallTable.lpWPUSetEvent           = WPUSetEvent;
+            UpcallTable.lpWPUOpenCurrentThread  = WPUOpenCurrentThread;
+            UpcallTable.lpWPUCloseThread        = WPUCloseThread;
+
+            /* Fall through to thread attachment handler */
+        }
+        case DLL_THREAD_ATTACH:
+        {
+            p = HeapAlloc(GlobalHeap, 0, sizeof(WINSOCK_THREAD_BLOCK));
+
+            WS_DbgPrint(MAX_TRACE, ("Thread block at 0x%X.\n", p));
+
+            if (!p) {
+              return FALSE;
+            }
+
+            p->Hostent = NULL;
+            p->LastErrorValue = NO_ERROR;
+            p->Getservbyname  = NULL;
+            p->Getservbyport  = NULL;
+
+            NtCurrentTeb()->WinSockData = p;
+        }
+        break;
+
+        case DLL_PROCESS_DETACH:
+        {
+            DestroyCatalog();
+
+            FreeProviderHandleTable();
+        }
+        break;
+
+        case DLL_THREAD_DETACH:
+        {
+            p = NtCurrentTeb()->WinSockData;
+
+            if (p)
+              HeapFree(GlobalHeap, 0, p);
+        }
+        break;
     }
 
-    p->Hostent = NULL;
-    p->LastErrorValue = NO_ERROR;
-    p->Getservbyname  = NULL;
-    p->Getservbyport  = NULL;
-
-    NtCurrentTeb()->WinSockData = p;
-    break;
-
-  case DLL_PROCESS_DETACH:
-    p = NtCurrentTeb()->WinSockData;
-
-    if (p)
-      HeapFree(GlobalHeap, 0, p);
-
-    DestroyCatalog();
-
-    FreeProviderHandleTable();
-    break;
-
-  case DLL_THREAD_DETACH:
-    p = NtCurrentTeb()->WinSockData;
-
-    if (p)
-      HeapFree(GlobalHeap, 0, p);
-    break;
-  }
-
-  WS_DbgPrint(MAX_TRACE, ("DllMain of ws2_32.dll. Leaving.\n"));
+    WS_DbgPrint(MAX_TRACE, ("DllMain of ws2_32.dll. Leaving.\n"));
 
-  return TRUE;
+    return TRUE;
 }
 
 /* EOF */