reactos/dll/win32/ws2_32/src/dllmain.c

128 lines
3.1 KiB
C

/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS WinSock 2 API
* FILE: dll/win32/ws2_32_new/src/dllmain.c
* PURPOSE: DLL Entrypoint
* PROGRAMMER: Alex Ionescu (alex@relsoft.net)
*/
/*
* BUGS:
* - GetAddrInfoW is completely IPv4 hacked and has some dirty code.
* - LookupNodeByAddr is missing some IPv6 support.
*/
/* INCLUDES ******************************************************************/
#include <ws2_32.h>
/* DATA **********************************************************************/
HANDLE WsSockHeap;
HINSTANCE WsDllHandle;
DWORD GlobalTlsIndex = TLS_OUT_OF_INDEXES;
/* FUNCTIONS *****************************************************************/
BOOL
APIENTRY
DllMain(HANDLE hModule,
DWORD dwReason,
LPVOID lpReserved)
{
PWSPROCESS WsProcess;
/* Main Entrypoint */
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
/* Save DLL Handle */
WsDllHandle = hModule;
/* Get Global Heap */
WsSockHeap = GetProcessHeap();
/* TLS Allocation */
if (GlobalTlsIndex == TLS_OUT_OF_INDEXES)
{
GlobalTlsIndex = TlsAlloc();
if (GlobalTlsIndex == TLS_OUT_OF_INDEXES)
{
return FALSE;
}
}
/* Initialize some critical sections */
WsCreateStartupSynchronization();
WsAsyncGlobalInitialize();
WsRasInitializeAutodial();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
/* Destroy the attached Winsock Thread */
WsThreadDestroyCurrentThread();
break;
case DLL_PROCESS_DETACH:
/* Make sure we were initialized */
if (!WsDllHandle) break;
/* Check if this was a FreeLibrary call (ie: not process cleanup) */
if (lpReserved)
{
/* Destroy the thread which is exiting */
WsThreadDestroyCurrentThread();
/* Check if we have a process and destroy it */
WsProcess = WsGetProcess();
if (WsProcess) WsProcDelete(WsProcess);
/* Cleanup the Thread and Socket managers */
WsThreadCleanup();
WsSockCleanup();
/* Cleanup critical sections */
WsDestroyStartupSynchronization();
WsAsyncGlobalTerminate();
/* Free the TLS Index */
TlsFree(GlobalTlsIndex);
}
/* Cleanup RAS auto-dial helper */
WsRasUninitializeAutodial();
/* Clear our handle */
WsDllHandle = NULL;
break;
}
/* Return to OS */
return TRUE;
}
/*
* @implemented
*/
INT
WSAAPI
WSAGetLastError(VOID)
{
/* Let the Windows Function do the work */
return GetLastError();
}
/*
* @implemented
*/
VOID
WSAAPI
WSASetLastError(IN INT iError)
{
/* Let the Windows Function do the work */
SetLastError(iError);
}