ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

dllmain.c
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:   See COPYING in the top level directory
00003  * PROJECT:     ReactOS WinSock 2 DLL
00004  * FILE:        misc/dllmain.c
00005  * PURPOSE:     DLL entry point
00006  * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
00007  * REVISIONS:
00008  *   CSH 01/09-2000 Created
00009  */
00010 
00011 #include "ws2_32.h"
00012 
00013 #if DBG
00014 
00015 /* See debug.h for debug/trace constants */
00016 //DWORD DebugTraceLevel = MIN_TRACE;
00017 //DWORD DebugTraceLevel = MAX_TRACE;
00018 //DWORD DebugTraceLevel = DEBUG_ULTRA;
00019 DWORD DebugTraceLevel = 0;
00020 #endif /* DBG */
00021 
00022 /* To make the linker happy */
00023 VOID WINAPI KeBugCheck (ULONG BugCheckCode) {}
00024 
00025 HINSTANCE g_hInstDll;
00026 HANDLE GlobalHeap;
00027 BOOL WsaInitialized = FALSE;    /* TRUE if WSAStartup() has been successfully called */
00028 WSPUPCALLTABLE UpcallTable;
00029 
00030 
00031 /*
00032  * @implemented
00033  */
00034 INT
00035 EXPORT
00036 WSAGetLastError(VOID)
00037 {
00038     return GetLastError();
00039 }
00040 
00041 
00042 /*
00043  * @implemented
00044  */
00045 VOID
00046 EXPORT
00047 WSASetLastError(IN INT iError)
00048 {
00049     SetLastError(iError);
00050 }
00051 
00052 
00053 /*
00054  * @implemented
00055  */
00056 INT
00057 EXPORT
00058 WSAStartup(IN  WORD wVersionRequested,
00059            OUT LPWSADATA lpWSAData)
00060 {
00061     BYTE Low, High;
00062 
00063     WS_DbgPrint(MAX_TRACE, ("WSAStartup of ws2_32.dll\n"));
00064 
00065     if (!g_hInstDll)
00066         return WSASYSNOTREADY;
00067 
00068     if (lpWSAData == NULL)
00069         return WSAEFAULT;
00070 
00071     Low = LOBYTE(wVersionRequested);
00072     High  = HIBYTE(wVersionRequested);
00073 
00074     if (Low < 1)
00075     {
00076         WS_DbgPrint(MAX_TRACE, ("Bad winsock version requested, %d,%d", Low, High));
00077         return WSAVERNOTSUPPORTED;
00078     }
00079 
00080     if (Low == 1)
00081     {
00082         if (High == 0)
00083         {
00084             lpWSAData->wVersion = wVersionRequested;
00085         }
00086         else
00087         {
00088             lpWSAData->wVersion = MAKEWORD(1, 1);
00089         }
00090     }
00091     else if (Low == 2)
00092     {
00093         if (High <= 2)
00094         {
00095             lpWSAData->wVersion = MAKEWORD(2, High);
00096         }
00097         else
00098         {
00099             lpWSAData->wVersion = MAKEWORD(2, 2);
00100         }
00101     }
00102     else
00103     {
00104         lpWSAData->wVersion = MAKEWORD(2, 2);
00105     }
00106 
00107     lpWSAData->wVersion     = wVersionRequested;
00108     lpWSAData->wHighVersion = MAKEWORD(2,2);
00109     lstrcpyA(lpWSAData->szDescription, "WinSock 2.2");
00110     lstrcpyA(lpWSAData->szSystemStatus, "Running");
00111     lpWSAData->iMaxSockets  = 0;
00112     lpWSAData->iMaxUdpDg    = 0;
00113     lpWSAData->lpVendorInfo = NULL;
00114 
00115     /*FIXME: increment internal counter */
00116 
00117     WSASETINITIALIZED;
00118 
00119     return NO_ERROR;
00120 }
00121 
00122 
00123 /*
00124  * @implemented
00125  */
00126 INT
00127 EXPORT
00128 WSACleanup(VOID)
00129 {
00130     WS_DbgPrint(MAX_TRACE, ("WSACleanup of ws2_32.dll\n"));
00131 
00132     if (!WSAINITIALIZED)
00133     {
00134         WSASetLastError(WSANOTINITIALISED);
00135         return WSANOTINITIALISED;
00136     }
00137 
00138     return NO_ERROR;
00139 }
00140 
00141 
00142 /*
00143  * @implemented
00144  */
00145 SOCKET
00146 EXPORT
00147 socket(IN  INT af,
00148        IN  INT type,
00149        IN  INT protocol)
00150 {
00151     return WSASocketW(af,
00152                       type,
00153                       protocol,
00154                       NULL,
00155                       0,
00156                       0);
00157 }
00158 
00159 
00160 /*
00161  * @implemented
00162  */
00163 SOCKET
00164 EXPORT
00165 WSASocketA(IN  INT af,
00166            IN  INT type,
00167            IN  INT protocol,
00168            IN  LPWSAPROTOCOL_INFOA lpProtocolInfo,
00169            IN  GROUP g,
00170            IN  DWORD dwFlags)
00171 /*
00172  * FUNCTION: Creates a new socket
00173  */
00174 {
00175     WSAPROTOCOL_INFOW ProtocolInfoW;
00176     LPWSAPROTOCOL_INFOW p;
00177     UNICODE_STRING StringU;
00178     ANSI_STRING StringA;
00179 
00180     WS_DbgPrint(MAX_TRACE, ("af (%d)  type (%d)  protocol (%d).\n",
00181     af, type, protocol));
00182 
00183     if (lpProtocolInfo)
00184     {
00185         memcpy(&ProtocolInfoW,
00186                lpProtocolInfo,
00187                sizeof(WSAPROTOCOL_INFOA) - sizeof(CHAR) * (WSAPROTOCOL_LEN + 1));
00188         RtlInitAnsiString(&StringA, (LPSTR)lpProtocolInfo->szProtocol);
00189         RtlInitUnicodeString(&StringU, (LPWSTR)&ProtocolInfoW.szProtocol);
00190         RtlAnsiStringToUnicodeString(&StringU, &StringA, FALSE);
00191         p = &ProtocolInfoW;
00192     }
00193     else
00194     {
00195         p = NULL;
00196     }
00197 
00198     return WSASocketW(af,
00199                       type,
00200                       protocol,
00201                       p,
00202                       g,
00203                       dwFlags);
00204 }
00205 
00206 
00207 /*
00208  * @implemented
00209  */
00210 SOCKET
00211 EXPORT
00212 WSASocketW(IN  INT af,
00213            IN  INT type,
00214            IN  INT protocol,
00215            IN  LPWSAPROTOCOL_INFOW lpProtocolInfo,
00216            IN  GROUP g,
00217            IN  DWORD dwFlags)
00218 /*
00219  * FUNCTION: Creates a new socket descriptor
00220  * ARGUMENTS:
00221  *     af             = Address family
00222  *     type           = Socket type
00223  *     protocol       = Protocol type
00224  *     lpProtocolInfo = Pointer to protocol information
00225  *     g              = Reserved
00226  *     dwFlags        = Socket flags
00227  * RETURNS:
00228  *     Created socket descriptor, or INVALID_SOCKET if it could not be created
00229  */
00230 {
00231     INT Status;
00232     SOCKET Socket;
00233     PCATALOG_ENTRY Provider;
00234     WSAPROTOCOL_INFOW ProtocolInfo;
00235 
00236     WS_DbgPrint(MAX_TRACE, ("af (%d)  type (%d)  protocol (%d).\n",
00237                 af, type, protocol));
00238 
00239     if (!WSAINITIALIZED)
00240     {
00241         WS_DbgPrint(MAX_TRACE, ("af (%d)  type (%d)  protocol (%d) = WSANOTINITIALISED.\n",
00242                   af, type, protocol));
00243         WSASetLastError(WSANOTINITIALISED);
00244         return INVALID_SOCKET;
00245     }
00246 
00247     if (!lpProtocolInfo)
00248     {
00249         lpProtocolInfo = &ProtocolInfo;
00250         ZeroMemory(&ProtocolInfo, sizeof(WSAPROTOCOL_INFOW));
00251 
00252         ProtocolInfo.iAddressFamily = af;
00253         ProtocolInfo.iSocketType    = type;
00254         ProtocolInfo.iProtocol      = protocol;
00255     }
00256 
00257     Provider = LocateProvider(lpProtocolInfo);
00258     if (!Provider)
00259     {
00260         WS_DbgPrint(MAX_TRACE, ("af (%d)  type (%d)  protocol (%d) = WSAEAFNOSUPPORT.\n",
00261                     af, type, protocol));
00262         WSASetLastError(WSAEAFNOSUPPORT);
00263         return INVALID_SOCKET;
00264     }
00265 
00266     Status = LoadProvider(Provider, lpProtocolInfo);
00267     if (Status != NO_ERROR)
00268     {
00269         WS_DbgPrint(MAX_TRACE, ("af (%d)  type (%d)  protocol (%d) = %d.\n",
00270                     af, type, protocol, Status));
00271         WSASetLastError(Status);
00272         return INVALID_SOCKET;
00273     }
00274 
00275     WS_DbgPrint(MAX_TRACE, ("Calling WSPSocket at (0x%X).\n",
00276                 Provider->ProcTable.lpWSPSocket));
00277 
00278     assert(Provider->ProcTable.lpWSPSocket);
00279 
00280     WS_DbgPrint(MAX_TRACE,("About to call provider socket fn\n"));
00281 
00282     Socket = Provider->ProcTable.lpWSPSocket(af,
00283                                              type,
00284                                              protocol,
00285                                              lpProtocolInfo,
00286                                              g,
00287                                              dwFlags,
00288                                              &Status);
00289 
00290     WS_DbgPrint(MAX_TRACE,("Socket: %x, Status: %x\n", Socket, Status));
00291 
00292     if (Status != NO_ERROR)
00293     {
00294         WSASetLastError(Status);
00295         return INVALID_SOCKET;
00296     }
00297 
00298     WS_DbgPrint(MAX_TRACE,("Status: %x\n", Status));
00299 
00300     return Socket;
00301 }
00302 
00303 
00304 /*
00305  * @implemented
00306  */
00307 INT
00308 EXPORT
00309 closesocket(IN  SOCKET s)
00310 /*
00311  * FUNCTION: Closes a socket descriptor
00312  * ARGUMENTS:
00313  *     s = Socket descriptor
00314  * RETURNS:
00315  *     0, or SOCKET_ERROR if an error ocurred
00316  */
00317 {
00318     PCATALOG_ENTRY Provider;
00319     INT Status;
00320     INT Errno;
00321 
00322     WS_DbgPrint(MAX_TRACE, ("s (0x%X).\n", s));
00323 
00324     if (!WSAINITIALIZED)
00325     {
00326         WSASetLastError(WSANOTINITIALISED);
00327         return SOCKET_ERROR;
00328     }
00329 
00330     if (!ReferenceProviderByHandle((HANDLE)s, &Provider))
00331     {
00332         WSASetLastError(WSAENOTSOCK);
00333         return SOCKET_ERROR;
00334     }
00335 
00336     CloseProviderHandle((HANDLE)s);
00337 
00338     WS_DbgPrint(MAX_TRACE,("DereferenceProviderByHandle\n"));
00339 
00340     DereferenceProviderByPointer(Provider);
00341 
00342     WS_DbgPrint(MAX_TRACE,("DereferenceProviderByHandle Done\n"));
00343 
00344     Status = Provider->ProcTable.lpWSPCloseSocket(s, &Errno);
00345 
00346     WS_DbgPrint(MAX_TRACE,("Provider Close Done\n"));
00347 
00348     if (Status == SOCKET_ERROR)
00349         WSASetLastError(Errno);
00350 
00351     WS_DbgPrint(MAX_TRACE,("Returning success\n"));
00352 
00353     return 0;
00354 }
00355 
00356 
00357 /*
00358  * @implemented
00359  */
00360 INT
00361 EXPORT
00362 select(IN      INT nfds,
00363        IN OUT  LPFD_SET readfds,
00364        IN OUT  LPFD_SET writefds,
00365        IN OUT  LPFD_SET exceptfds,
00366        IN      CONST struct timeval *timeout)
00367 /*
00368  * FUNCTION: Returns status of one or more sockets
00369  * ARGUMENTS:
00370  *     nfds      = Always ignored
00371  *     readfds   = Pointer to socket set to be checked for readability (optional)
00372  *     writefds  = Pointer to socket set to be checked for writability (optional)
00373  *     exceptfds = Pointer to socket set to be checked for errors (optional)
00374  *     timeout   = Pointer to a TIMEVAL structure indicating maximum wait time
00375  *                 (NULL means wait forever)
00376  * RETURNS:
00377  *     Number of ready socket descriptors, or SOCKET_ERROR if an error ocurred
00378  */
00379 {
00380     PCATALOG_ENTRY Provider = NULL;
00381     INT Count;
00382     INT Errno;
00383 
00384     WS_DbgPrint(MAX_TRACE, ("readfds (0x%X)  writefds (0x%X)  exceptfds (0x%X).\n",
00385                 readfds, writefds, exceptfds));
00386 
00387     if (!WSAINITIALIZED)
00388     {
00389         WSASetLastError(WSANOTINITIALISED);
00390         WS_DbgPrint(MID_TRACE,("Not initialized\n"));
00391         return SOCKET_ERROR;
00392     }
00393 
00394     /* FIXME: Sockets in FD_SETs should be sorted by their provider */
00395 
00396     /* FIXME: For now, assume only one service provider */
00397     if ((readfds != NULL) && (readfds->fd_count > 0))
00398     {
00399         if (!ReferenceProviderByHandle((HANDLE)readfds->fd_array[0],
00400                                        &Provider))
00401         {
00402             WSASetLastError(WSAENOTSOCK);
00403             WS_DbgPrint(MID_TRACE,("No provider (read)\n"));
00404             return SOCKET_ERROR;
00405         }
00406     }
00407     else if ((writefds != NULL) && (writefds->fd_count > 0))
00408     {
00409         if (!ReferenceProviderByHandle((HANDLE)writefds->fd_array[0],
00410                                        &Provider))
00411         {
00412             WSASetLastError(WSAENOTSOCK);
00413             WS_DbgPrint(MID_TRACE,("No provider (write)\n"));
00414             return SOCKET_ERROR;
00415         }
00416     }
00417     else if ((exceptfds != NULL) && (exceptfds->fd_count > 0))
00418     {
00419         if (!ReferenceProviderByHandle((HANDLE)exceptfds->fd_array[0], &Provider))
00420         {
00421             WSASetLastError(WSAENOTSOCK);
00422             WS_DbgPrint(MID_TRACE,("No provider (err)\n"));
00423             return SOCKET_ERROR;
00424         }
00425 #if 0 /* XXX empty select is not an error */
00426     }
00427     else
00428     {
00429         WSASetLastError(WSAEINVAL);
00430         return SOCKET_ERROR;
00431 #endif
00432     }
00433 
00434     if ( !Provider )
00435     {
00436         if ( timeout )
00437         {
00438             WS_DbgPrint(MID_TRACE,("Select: used as timer\n"));
00439             Sleep( timeout->tv_sec * 1000 + (timeout->tv_usec / 1000) );
00440         }
00441         return 0;
00442     }
00443     else if (Provider->ProcTable.lpWSPSelect)
00444     {
00445         WS_DbgPrint(MID_TRACE,("Calling WSPSelect:%x\n", Provider->ProcTable.lpWSPSelect));
00446         Count = Provider->ProcTable.lpWSPSelect(nfds,
00447                                                 readfds,
00448                                                 writefds,
00449                                                 exceptfds,
00450                                                 (LPTIMEVAL)timeout,
00451                                                 &Errno);
00452 
00453         WS_DbgPrint(MAX_TRACE, ("[%x] Select: Count %d Errno %x\n",
00454                     Provider, Count, Errno));
00455 
00456         DereferenceProviderByPointer(Provider);
00457 
00458         if (Count == SOCKET_ERROR)
00459         {
00460             WSASetLastError(Errno);
00461             return SOCKET_ERROR;
00462         }
00463     }
00464     else
00465     {
00466         WSASetLastError(WSAEINVAL);
00467         return SOCKET_ERROR;
00468     }
00469 
00470     return Count;
00471 }
00472 
00473 
00474 /*
00475  * @implemented
00476  */
00477 INT
00478 EXPORT
00479 bind(IN SOCKET s,
00480      IN CONST struct sockaddr *name,
00481      IN INT namelen)
00482 {
00483     PCATALOG_ENTRY Provider;
00484     INT Status;
00485     INT Errno;
00486 
00487     if (!WSAINITIALIZED)
00488     {
00489         WSASetLastError(WSANOTINITIALISED);
00490         return SOCKET_ERROR;
00491     }
00492 
00493     if (!ReferenceProviderByHandle((HANDLE)s,
00494                                    &Provider))
00495     {
00496         WSASetLastError(WSAENOTSOCK);
00497         return SOCKET_ERROR;
00498     }
00499 
00500 #if (__W32API_MAJOR_VERSION < 2 || __W32API_MINOR_VERSION < 5)
00501     Status = Provider->ProcTable.lpWSPBind(s,
00502                                            (CONST LPSOCKADDR)name,
00503                                            namelen,
00504                                            &Errno);
00505 #else
00506     Status = Provider->ProcTable.lpWSPBind(s,
00507                                            name,
00508                                            namelen,
00509                                            &Errno);
00510 #endif /* __W32API_MAJOR_VERSION < 2 || __W32API_MINOR_VERSION < 5 */
00511 
00512     DereferenceProviderByPointer(Provider);
00513 
00514     if (Status == SOCKET_ERROR)
00515         WSASetLastError(Errno);
00516 
00517   return Status;
00518 }
00519 
00520 
00521 /*
00522  * @implemented
00523  */
00524 INT
00525 EXPORT
00526 listen(IN SOCKET s,
00527        IN INT backlog)
00528 {
00529     PCATALOG_ENTRY Provider;
00530     INT Status;
00531     INT Errno;
00532 
00533     if (!WSAINITIALIZED)
00534     {
00535         WSASetLastError(WSANOTINITIALISED);
00536         return SOCKET_ERROR;
00537     }
00538 
00539     if (!ReferenceProviderByHandle((HANDLE)s,
00540                                    &Provider))
00541     {
00542         WSASetLastError(WSAENOTSOCK);
00543         return SOCKET_ERROR;
00544     }
00545 
00546     Status = Provider->ProcTable.lpWSPListen(s,
00547                                              backlog,
00548                                              &Errno);
00549 
00550     DereferenceProviderByPointer(Provider);
00551 
00552     if (Status == SOCKET_ERROR)
00553         WSASetLastError(Errno);
00554 
00555     return Status;
00556 }
00557 
00558 
00559 /*
00560  * @implemented
00561  */
00562 SOCKET
00563 EXPORT
00564 accept(IN  SOCKET s,
00565        OUT LPSOCKADDR addr,
00566        OUT INT FAR* addrlen)
00567 {
00568   return WSAAccept(s,
00569                    addr,
00570                    addrlen,
00571                    NULL,
00572                    0);
00573 }
00574 
00575 
00576 /*
00577  * @implemented
00578  */
00579 INT
00580 EXPORT
00581 ioctlsocket(IN     SOCKET s,
00582             IN     LONG cmd,
00583             IN OUT ULONG FAR* argp)
00584 {
00585     ULONG tmp;
00586     
00587     return WSAIoctl(s,
00588                     cmd,
00589                     argp,
00590                     sizeof(ULONG),
00591                     argp,
00592                     sizeof(ULONG),
00593                     &tmp,
00594                     0,
00595                     0);
00596 }
00597 
00598 
00599 /*
00600  * @implemented
00601  */
00602 SOCKET
00603 EXPORT
00604 WSAAccept(IN     SOCKET s,
00605           OUT    LPSOCKADDR addr,
00606           IN OUT LPINT addrlen,
00607           IN     LPCONDITIONPROC lpfnCondition,
00608           IN     DWORD_PTR dwCallbackData)
00609 {
00610     PCATALOG_ENTRY Provider;
00611     SOCKET Socket;
00612     INT Errno;
00613 
00614     if (!WSAINITIALIZED)
00615     {
00616         WSASetLastError(WSANOTINITIALISED);
00617         return SOCKET_ERROR;
00618     }
00619 
00620     if (!ReferenceProviderByHandle((HANDLE)s, &Provider))
00621     {
00622         WSASetLastError(WSAENOTSOCK);
00623         return SOCKET_ERROR;
00624     }
00625 
00626     WS_DbgPrint(MAX_TRACE,("Calling provider accept\n"));
00627 
00628     Socket = Provider->ProcTable.lpWSPAccept(s,
00629                                              addr,
00630                                              addrlen,
00631                                              lpfnCondition,
00632                                              dwCallbackData,
00633                                              &Errno);
00634 
00635     WS_DbgPrint(MAX_TRACE,("Calling provider accept -> Socket %x, Errno %x\n",
00636                 Socket, Errno));
00637 
00638     DereferenceProviderByPointer(Provider);
00639 
00640     if (Socket == INVALID_SOCKET)
00641         WSASetLastError(Errno);
00642 
00643     if ( addr && addrlen )
00644     {
00645 #if DBG
00646         LPSOCKADDR_IN sa = (LPSOCKADDR_IN)addr;
00647         WS_DbgPrint(MAX_TRACE,("Returned address: %d %s:%d (len %d)\n",
00648                                sa->sin_family,
00649                                inet_ntoa(sa->sin_addr),
00650                                ntohs(sa->sin_port),
00651                                *addrlen));
00652 #endif
00653     }
00654 
00655     return Socket;
00656 }
00657 
00658 
00659 /*
00660  * @implemented
00661  */
00662 INT
00663 EXPORT
00664 connect(IN  SOCKET s,
00665         IN  CONST struct sockaddr *name,
00666         IN  INT namelen)
00667 {
00668   return WSAConnect(s,
00669                     name,
00670                     namelen,
00671                     NULL,
00672                     NULL,
00673                     NULL,
00674                     NULL);
00675 }
00676 
00677 
00678 /*
00679  * @implemented
00680  */
00681 INT
00682 EXPORT
00683 WSAConnect(IN  SOCKET s,
00684            IN  CONST struct sockaddr *name,
00685            IN  INT namelen,
00686            IN  LPWSABUF lpCallerData,
00687            OUT LPWSABUF lpCalleeData,
00688            IN  LPQOS lpSQOS,
00689            IN  LPQOS lpGQOS)
00690 {
00691     PCATALOG_ENTRY Provider;
00692     INT Status;
00693     INT Errno;
00694 
00695     if (!WSAINITIALIZED)
00696     {
00697         WSASetLastError(WSANOTINITIALISED);
00698         return SOCKET_ERROR;
00699     }
00700 
00701     if (!ReferenceProviderByHandle((HANDLE)s, &Provider))
00702     {
00703         WSASetLastError(WSAENOTSOCK);
00704         return SOCKET_ERROR;
00705     }
00706 
00707 #if (__W32API_MAJOR_VERSION < 2 || __W32API_MINOR_VERSION < 5)
00708     Status = Provider->ProcTable.lpWSPConnect(s,
00709                                               (CONST LPSOCKADDR)name,
00710                                               namelen,
00711                                               lpCallerData,
00712                                               lpCalleeData,
00713                                               lpSQOS,
00714                                               lpGQOS,
00715                                               &Errno);
00716 #else
00717     Status = Provider->ProcTable.lpWSPConnect(s,
00718                                               name,
00719                                               namelen,
00720                                               lpCallerData,
00721                                               lpCalleeData,
00722                                               lpSQOS,
00723                                               lpGQOS,
00724                                               &Errno);
00725 #endif
00726 
00727     DereferenceProviderByPointer(Provider);
00728 
00729     if (Status == SOCKET_ERROR)
00730         WSASetLastError(Errno);
00731 
00732     return Status;
00733 }
00734 
00735 
00736 /*
00737  * @implemented
00738  */
00739 INT
00740 EXPORT
00741 WSAIoctl(IN  SOCKET s,
00742          IN  DWORD dwIoControlCode,
00743          IN  LPVOID lpvInBuffer,
00744          IN  DWORD cbInBuffer,
00745          OUT LPVOID lpvOutBuffer,
00746          IN  DWORD cbOutBuffer,
00747          OUT LPDWORD lpcbBytesReturned,
00748          IN  LPWSAOVERLAPPED lpOverlapped,
00749          IN  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
00750 {
00751     PCATALOG_ENTRY Provider;
00752     INT Status;
00753     INT Errno;
00754 
00755     if (!WSAINITIALIZED)
00756     {
00757         WSASetLastError(WSANOTINITIALISED);
00758         return SOCKET_ERROR;
00759     }
00760 
00761     if (!ReferenceProviderByHandle((HANDLE)s, &Provider))
00762     {
00763         WSASetLastError(WSAENOTSOCK);
00764         return SOCKET_ERROR;
00765     }
00766 
00767     Status = Provider->ProcTable.lpWSPIoctl(s,
00768                                             dwIoControlCode,
00769                                             lpvInBuffer,
00770                                             cbInBuffer,
00771                                             lpvOutBuffer,
00772                                             cbOutBuffer,
00773                                             lpcbBytesReturned,
00774                                             lpOverlapped,
00775                                             lpCompletionRoutine,
00776                                             NULL /* lpThreadId */,
00777                                             &Errno);
00778 
00779     DereferenceProviderByPointer(Provider);
00780 
00781     if (Status == SOCKET_ERROR)
00782         WSASetLastError(Errno);
00783 
00784     return Status;
00785 }
00786 
00787 /*
00788  * @implemented
00789  */
00790 INT
00791 EXPORT
00792 __WSAFDIsSet(SOCKET s, LPFD_SET set)
00793 {
00794     unsigned int i;
00795 
00796     for ( i = 0; i < set->fd_count; i++ )
00797     if ( set->fd_array[i] == s ) return TRUE;
00798 
00799     return FALSE;
00800 }
00801 
00802 void free_winsock_thread_block(PWINSOCK_THREAD_BLOCK p)
00803 {
00804     if (p)
00805     {
00806         if (p->Hostent) { free_hostent(p->Hostent); p->Hostent = 0; }
00807         if (p->Getservbyname){}
00808         if (p->Getservbyport) {}
00809     }
00810 }
00811 
00812 BOOL
00813 WINAPI
00814 DllMain(HANDLE hInstDll,
00815         ULONG dwReason,
00816         LPVOID lpReserved)
00817 {
00818     PWINSOCK_THREAD_BLOCK p;
00819 
00820     WS_DbgPrint(MAX_TRACE, ("DllMain of ws2_32.dll.\n"));
00821 
00822     switch (dwReason)
00823     {
00824         case DLL_PROCESS_ATTACH:
00825         {
00826             GlobalHeap = GetProcessHeap();
00827 
00828             g_hInstDll = hInstDll;
00829 
00830             CreateCatalog();
00831 
00832             InitProviderHandleTable();
00833 
00834             UpcallTable.lpWPUCloseEvent         = WPUCloseEvent;
00835             UpcallTable.lpWPUCloseSocketHandle  = WPUCloseSocketHandle;
00836             UpcallTable.lpWPUCreateEvent        = WPUCreateEvent;
00837             UpcallTable.lpWPUCreateSocketHandle = WPUCreateSocketHandle;
00838             UpcallTable.lpWPUFDIsSet            = WPUFDIsSet;
00839             UpcallTable.lpWPUGetProviderPath    = WPUGetProviderPath;
00840             UpcallTable.lpWPUModifyIFSHandle    = WPUModifyIFSHandle;
00841             UpcallTable.lpWPUPostMessage        = PostMessageW;
00842             UpcallTable.lpWPUQueryBlockingCallback    = WPUQueryBlockingCallback;
00843             UpcallTable.lpWPUQuerySocketHandleContext = WPUQuerySocketHandleContext;
00844             UpcallTable.lpWPUQueueApc           = WPUQueueApc;
00845             UpcallTable.lpWPUResetEvent         = WPUResetEvent;
00846             UpcallTable.lpWPUSetEvent           = WPUSetEvent;
00847             UpcallTable.lpWPUOpenCurrentThread  = WPUOpenCurrentThread;
00848             UpcallTable.lpWPUCloseThread        = WPUCloseThread;
00849 
00850             /* Fall through to thread attachment handler */
00851         }
00852         case DLL_THREAD_ATTACH:
00853         {
00854             p = HeapAlloc(GlobalHeap, 0, sizeof(WINSOCK_THREAD_BLOCK));
00855 
00856             WS_DbgPrint(MAX_TRACE, ("Thread block at 0x%X.\n", p));
00857 
00858             if (!p) {
00859               return FALSE;
00860             }
00861 
00862             p->Hostent = NULL;
00863             p->LastErrorValue = NO_ERROR;
00864             p->Getservbyname  = NULL;
00865             p->Getservbyport  = NULL;
00866 
00867             NtCurrentTeb()->WinSockData = p;
00868         }
00869         break;
00870 
00871         case DLL_PROCESS_DETACH:
00872         {
00873             DestroyCatalog();
00874 
00875             FreeProviderHandleTable();
00876         }
00877         break;
00878 
00879         case DLL_THREAD_DETACH:
00880         {
00881             p = NtCurrentTeb()->WinSockData;
00882 
00883             if (p)
00884               HeapFree(GlobalHeap, 0, p);
00885         }
00886         break;
00887     }
00888 
00889     WS_DbgPrint(MAX_TRACE, ("DllMain of ws2_32.dll. Leaving.\n"));
00890 
00891     return TRUE;
00892 }
00893 
00894 /* EOF */

Generated on Sat May 26 2012 04:21:09 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.