1681 lines
47 KiB
C++
1681 lines
47 KiB
C++
|
//*************************************************************
|
||
|
//
|
||
|
// 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;
|
||
|
}
|
||
|
|