Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygendllmain.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
1.7.6.1
|