windows-nt/Source/XPSP1/NT/ds/security/gina/userenv/utils/dllload.cpp

1681 lines
47 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//*************************************************************
//
// DLL loading functions
//
// Microsoft Confidential
// Copyright (c) Microsoft Corporation 1995
// All rights reserved
//
//*************************************************************
#include "uenv.h"
//
// file global variables containing pointers to APIs and
// loaded modules
//
NETAPI32_API g_NetApi32Api;
SECUR32_API g_Secur32Api;
LDAP_API g_LdapApi;
ICMP_API g_IcmpApi;
WSOCK32_API g_WSock32Api;
DS_API g_DsApi;
SHELL32_API g_Shell32Api;
SHLWAPI_API g_ShlwapiApi;
OLE32_API g_Ole32Api;
GPTEXT_API g_GpTextApi;
IPHLPAPI_API g_IpHlpApi;
WS2_32_API g_ws2_32Api;
CRITICAL_SECTION *g_ApiDLLCritSec;
//*************************************************************
//
// InitializeAPIs()
//
// Purpose: initializes API structures for delay loaded
// modules
//
// Parameters: none
//
//
// Return: none
//
//*************************************************************
void InitializeAPIs( void )
{
ZeroMemory( &g_NetApi32Api, sizeof( NETAPI32_API ) );
ZeroMemory( &g_Secur32Api, sizeof( SECUR32_API ) );
ZeroMemory( &g_LdapApi, sizeof( LDAP_API ) );
ZeroMemory( &g_IcmpApi, sizeof( ICMP_API ) );
ZeroMemory( &g_WSock32Api, sizeof( WSOCK32_API ) );
ZeroMemory( &g_DsApi, sizeof( DS_API ) );
ZeroMemory( &g_Shell32Api, sizeof( SHELL32_API ) );
ZeroMemory( &g_ShlwapiApi, sizeof( SHLWAPI_API ) );
ZeroMemory( &g_Ole32Api, sizeof( OLE32_API ) );
ZeroMemory( &g_GpTextApi, sizeof( GPTEXT_API ) );
}
//*************************************************************
//
// InitializeApiDLLsCritSec()
//
// Purpose: initializes a CRITICAL_SECTION for synch'ing
// DLL loads
//
// Parameters: none
//
//
// Return: ERROR_SUCCESS if successful
// An error if it fails.
//
//*************************************************************
DWORD InitializeApiDLLsCritSec( void )
{
CRITICAL_SECTION *pCritSec = NULL;
DWORD result = ERROR_SUCCESS;
BOOL fInitialized = FALSE;
CRITICAL_SECTION *pInitial;
// If the critical section already exists, return.
if (g_ApiDLLCritSec != NULL)
return ERROR_SUCCESS;
// Allocate memory for the critial section.
pCritSec = (CRITICAL_SECTION *) LocalAlloc( LMEM_FIXED,
sizeof(CRITICAL_SECTION) );
if (pCritSec == NULL)
{
result = ERROR_NOT_ENOUGH_MEMORY;
goto Exit;
}
// Initialize the critical section. Using the flag 0x80000000
// preallocates the event so that EnterCriticalSection can only
// throw timeout exceptions.
__try
{
if (!InitializeCriticalSectionAndSpinCount( pCritSec, 0x80000000 ))
result = GetLastError();
else
fInitialized = TRUE;
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
result = ERROR_NOT_ENOUGH_MEMORY;
}
if (result != ERROR_SUCCESS)
goto Exit;
// Save the critical section.
pInitial = (CRITICAL_SECTION *) InterlockedCompareExchangePointer(
(void **) &g_ApiDLLCritSec, (void *) pCritSec, NULL );
// If the InterlockedCompareExchange succeeded, don't free the
// critical section just allocated.
if (pInitial == NULL)
pCritSec = NULL;
Exit:
if (pCritSec != NULL)
{
if (fInitialized)
DeleteCriticalSection( pCritSec );
LocalFree( pCritSec );
}
return result;
}
//*************************************************************
//
// CloseApiDLLsCritSec()
//
// Purpose: clean up CRITICAL_SECTION for synch'ing
// DLL loads
//
// Parameters: none
//
//
// Return: none
//
//*************************************************************
void CloseApiDLLsCritSec( void )
{
if (g_ApiDLLCritSec != NULL)
{
DeleteCriticalSection( g_ApiDLLCritSec );
LocalFree( g_ApiDLLCritSec );
g_ApiDLLCritSec = NULL;
}
}
//*************************************************************
//
// LoadNetAPI32()
//
// Purpose: Loads netapi32.dll
//
// Parameters: pNETAPI32 - pointer to a NETAPI32_API structure to
// initialize
//
//
// Return: TRUE if successful
// FALSE if an error occurs
//
//*************************************************************
PNETAPI32_API LoadNetAPI32 ()
{
BOOL bResult = FALSE;
PNETAPI32_API pNetAPI32 = &g_NetApi32Api;
if (InitializeApiDLLsCritSec() != ERROR_SUCCESS)
return NULL;
EnterCriticalSection( g_ApiDLLCritSec );
if ( pNetAPI32->hInstance ) {
//
// module is already loaded and initialized
//
LeaveCriticalSection( g_ApiDLLCritSec );
return pNetAPI32;
}
pNetAPI32->hInstance = LoadLibrary (TEXT("netapi32.dll"));
if (!pNetAPI32->hInstance) {
DebugMsg((DM_WARNING, TEXT("LoadNetAPI32: Failed to load netapi32 with %d."),
GetLastError()));
goto Exit;
}
pNetAPI32->pfnDsGetDcName = (PFNDSGETDCNAME) GetProcAddress (pNetAPI32->hInstance,
#ifdef UNICODE
"DsGetDcNameW");
#else
"DsGetDcNameA");
#endif
if (!pNetAPI32->pfnDsGetDcName) {
DebugMsg((DM_WARNING, TEXT("LoadNetAPI32: Failed to find DsGetDcName with %d."),
GetLastError()));
goto Exit;
}
pNetAPI32->pfnDsGetSiteName = (PFNDSGETSITENAME) GetProcAddress (pNetAPI32->hInstance,
#ifdef UNICODE
"DsGetSiteNameW");
#else
"DsGetSiteNameA");
#endif
if (!pNetAPI32->pfnDsGetSiteName) {
DebugMsg((DM_WARNING, TEXT("LoadNetAPI32: Failed to find DsGetSiteName with %d."),
GetLastError()));
goto Exit;
}
pNetAPI32->pfnDsRoleGetPrimaryDomainInformation = (PFNDSROLEGETPRIMARYDOMAININFORMATION)GetProcAddress (pNetAPI32->hInstance,
"DsRoleGetPrimaryDomainInformation");
if (!pNetAPI32->pfnDsRoleGetPrimaryDomainInformation) {
DebugMsg((DM_WARNING, TEXT("LoadNetAPI32: Failed to find pfnDsRoleGetPrimaryDomainInformation with %d."),
GetLastError()));
goto Exit;
}
pNetAPI32->pfnDsRoleFreeMemory = (PFNDSROLEFREEMEMORY)GetProcAddress (pNetAPI32->hInstance,
"DsRoleFreeMemory");
if (!pNetAPI32->pfnDsRoleFreeMemory) {
DebugMsg((DM_WARNING, TEXT("LoadNetAPI32: Failed to find pfnDsRoleFreeMemory with %d."),
GetLastError()));
goto Exit;
}
pNetAPI32->pfnNetApiBufferFree = (PFNNETAPIBUFFERFREE) GetProcAddress (pNetAPI32->hInstance,
"NetApiBufferFree");
if (!pNetAPI32->pfnNetApiBufferFree) {
DebugMsg((DM_WARNING, TEXT("LoadNetAPI32: Failed to find NetApiBufferFree with %d."),
GetLastError()));
goto Exit;
}
pNetAPI32->pfnNetUserGetGroups = (PFNNETUSERGETGROUPS) GetProcAddress (pNetAPI32->hInstance,
"NetUserGetGroups");
if (!pNetAPI32->pfnNetUserGetGroups) {
DebugMsg((DM_WARNING, TEXT("LoadNetAPI32: Failed to find NetUserGetGroups with %d."),
GetLastError()));
goto Exit;
}
pNetAPI32->pfnNetUserGetInfo = (PFNNETUSERGETINFO) GetProcAddress (pNetAPI32->hInstance,
"NetUserGetInfo");
if (!pNetAPI32->pfnNetUserGetInfo) {
DebugMsg((DM_WARNING, TEXT("LoadNetAPI32: Failed to find NetUserGetInfo with %d."),
GetLastError()));
goto Exit;
}
//
// Success
//
bResult = TRUE;
Exit:
if (!bResult) {
CEvents ev(TRUE, EVENT_LOAD_DLL_FAILED);
ev.AddArg(TEXT("netapi32.dll")); ev.AddArgWin32Error(GetLastError()); ev.Report();
if ( pNetAPI32->hInstance ) {
FreeLibrary( pNetAPI32->hInstance );
}
ZeroMemory( pNetAPI32, sizeof( NETAPI32_API ) );
pNetAPI32 = 0;
}
LeaveCriticalSection( g_ApiDLLCritSec );
return pNetAPI32;
}
//*************************************************************
//
// LoadSecur32()
//
// Purpose: Loads secur32.dll
//
//
//
// Return: TRUE if successful
// FALSE if an error occurs
//
//*************************************************************
PSECUR32_API LoadSecur32 ()
{
BOOL bResult = FALSE;
PSECUR32_API pSecur32 = &g_Secur32Api;
if (InitializeApiDLLsCritSec() != ERROR_SUCCESS)
return NULL;
EnterCriticalSection( g_ApiDLLCritSec );
if ( pSecur32->hInstance ) {
//
// module is already loaded and initialized
//
LeaveCriticalSection( g_ApiDLLCritSec );
return pSecur32;
}
//
// Load secur32.dll
//
pSecur32->hInstance = LoadLibrary (TEXT("secur32.dll"));
if (!pSecur32->hInstance) {
DebugMsg((DM_WARNING, TEXT("LoadSecur32: Failed to load secur32 with %d."),
GetLastError()));
goto Exit;
}
pSecur32->pfnGetUserNameEx = (PFNGETUSERNAMEEX)GetProcAddress (pSecur32->hInstance,
#ifdef UNICODE
"GetUserNameExW");
#else
"GetUserNameExA");
#endif
if (!pSecur32->pfnGetUserNameEx) {
DebugMsg((DM_WARNING, TEXT("LoadSecur32: Failed to find GetUserNameEx with %d."),
GetLastError()));
goto Exit;
}
pSecur32->pfnGetComputerObjectName = (PFNGETCOMPUTEROBJECTNAME)GetProcAddress (pSecur32->hInstance,
#ifdef UNICODE
"GetComputerObjectNameW");
#else
"GetComputerObjectNameA");
#endif
if (!pSecur32->pfnGetComputerObjectName) {
DebugMsg((DM_WARNING, TEXT("LoadSecur32: Failed to find GetComputerObjectName with %d."),
GetLastError()));
goto Exit;
}
pSecur32->pfnTranslateName = (PFNTRANSLATENAME)GetProcAddress (pSecur32->hInstance,
#ifdef UNICODE
"TranslateNameW");
#else
"TranslateNameA");
#endif
if (!pSecur32->pfnTranslateName) {
DebugMsg((DM_WARNING, TEXT("LoadSecur32: Failed to find TranslateName with %d."),
GetLastError()));
goto Exit;
}
pSecur32->pfnAcceptSecurityContext = (ACCEPT_SECURITY_CONTEXT_FN)GetProcAddress (pSecur32->hInstance,
"AcceptSecurityContext");
if (!pSecur32->pfnAcceptSecurityContext) {
DebugMsg((DM_WARNING, TEXT("LoadSecur32: Failed to find AcceptSecurityContext with %d."),
GetLastError()));
goto Exit;
}
pSecur32->pfnAcquireCredentialsHandle = (ACQUIRE_CREDENTIALS_HANDLE_FN)GetProcAddress (pSecur32->hInstance,
#ifdef UNICODE
"AcquireCredentialsHandleW");
#else
"AcquireCredentialsHandleA");
#endif
if (!pSecur32->pfnAcquireCredentialsHandle) {
DebugMsg((DM_WARNING, TEXT("LoadSecur32: Failed to find AcquireCredentialsHandle with %d."),
GetLastError()));
goto Exit;
}
pSecur32->pfnDeleteSecurityContext = (DELETE_SECURITY_CONTEXT_FN)GetProcAddress (pSecur32->hInstance,
"DeleteSecurityContext");
if (!pSecur32->pfnDeleteSecurityContext) {
DebugMsg((DM_WARNING, TEXT("LoadSecur32: Failed to find DeleteSecurityContext with %d."),
GetLastError()));
goto Exit;
}
pSecur32->pfnFreeContextBuffer = (FREE_CONTEXT_BUFFER_FN)GetProcAddress (pSecur32->hInstance,
"FreeContextBuffer");
if (!pSecur32->pfnFreeContextBuffer) {
DebugMsg((DM_WARNING, TEXT("LoadSecur32: Failed to find FreeContextBuffer with %d."),
GetLastError()));
goto Exit;
}
pSecur32->pfnFreeCredentialsHandle = (FREE_CREDENTIALS_HANDLE_FN)GetProcAddress (pSecur32->hInstance,
"FreeCredentialsHandle");
if (!pSecur32->pfnFreeCredentialsHandle) {
DebugMsg((DM_WARNING, TEXT("LoadSecur32: Failed to find FreeCredentialsHandle with %d."),
GetLastError()));
goto Exit;
}
pSecur32->pfnInitializeSecurityContext = (INITIALIZE_SECURITY_CONTEXT_FN)GetProcAddress (pSecur32->hInstance,
#ifdef UNICODE
"InitializeSecurityContextW");
#else
"InitializeSecurityContextA");
#endif
if (!pSecur32->pfnInitializeSecurityContext) {
DebugMsg((DM_WARNING, TEXT("LoadSecur32: Failed to find InitializeSecurityContext with %d."),
GetLastError()));
goto Exit;
}
pSecur32->pfnQuerySecurityContextToken = (QUERY_SECURITY_CONTEXT_TOKEN_FN)GetProcAddress (pSecur32->hInstance,
"QuerySecurityContextToken");
if (!pSecur32->pfnQuerySecurityContextToken) {
DebugMsg((DM_WARNING, TEXT("LoadSecur32: Failed to find QuerySecurityContextToken with %d."),
GetLastError()));
goto Exit;
}
pSecur32->pfnQuerySecurityPackageInfo = (QUERY_SECURITY_PACKAGE_INFO_FN)GetProcAddress (pSecur32->hInstance,
#ifdef UNICODE
"QuerySecurityPackageInfoW");
#else
"QuerySecurityPackageInfoA");
#endif
if (!pSecur32->pfnQuerySecurityPackageInfo) {
DebugMsg((DM_WARNING, TEXT("LoadSecur32: Failed to find QuerySecurityPackageInfo with %d."),
GetLastError()));
goto Exit;
}
//
// Success
//
bResult = TRUE;
Exit:
if (!bResult) {
CEvents ev(TRUE, EVENT_LOAD_DLL_FAILED);
ev.AddArg(TEXT("secur32.dll")); ev.AddArgWin32Error(GetLastError()); ev.Report();
if ( pSecur32->hInstance ) {
FreeLibrary( pSecur32->hInstance );
}
ZeroMemory( pSecur32, sizeof( SECUR32_API ) );
pSecur32 = 0;
}
LeaveCriticalSection( g_ApiDLLCritSec );
return pSecur32;
}
//*************************************************************
//
// LoadLDAP()
//
// Purpose: Loads wldap32.dll
//
// Parameters: pLDAP - pointer to a LDAP_API structure to
// initialize
//
//
// Return: TRUE if successful
// FALSE if an error occurs
//
//*************************************************************
PLDAP_API LoadLDAP ()
{
BOOL bResult = FALSE;
PLDAP_API pLDAP = &g_LdapApi;
if (InitializeApiDLLsCritSec() != ERROR_SUCCESS)
return NULL;
EnterCriticalSection( g_ApiDLLCritSec );
if ( pLDAP->hInstance ) {
//
// module is already loaded and initialized
//
LeaveCriticalSection( g_ApiDLLCritSec );
return pLDAP;
}
//
// Load wldap32.dll
//
pLDAP->hInstance = LoadLibrary (TEXT("wldap32.dll"));
if (!pLDAP->hInstance) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to load wldap32 with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnldap_open = (PFNLDAP_OPEN) GetProcAddress (pLDAP->hInstance,
#ifdef UNICODE
"ldap_openW");
#else
"ldap_openA");
#endif
if (!pLDAP->pfnldap_open) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find ldap_open with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnldap_init = (PFNLDAP_INIT) GetProcAddress (pLDAP->hInstance,
#ifdef UNICODE
"ldap_initW");
#else
"ldap_initA");
#endif
if (!pLDAP->pfnldap_init) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find ldap_init with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnldap_connect = (PFNLDAP_CONNECT) GetProcAddress (pLDAP->hInstance,
"ldap_connect");
if (!pLDAP->pfnldap_connect) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find ldap_connect with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnldap_bind_s = (PFNLDAP_BIND_S) GetProcAddress (pLDAP->hInstance,
#ifdef UNICODE
"ldap_bind_sW");
#else
"ldap_bind_sA");
#endif
if (!pLDAP->pfnldap_bind_s) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find ldap_bind_s with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnldap_search_s = (PFNLDAP_SEARCH_S) GetProcAddress (pLDAP->hInstance,
#ifdef UNICODE
"ldap_search_sW");
#else
"ldap_search_sA");
#endif
if (!pLDAP->pfnldap_search_s) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find ldap_search_s with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnldap_search_ext_s = (PFNLDAP_SEARCH_EXT_S) GetProcAddress (pLDAP->hInstance,
#ifdef UNICODE
"ldap_search_ext_sW");
#else
"ldap_search_ext_sA");
#endif
if (!pLDAP->pfnldap_search_ext_s) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find ldap_search_ext_s with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnldap_get_values = (PFNLDAP_GET_VALUES) GetProcAddress (pLDAP->hInstance,
#ifdef UNICODE
"ldap_get_valuesW");
#else
"ldap_get_valuesA");
#endif
if (!pLDAP->pfnldap_get_values) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find ldap_get_values with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnldap_value_free = (PFNLDAP_VALUE_FREE) GetProcAddress (pLDAP->hInstance,
#ifdef UNICODE
"ldap_value_freeW");
#else
"ldap_value_freeA");
#endif
if (!pLDAP->pfnldap_value_free) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find ldap_value_free with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnldap_get_values_len = (PFNLDAP_GET_VALUES_LEN) GetProcAddress (pLDAP->hInstance,
#ifdef UNICODE
"ldap_get_values_lenW");
#else
"ldap_get_values_lenA");
#endif
if (!pLDAP->pfnldap_get_values_len) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find ldap_get_values_len with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnldap_value_free_len = (PFNLDAP_VALUE_FREE_LEN) GetProcAddress (pLDAP->hInstance,
"ldap_value_free_len");
if (!pLDAP->pfnldap_value_free_len) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find ldap_value_free_len with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnldap_msgfree = (PFNLDAP_MSGFREE) GetProcAddress (pLDAP->hInstance,
"ldap_msgfree");
if (!pLDAP->pfnldap_msgfree) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find ldap_msgfree with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnldap_unbind = (PFNLDAP_UNBIND) GetProcAddress (pLDAP->hInstance,
"ldap_unbind");
if (!pLDAP->pfnldap_unbind) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find ldap_unbind with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnLdapGetLastError = (PFNLDAPGETLASTERROR) GetProcAddress (pLDAP->hInstance,
"LdapGetLastError");
if (!pLDAP->pfnLdapGetLastError) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find pfnLdapGetLastError with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnldap_first_entry = (PFNLDAP_FIRST_ENTRY) GetProcAddress (pLDAP->hInstance,
"ldap_first_entry");
if (!pLDAP->pfnldap_first_entry) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find ldap_first_entry with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnldap_next_entry = (PFNLDAP_NEXT_ENTRY) GetProcAddress (pLDAP->hInstance,
"ldap_next_entry");
if (!pLDAP->pfnldap_next_entry) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find ldap_next_entry with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnldap_get_dn = (PFNLDAP_GET_DN) GetProcAddress (pLDAP->hInstance,
#ifdef UNICODE
"ldap_get_dnW");
#else
"ldap_get_dnA");
#endif
if (!pLDAP->pfnldap_get_dn) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find ldap_get_dn with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnldap_set_option = (PFNLDAP_SET_OPTION) GetProcAddress (pLDAP->hInstance,
#ifdef UNICODE
"ldap_set_optionW");
#else
"ldap_set_option");
#endif
if (!pLDAP->pfnldap_set_option) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find ldap_set_option with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnldap_memfree = (PFNLDAP_MEMFREE) GetProcAddress (pLDAP->hInstance,
#ifdef UNICODE
"ldap_memfreeW");
#else
"ldap_memfreeA");
#endif
if (!pLDAP->pfnldap_memfree) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find ldap_memfree with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnLdapMapErrorToWin32 = (PFNLDAPMAPERRORTOWIN32) GetProcAddress (pLDAP->hInstance,
"LdapMapErrorToWin32");
if (!pLDAP->pfnLdapMapErrorToWin32) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find LdapMapErrorToWin32 with %d."),
GetLastError()));
goto Exit;
}
pLDAP->pfnldap_err2string = (PFNLDAP_ERR2STRING) GetProcAddress (pLDAP->hInstance,
#ifdef UNICODE
"ldap_err2stringW");
#else
"ldap_err2stringA");
#endif
if (!pLDAP->pfnldap_err2string) {
DebugMsg((DM_WARNING, TEXT("LoadLDAP: Failed to find ldap_err2string with %d."),
GetLastError()));
goto Exit;
}
//
// Success
//
bResult = TRUE;
Exit:
if (!bResult) {
CEvents ev(TRUE, EVENT_LOAD_DLL_FAILED);
ev.AddArg(TEXT("wldap32.dll")); ev.AddArgWin32Error(GetLastError()); ev.Report();
if ( pLDAP->hInstance ) {
FreeLibrary( pLDAP->hInstance );
}
ZeroMemory( pLDAP, sizeof( LDAP_API ) );
pLDAP = 0;
}
LeaveCriticalSection( g_ApiDLLCritSec );
return pLDAP;
}
//*************************************************************
//
// LoadIcmp()
//
// Purpose: Loads cmp.dll
//
// Parameters: pIcmp - pointer to a ICMP_API structure to
// initialize
//
//
// Return: ERROR_SUCCESS if successful
// result if an error occurs
//
//*************************************************************
DWORD LoadIcmp ( PICMP_API *pIcmpOut )
{
DWORD dwResult = ERROR_SUCCESS;
PICMP_API pIcmp = &g_IcmpApi;
*pIcmpOut = NULL;
dwResult = InitializeApiDLLsCritSec();
if (dwResult != ERROR_SUCCESS)
return dwResult;
EnterCriticalSection( g_ApiDLLCritSec );
if ( pIcmp->hInstance ) {
//
// module already loaded and initialized
//
LeaveCriticalSection( g_ApiDLLCritSec );
*pIcmpOut = pIcmp;
return ERROR_SUCCESS;
}
pIcmp->hInstance = LoadLibrary (TEXT("icmp.dll"));
if (!pIcmp->hInstance) {
dwResult = GetLastError();
DebugMsg((DM_WARNING, TEXT("LoadIcmp: Failed to load icmp with %d."),
GetLastError()));
goto Exit;
}
pIcmp->pfnIcmpCreateFile = (PFNICMPCREATEFILE) GetProcAddress (pIcmp->hInstance,
"IcmpCreateFile");
if (!pIcmp->pfnIcmpCreateFile) {
dwResult = GetLastError();
DebugMsg((DM_WARNING, TEXT("LoadIcmp: Failed to find IcmpCreateFile with %d."),
GetLastError()));
goto Exit;
}
pIcmp->pfnIcmpCloseHandle = (PFNICMPCLOSEHANDLE) GetProcAddress (pIcmp->hInstance,
"IcmpCloseHandle");
if (!pIcmp->pfnIcmpCloseHandle) {
dwResult = GetLastError();
DebugMsg((DM_WARNING, TEXT("LoadIcmp: Failed to find IcmpCloseHandle with %d."),
GetLastError()));
goto Exit;
}
pIcmp->pfnIcmpSendEcho = (PFNICMPSENDECHO) GetProcAddress (pIcmp->hInstance,
"IcmpSendEcho");
if (!pIcmp->pfnIcmpSendEcho) {
dwResult = GetLastError();
DebugMsg((DM_WARNING, TEXT("LoadIcmp: Failed to find IcmpSendEcho with %d."),
GetLastError()));
goto Exit;
}
//
// Success
//
Exit:
if (dwResult != ERROR_SUCCESS) {
CEvents ev(TRUE, EVENT_LOAD_DLL_FAILED);
ev.AddArg(TEXT("icmp.dll")); ev.AddArgWin32Error(dwResult); ev.Report();
if ( pIcmp->hInstance ) {
FreeLibrary( pIcmp->hInstance );
}
ZeroMemory( pIcmp, sizeof( ICMP_API ) );
pIcmp = 0;
}
else
*pIcmpOut = pIcmp;
LeaveCriticalSection( g_ApiDLLCritSec );
return dwResult;
}
//*************************************************************
//
// LoadWSock()
//
// Purpose: Loads cmp.dll
//
// Parameters: pWSock32 - pointer to a WSOCK32_API structure to
// initialize
//
//
// Return: TRUE if successful
// FALSE if an error occurs
//
//*************************************************************
PWSOCK32_API LoadWSock32 ()
{
BOOL bResult = FALSE;
PWSOCK32_API pWSock32 = &g_WSock32Api;
if (InitializeApiDLLsCritSec() != ERROR_SUCCESS)
return NULL;
EnterCriticalSection( g_ApiDLLCritSec );
if ( pWSock32->hInstance ) {
//
// module already loaded and initialized
//
LeaveCriticalSection( g_ApiDLLCritSec );
return pWSock32;
}
pWSock32->hInstance = LoadLibrary (TEXT("wsock32.dll"));
if (!pWSock32->hInstance) {
DebugMsg((DM_WARNING, TEXT("LoadWSock32: Failed to load wsock32 with %d."),
GetLastError()));
goto Exit;
}
pWSock32->pfninet_addr = (LPFN_INET_ADDR) GetProcAddress (pWSock32->hInstance,
"inet_addr");
if (!pWSock32->pfninet_addr) {
DebugMsg((DM_WARNING, TEXT("LoadWSock32: Failed to find inet_addr with %d."),
GetLastError()));
goto Exit;
}
pWSock32->pfngethostbyname = (LPFN_GETHOSTBYNAME) GetProcAddress (pWSock32->hInstance,
"gethostbyname");
if (!pWSock32->pfngethostbyname) {
DebugMsg((DM_WARNING, TEXT("LoadWSock32: Failed to find gethostbyname with %d."),
GetLastError()));
goto Exit;
}
//
// Success
//
bResult = TRUE;
Exit:
if (!bResult) {
CEvents ev(TRUE, EVENT_LOAD_DLL_FAILED);
ev.AddArg(TEXT("wsock32.dll")); ev.AddArgWin32Error(GetLastError()); ev.Report();
if ( pWSock32->hInstance ) {
FreeLibrary( pWSock32->hInstance );
}
ZeroMemory( pWSock32, sizeof( WSOCK32_API ) );
pWSock32 = 0;
}
LeaveCriticalSection( g_ApiDLLCritSec );
return pWSock32;
}
//*************************************************************
//
// LoadDSAPI()
//
// Purpose: Loads ntdsapi.dll
//
// Parameters: pDSApi - pointer to a DS_API structure to initialize
//
// Return: TRUE if successful
// FALSE if an error occurs
//
//*************************************************************
PDS_API LoadDSApi()
{
BOOL bResult = FALSE;
PDS_API pDSApi = &g_DsApi;
if (InitializeApiDLLsCritSec() != ERROR_SUCCESS)
return NULL;
EnterCriticalSection( g_ApiDLLCritSec );
if ( pDSApi->hInstance ) {
//
// module already loaded and initialized
//
LeaveCriticalSection( g_ApiDLLCritSec );
return pDSApi;
}
pDSApi->hInstance = LoadLibrary (TEXT("ntdsapi.dll"));
if (!pDSApi->hInstance) {
DebugMsg((DM_WARNING, TEXT("LoadDSApi: Failed to load ntdsapi with %d."),
GetLastError()));
goto Exit;
}
pDSApi->pfnDsCrackNames = (PFN_DSCRACKNAMES) GetProcAddress (pDSApi->hInstance,
#ifdef UNICODE
"DsCrackNamesW");
#else
"DsCrackNamesA");
#endif
if (!pDSApi->pfnDsCrackNames) {
DebugMsg((DM_WARNING, TEXT("LoadDSApi: Failed to find DsCrackNames with %d."),
GetLastError()));
goto Exit;
}
pDSApi->pfnDsFreeNameResult = (PFN_DSFREENAMERESULT) GetProcAddress (pDSApi->hInstance,
#ifdef UNICODE
"DsFreeNameResultW");
#else
"DsFreeNameResultA");
#endif
if (!pDSApi->pfnDsFreeNameResult) {
DebugMsg((DM_WARNING, TEXT("LoadDSApi: Failed to find DsFreeNameResult with %d."),
GetLastError()));
goto Exit;
}
//
// Success
//
bResult = TRUE;
Exit:
if (!bResult) {
CEvents ev(TRUE, EVENT_LOAD_DLL_FAILED);
ev.AddArg(TEXT("ntdsapi.dll")); ev.AddArgWin32Error(GetLastError()); ev.Report();
if ( pDSApi->hInstance ) {
FreeLibrary( pDSApi->hInstance );
}
ZeroMemory( pDSApi, sizeof( DS_API ) );
pDSApi = 0;
}
LeaveCriticalSection( g_ApiDLLCritSec );
return pDSApi;
}
//*************************************************************
//
// LoadShell32Api()
//
// Purpose: Loads shell32.dll
//
// Parameters: pointer to hold SHELL32_API
//
// Return: ERROR_SUCCESS if successful
// error code if not successful
//
//*************************************************************
DWORD LoadShell32Api( PSHELL32_API *ppShell32Api )
{
DWORD dwErr;
PSHELL32_API pShell32Api = &g_Shell32Api;
dwErr = InitializeApiDLLsCritSec();
if (dwErr != ERROR_SUCCESS)
return dwErr;
EnterCriticalSection( g_ApiDLLCritSec );
if ( pShell32Api->hInstance ) {
//
// module already loaded and initialized
//
LeaveCriticalSection( g_ApiDLLCritSec );
*ppShell32Api = pShell32Api;
return ERROR_SUCCESS;
}
pShell32Api->hInstance = LoadLibrary (TEXT("shell32.dll"));
if (!pShell32Api->hInstance) {
dwErr = GetLastError();
DebugMsg((DM_WARNING, TEXT("LoadShlwapiApi: Failed to load ntdsapi with %d."),
GetLastError()));
goto Exit;
}
pShell32Api->pfnShChangeNotify = (PFNSHCHANGENOTIFY) GetProcAddress (pShell32Api->hInstance, "SHChangeNotify");
if (!pShell32Api->pfnShChangeNotify) {
dwErr = GetLastError();
DebugMsg((DM_WARNING, TEXT("LoadShlwapiApi: Failed to find SHChangeNotify with %d."),
GetLastError()));
goto Exit;
}
pShell32Api->pfnShGetSpecialFolderPath = (PFNSHGETSPECIALFOLDERPATH) GetProcAddress (pShell32Api->hInstance,
#ifdef UNICODE
"SHGetSpecialFolderPathW");
#else
"SHGetSpecialFolderPathA");
#endif
if (!pShell32Api->pfnShGetSpecialFolderPath) {
dwErr = GetLastError();
DebugMsg((DM_WARNING, TEXT("LoadShlwapiApi: Failed to find SHGetSpecialFolderPath with %d."),
GetLastError()));
goto Exit;
}
pShell32Api->pfnShGetFolderPath = (PFNSHGETFOLDERPATH) GetProcAddress (pShell32Api->hInstance,
#ifdef UNICODE
"SHGetFolderPathW");
#else
"SHGetFolderPathA");
#endif
if (!pShell32Api->pfnShGetFolderPath) {
dwErr = GetLastError();
DebugMsg((DM_WARNING, TEXT("LoadShlwapiApi: Failed to find SHGetFolderPath with %d."),
GetLastError()));
goto Exit;
}
pShell32Api->pfnShSetFolderPath = (PFNSHSETFOLDERPATH) GetProcAddress (pShell32Api->hInstance,
#ifdef UNICODE
(LPCSTR)SHSetFolderW_Ord);
#else
(LPCSTR)SHSetFolderA_Ord);
#endif
if (!pShell32Api->pfnShSetFolderPath) {
dwErr = GetLastError();
DebugMsg((DM_WARNING, TEXT("LoadShlwapiApi: Failed to find SHSetFolderPath with %d."),
GetLastError()));
goto Exit;
}
pShell32Api->pfnShSetLocalizedName = (PFNSHSETLOCALIZEDNAME)
GetProcAddress (pShell32Api->hInstance, "SHSetLocalizedName");
if (!pShell32Api->pfnShSetLocalizedName) {
dwErr = GetLastError();
DebugMsg((DM_WARNING, TEXT("LoadShlwapiApi: Failed to find SHSetLocalizedName with %d."),
GetLastError()));
goto Exit;
}
//
// Success
//
dwErr = ERROR_SUCCESS;
Exit:
if (dwErr != ERROR_SUCCESS) {
CEvents ev(TRUE, EVENT_LOAD_DLL_FAILED);
ev.AddArg(TEXT("shell32.dll")); ev.AddArgWin32Error(GetLastError()); ev.Report();
if ( pShell32Api->hInstance ) {
FreeLibrary( pShell32Api->hInstance );
}
ZeroMemory( pShell32Api, sizeof( SHELL32_API ) );
pShell32Api = 0;
}
LeaveCriticalSection( g_ApiDLLCritSec );
*ppShell32Api = pShell32Api;
return dwErr;
}
//*************************************************************
//
// LoadShwapiAPI()
//
// Purpose: Loads shlwapi.dll
//
// Parameters: none
//
// Return: pointer to SHLWAPI_API
//
//*************************************************************
PSHLWAPI_API LoadShlwapiApi()
{
BOOL bResult = FALSE;
PSHLWAPI_API pShlwapiApi = &g_ShlwapiApi;
if (InitializeApiDLLsCritSec() != ERROR_SUCCESS)
return NULL;
EnterCriticalSection( g_ApiDLLCritSec );
if ( pShlwapiApi->hInstance ) {
//
// module already loaded and initialized
//
LeaveCriticalSection( g_ApiDLLCritSec );
return pShlwapiApi;
}
pShlwapiApi->hInstance = LoadLibrary (TEXT("shlwapi.dll"));
if (!pShlwapiApi->hInstance) {
DebugMsg((DM_WARNING, TEXT("LoadShlwapiApi: Failed to load ntdsapi with %d."),
GetLastError()));
goto Exit;
}
pShlwapiApi->pfnPathGetArgs = (PFNPATHGETARGS) GetProcAddress (pShlwapiApi->hInstance,
#ifdef UNICODE
"PathGetArgsW");
#else
"PathGetArgsA");
#endif
if (!pShlwapiApi->pfnPathGetArgs) {
DebugMsg((DM_WARNING, TEXT("LoadShlwapiApi: Failed to find PathGetArgs with %d."),
GetLastError()));
goto Exit;
}
pShlwapiApi->pfnPathUnquoteSpaces = (PFNPATHUNQUOTESPACES) GetProcAddress (pShlwapiApi->hInstance,
#ifdef UNICODE
"PathUnquoteSpacesW");
#else
"PathUnquoteSpacesA");
#endif
if (!pShlwapiApi->pfnPathUnquoteSpaces) {
DebugMsg((DM_WARNING, TEXT("LoadShlwapiApi: Failed to find PathUnquoteSpaces with %d."),
GetLastError()));
goto Exit;
}
//
// Success
//
bResult = TRUE;
Exit:
if (!bResult) {
CEvents ev(TRUE, EVENT_LOAD_DLL_FAILED);
ev.AddArg(TEXT("shlwapi.dll")); ev.AddArgWin32Error(GetLastError()); ev.Report();
if ( pShlwapiApi->hInstance ) {
FreeLibrary( pShlwapiApi->hInstance );
}
ZeroMemory( pShlwapiApi, sizeof( SHLWAPI_API ) );
pShlwapiApi = 0;
}
LeaveCriticalSection( g_ApiDLLCritSec );
return pShlwapiApi;
}
//*************************************************************
//
// LoadOle32Api()
//
// Purpose: Loads ole32.dll
//
// Parameters: none
//
// Return: pointer to OLE32_API
//
//*************************************************************
POLE32_API LoadOle32Api()
{
BOOL bResult = FALSE;
OLE32_API *pOle32Api = &g_Ole32Api;
if (InitializeApiDLLsCritSec() != ERROR_SUCCESS)
return NULL;
EnterCriticalSection( g_ApiDLLCritSec );
if ( pOle32Api->hInstance ) {
//
// module already loaded and initialized
//
LeaveCriticalSection( g_ApiDLLCritSec );
return pOle32Api;
}
pOle32Api->hInstance = LoadLibrary (TEXT("ole32.dll"));
if (!pOle32Api->hInstance) {
DebugMsg((DM_WARNING, TEXT("LoadOle32Api: Failed to load ole32.dll with %d."),
GetLastError()));
goto Exit;
}
pOle32Api->pfnCoCreateInstance = (PFNCOCREATEINSTANCE) GetProcAddress (pOle32Api->hInstance,
"CoCreateInstance");
if (!pOle32Api->pfnCoCreateInstance) {
DebugMsg((DM_WARNING, TEXT("LoadOle32Api: Failed to find CoCreateInstance with %d."),
GetLastError()));
goto Exit;
}
pOle32Api->pfnCoInitializeEx = (PFNCOINITIALIZEEX) GetProcAddress (pOle32Api->hInstance,
"CoInitializeEx");
if (!pOle32Api->pfnCoInitializeEx) {
DebugMsg((DM_WARNING, TEXT("LoadOle32Api: Failed to find CoInitializeEx with %d."),
GetLastError()));
goto Exit;
}
pOle32Api->pfnCoUnInitialize = (PFNCOUNINITIALIZE) GetProcAddress (pOle32Api->hInstance,
"CoUninitialize");
if (!pOle32Api->pfnCoUnInitialize) {
DebugMsg((DM_WARNING, TEXT("LoadOle32Api: Failed to find CoUnInitialize with %d."),
GetLastError()));
goto Exit;
}
pOle32Api->pfnCoCreateGuid = (PFNCOCREATEGUID) GetProcAddress (pOle32Api->hInstance,
"CoCreateGuid");
if (!pOle32Api->pfnCoCreateGuid) {
DebugMsg((DM_WARNING, TEXT("LoadOle32Api: Failed to find CoCreateGuid with %d."),
GetLastError()));
goto Exit;
}
//
// Success
//
bResult = TRUE;
Exit:
if (!bResult) {
CEvents ev(TRUE, EVENT_LOAD_DLL_FAILED);
ev.AddArg(TEXT("ole32.dll")); ev.AddArgWin32Error(GetLastError()); ev.Report();
if ( pOle32Api->hInstance ) {
FreeLibrary( pOle32Api->hInstance );
}
ZeroMemory( pOle32Api, sizeof( OLE32_API ) );
pOle32Api = 0;
}
LeaveCriticalSection( g_ApiDLLCritSec );
return pOle32Api;
}
//*************************************************************
//
// LoadGpTextApi()
//
// Purpose: Loads gptext.dll
//
// Parameters: none
//
// Return: pointer to GPTEXT_API
//
//*************************************************************
GPTEXT_API * LoadGpTextApi()
{
BOOL bResult = FALSE;
GPTEXT_API *pGpTextApi = &g_GpTextApi;
if (InitializeApiDLLsCritSec() != ERROR_SUCCESS)
return NULL;
EnterCriticalSection( g_ApiDLLCritSec );
if ( pGpTextApi->hInstance ) {
//
// module already loaded and initialized
//
LeaveCriticalSection( g_ApiDLLCritSec );
return pGpTextApi;
}
pGpTextApi->hInstance = LoadLibrary (TEXT("gptext.dll"));
if (!pGpTextApi->hInstance) {
DebugMsg((DM_WARNING, TEXT("LoadGpTextApi: Failed to load gptext.dll with %d."),
GetLastError()));
goto Exit;
}
pGpTextApi->pfnScrRegGPOListToWbem = (PFNSCRREGGPOLISTTOWBEM) GetProcAddress (pGpTextApi->hInstance,
"ScrRegGPOListToWbem");
if (!pGpTextApi->pfnScrRegGPOListToWbem) {
DebugMsg((DM_WARNING, TEXT("LoadGpTextApi: Failed to find ScrRegGPOListToWbem with %d."),
GetLastError()));
goto Exit;
}
//
// Success
//
bResult = TRUE;
Exit:
if (!bResult) {
CEvents ev(TRUE, EVENT_LOAD_DLL_FAILED);
ev.AddArg(TEXT("gptext.dll")); ev.AddArgWin32Error(GetLastError()); ev.Report();
if ( pGpTextApi->hInstance ) {
FreeLibrary( pGpTextApi->hInstance );
}
ZeroMemory( pGpTextApi, sizeof( GPTEXT_API ) );
pGpTextApi = 0;
}
LeaveCriticalSection( g_ApiDLLCritSec );
return pGpTextApi;
}
PIPHLPAPI_API LoadIpHlpApi()
{
bool bResult = false;
PIPHLPAPI_API pIpHlpApi = &g_IpHlpApi;
if (InitializeApiDLLsCritSec() != ERROR_SUCCESS)
return NULL;
EnterCriticalSection( g_ApiDLLCritSec );
if ( pIpHlpApi->hInstance )
{
//
// module is already loaded and initialized
//
LeaveCriticalSection( g_ApiDLLCritSec );
return pIpHlpApi;
}
pIpHlpApi->hInstance = LoadLibrary( L"iphlpapi.dll" );
if ( !pIpHlpApi->hInstance )
{
DebugMsg((DM_WARNING, L"LoadIpHlpApi: Failed to load iphlpapi with %d.", GetLastError()));
goto Exit;
}
pIpHlpApi->pfnGetBestInterface = (PFNGETBESTINTERFACE) GetProcAddress( pIpHlpApi->hInstance, "GetBestInterface" );
if ( !pIpHlpApi->pfnGetBestInterface )
{
DebugMsg((DM_WARNING, L"LoadIpHlpApi: Failed to find GetBestInterface with %d.", GetLastError()));
goto Exit;
}
pIpHlpApi->pfnGetIfEntry = (PFNGETIFENTRY) GetProcAddress (pIpHlpApi->hInstance, "GetIfEntry" );
if ( !pIpHlpApi->pfnGetIfEntry )
{
DebugMsg((DM_WARNING, L"LoadIpHlpApi: Failed to find GetIfEntry with %d.", GetLastError()));
goto Exit;
}
pIpHlpApi->pfnGetAdapterIndex = (PFNGETADAPTERINDEX) GetProcAddress (pIpHlpApi->hInstance, "GetAdapterIndex" );
if ( !pIpHlpApi->pfnGetAdapterIndex )
{
DebugMsg((DM_WARNING, L"LoadIpHlpApi: Failed to find GetAdapterIndex with %d.", GetLastError()));
goto Exit;
}
bResult = true;
Exit:
if ( !bResult )
{
CEvents ev(TRUE, EVENT_LOAD_DLL_FAILED);
ev.AddArg( L"iphlpapi.dll" );
ev.AddArgWin32Error( GetLastError() );
ev.Report();
if ( pIpHlpApi->hInstance )
{
FreeLibrary( pIpHlpApi->hInstance );
}
ZeroMemory( pIpHlpApi, sizeof( IPHLPAPI_API ) );
pIpHlpApi = 0;
}
LeaveCriticalSection( g_ApiDLLCritSec );
return pIpHlpApi;
}
//*************************************************************
//
// Loadws2_32Api()
//
// Purpose: Loads ws2_32.dll
//
// Parameters: none
//
// Return: pointer to WS2_32_API
//
//*************************************************************
WS2_32_API * Loadws2_32Api()
{
BOOL bResult = FALSE;
WS2_32_API *pws2_32Api = &g_ws2_32Api;
if (InitializeApiDLLsCritSec() != ERROR_SUCCESS)
return NULL;
EnterCriticalSection( g_ApiDLLCritSec );
if ( pws2_32Api->hInstance ) {
//
// module already loaded and initialized
//
LeaveCriticalSection( g_ApiDLLCritSec );
return pws2_32Api;
}
pws2_32Api->hInstance = LoadLibrary (TEXT("ws2_32.dll"));
if (!pws2_32Api->hInstance) {
DebugMsg((DM_WARNING, TEXT("Loadws2_32Api: Failed to load ws2_32.dll with %d."),
GetLastError()));
goto Exit;
}
pws2_32Api->pfnWSALookupServiceBegin = (PFNWSALOOKUPSERVICEBEGIN) GetProcAddress (pws2_32Api->hInstance,
"WSALookupServiceBeginW");
if (!pws2_32Api->pfnWSALookupServiceBegin) {
DebugMsg((DM_WARNING, TEXT("Loadws2_32Api: Failed to find WSALookupServiceBegin with %d."),
GetLastError()));
goto Exit;
}
pws2_32Api->pfnWSALookupServiceNext = (PFNWSALOOKUPSERVICENEXT) GetProcAddress (pws2_32Api->hInstance,
"WSALookupServiceNextW");
if (!pws2_32Api->pfnWSALookupServiceNext) {
DebugMsg((DM_WARNING, TEXT("Loadws2_32Api: Failed to find WSALookupServiceNext with %d."),
GetLastError()));
goto Exit;
}
pws2_32Api->pfnWSALookupServiceEnd = (PFNWSALOOKUPSERVICEEND) GetProcAddress (pws2_32Api->hInstance,
"WSALookupServiceEnd");
if (!pws2_32Api->pfnWSALookupServiceEnd) {
DebugMsg((DM_WARNING, TEXT("Loadws2_32Api: Failed to find WSALookupServiceEnd with %d."),
GetLastError()));
goto Exit;
}
pws2_32Api->pfnWSAStartup = (PFNWSASTARTUP) GetProcAddress (pws2_32Api->hInstance,
"WSAStartup");
if (!pws2_32Api->pfnWSAStartup) {
DebugMsg((DM_WARNING, TEXT("Loadws2_32Api: Failed to find WSAStartup with %d."),
GetLastError()));
goto Exit;
}
pws2_32Api->pfnWSACleanup = (PFNWSACLEANUP) GetProcAddress (pws2_32Api->hInstance,
"WSACleanup");
if (!pws2_32Api->pfnWSACleanup) {
DebugMsg((DM_WARNING, TEXT("Loadws2_32Api: Failed to find WSACleanup with %d."),
GetLastError()));
goto Exit;
}
pws2_32Api->pfnWSAGetLastError = (PFNWSAGETLASTERROR) GetProcAddress (pws2_32Api->hInstance,
"WSAGetLastError");
if (!pws2_32Api->pfnWSAGetLastError) {
DebugMsg((DM_WARNING, TEXT("Loadws2_32Api: Failed to find WSAGetLastError with %d."),
GetLastError()));
goto Exit;
}
//
// Success
//
bResult = TRUE;
Exit:
if (!bResult) {
CEvents ev(TRUE, EVENT_LOAD_DLL_FAILED);
ev.AddArg(TEXT("ws2_32.dll")); ev.AddArgWin32Error(GetLastError()); ev.Report();
if ( pws2_32Api->hInstance ) {
FreeLibrary( pws2_32Api->hInstance );
}
ZeroMemory( pws2_32Api, sizeof( WS2_32_API ) );
pws2_32Api = 0;
}
LeaveCriticalSection( g_ApiDLLCritSec );
return pws2_32Api;
}