|
|
//*************************************************************
//
// 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; }
|