/*++ Copyright (c) 1994 Microsoft Corporation Module Name : globals.c Abstract: Defines global variables for the common tcpsvcs.dll ( It is defined separately because the debug variable should be "C" variable.) Author: Murali R. Krishnan ( MuraliK ) 18-Nov-1994 Revision History: MuraliK 21-Feb-1995 Added Debugging Variables definitions --*/ #include #pragma hdrstop #include // // private routines // BOOL DummySvclocFn( VOID ); BOOL LoadNTSecurityEntryPoints( VOID ); BOOL LoadW95SecurityEntryPoints( VOID ); BOOL GetSecurityDllEntryPoints( IN HINSTANCE hInstance ); BOOL GetLogonDllEntryPoints( IN HINSTANCE hInstance ); // // Declare all the debugging related variables // #ifdef _NO_TRACING_ DECLARE_DEBUG_VARIABLE(); DECLARE_DEBUG_PRINTS_OBJECT(); #endif #define DEFAULT_DEBUG_FLAGS_VALUE ( 0) // // inetsloc entry points // HINSTANCE g_hSvcLocDll = NULL; INET_REGISTER_SVC_FN pfnInetRegisterSvc = NULL; INET_DEREGISTER_SVC_FN pfnInetDeregisterSvc = NULL; INET_INIT_CONTROL_SVC_FN pfnInitSvcLoc = NULL; INET_INIT_CONTROL_SVC_FN pfnTerminateSvcLoc = NULL; // UNDONE remove? schannel no longer needed??? // // schannel entrypoints // HINSTANCE g_hSchannel = NULL; SSL_CRACK_CERTIFICATE_FN fnCrackCert = NULL; SSL_FREE_CERTIFICATE_FN fnFreeCert = NULL; // // crypt32 entrypoints // HINSTANCE g_hCrypt32Dll = NULL; CRYPT32_FREE_CERTCTXT_FN pfnFreeCertCtxt = NULL; CRYPT32_GET_CERTCTXT_PROP_FN pfnGetCertCtxtProp = NULL; CRYPT32_CERT_VERIFY_REVOCATION_FN pfnCertVerifyRevocation = NULL; CRYPT32_CERT_VERIFY_TIME_VALIDITY pfnCertVerifyTimeValidity = NULL; CRYPT32_CERT_NAME_TO_STR_A_FN pfnCertNameToStrA = NULL; // // sspi entrypoints // HINSTANCE g_hSecurityDll = NULL; ACCEPT_SECURITY_CONTEXT_FN pfnAcceptSecurityContext = NULL; ACQUIRE_CREDENTIALS_HANDLE_FN pfnAcquireCredentialsHandle = NULL; COMPLETE_AUTH_TOKEN_FN pfnCompleteAuthToken = NULL; DELETE_SECURITY_CONTEXT_FN pfnDeleteSecurityContext = NULL; ENUMERATE_SECURITY_PACKAGES_FN pfnEnumerateSecurityPackages = NULL; IMPERSONATE_SECURITY_CONTEXT_FN pfnImpersonateSecurityContext = NULL; INITIALIZE_SECURITY_CONTEXT_FN pfnInitializeSecurityContext = NULL; FREE_CONTEXT_BUFFER_FN pfnFreeContextBuffer = NULL; FREE_CREDENTIALS_HANDLE_FN pfnFreeCredentialsHandle = NULL; QUERY_CONTEXT_ATTRIBUTES_FN pfnQueryContextAttributes = NULL; QUERY_SECURITY_CONTEXT_TOKEN_FN pfnQuerySecurityContextToken = NULL; QUERY_SECURITY_PACKAGE_INFO_FN pfnQuerySecurityPackageInfo = NULL; REVERT_SECURITY_CONTEXT_FN pfnRevertSecurityContext = NULL; // // logon entry points // LOGON32_INITIALIZE_FN pfnLogon32Initialize = NULL; LOGON_NET_USER_A_FN pfnLogonNetUserA = NULL; LOGON_NET_USER_W_FN pfnLogonNetUserW = NULL; NET_USER_COOKIE_A_FN pfnNetUserCookieA = NULL; LOGON_DIGEST_USER_A_FN pfnLogonDigestUserA = NULL; GET_DEFAULT_DOMAIN_NAME_FN pfnGetDefaultDomainName = NULL; // // advapi32 // DUPLICATE_TOKEN_EX_FN pfnDuplicateTokenEx = NULL; LSA_OPEN_POLICY_FN pfnLsaOpenPolicy = NULL; LSA_RETRIEVE_PRIVATE_DATA_FN pfnLsaRetrievePrivateData = NULL; LSA_STORE_PRIVATE_DATA_FN pfnLsaStorePrivateData = NULL; LSA_FREE_MEMORY_FN pfnLsaFreeMemory = NULL; LSA_CLOSE_FN pfnLsaClose = NULL; LSA_NT_STATUS_TO_WIN_ERROR_FN pfnLsaNtStatusToWinError = NULL; // // kernel32 // #if _WIN64 LONG INET_InterlockedIncrement( IN OUT LPLONG lpAddend ) { return InterlockedIncrement(lpAddend); } LONG INET_InterlockedCompareExchange ( IN OUT PLONG Destination, IN LONG ExChange, IN LONG Comperand ) { return InterlockedCompareExchange(Destination, ExChange, Comperand); } LONG INET_InterlockedExchangeAdd( IN OUT LPLONG Addend, IN LONG Value ) { return InterlockedExchangeAdd(Addend, Value); } LONG __cdecl INET_InterlockedDecrement( IN OUT LPLONG lpAddend ) { return InterlockedDecrement(lpAddend); } INTERLOCKED_EXCHANGE_ADD_FN pfnInterlockedExchangeAdd = INET_InterlockedExchangeAdd; INTERLOCKED_COMPARE_EXCHANGE_FN pfnInterlockedCompareExchange = (INTERLOCKED_COMPARE_EXCHANGE_FN)INET_InterlockedCompareExchange; INTERLOCKED_INCREMENT_FN pfnInterlockedIncrement = INET_InterlockedIncrement; INTERLOCKED_DECREMENT_FN pfnInterlockedDecrement = INET_InterlockedDecrement; READ_DIR_CHANGES_W_FN pfnReadDirChangesW = ReadDirectoryChangesW; #else INTERLOCKED_EXCHANGE_ADD_FN pfnInterlockedExchangeAdd = NULL; INTERLOCKED_COMPARE_EXCHANGE_FN pfnInterlockedCompareExchange = NULL; INTERLOCKED_INCREMENT_FN pfnInterlockedIncrement = NULL; INTERLOCKED_DECREMENT_FN pfnInterlockedDecrement = NULL; READ_DIR_CHANGES_W_FN pfnReadDirChangesW; #endif // // lonsi // HINSTANCE g_hLonsiNT = NULL; HINSTANCE g_hLonsiW95 = NULL; // // rpcref // HINSTANCE g_hRpcRef = NULL; PFN_INETINFO_START_RPC_SERVER pfnInetinfoStartRpcServer = NULL; PFN_INETINFO_STOP_RPC_SERVER pfnInetinfoStopRpcServer = NULL; BOOL GetDynamicEntryPoints( VOID ) { HINSTANCE hTemp; DBG_ASSERT(IISIsValidPlatform()); if ( TsIsWindows95() ) { goto win95_only; } // // advapi32 // hTemp = LoadLibrary("advapi32.dll"); if ( hTemp != NULL ) { pfnDuplicateTokenEx = (DUPLICATE_TOKEN_EX_FN) GetProcAddress(hTemp,"DuplicateTokenEx"); pfnLsaOpenPolicy = (LSA_OPEN_POLICY_FN) GetProcAddress(hTemp,"LsaOpenPolicy"); pfnLsaRetrievePrivateData = (LSA_RETRIEVE_PRIVATE_DATA_FN) GetProcAddress(hTemp,"LsaRetrievePrivateData"); pfnLsaStorePrivateData = (LSA_STORE_PRIVATE_DATA_FN) GetProcAddress(hTemp,"LsaStorePrivateData"); pfnLsaFreeMemory = (LSA_FREE_MEMORY_FN) GetProcAddress(hTemp,"LsaFreeMemory"); pfnLsaClose = (LSA_CLOSE_FN) GetProcAddress(hTemp,"LsaClose"); pfnLsaNtStatusToWinError = (LSA_NT_STATUS_TO_WIN_ERROR_FN) GetProcAddress(hTemp,"LsaNtStatusToWinError"); FreeLibrary(hTemp); if ( !pfnDuplicateTokenEx || !pfnLsaOpenPolicy || !pfnLsaRetrievePrivateData || !pfnLsaFreeMemory || !pfnLsaClose || !pfnLsaNtStatusToWinError ) { DBGPRINTF((DBG_CONTEXT, "Unable to obtain an advapi32 entry point\n")); goto error_exit; } } else { DBGPRINTF((DBG_CONTEXT, "Error %d loading advapi32.dll\n", GetLastError() )); goto error_exit; } // // kernel32 // #ifndef _WIN64 hTemp = LoadLibrary("kernel32.dll"); if ( hTemp != NULL ) { pfnInterlockedExchangeAdd = (INTERLOCKED_EXCHANGE_ADD_FN) GetProcAddress(hTemp,"InterlockedExchangeAdd"); pfnInterlockedCompareExchange = (INTERLOCKED_COMPARE_EXCHANGE_FN) GetProcAddress(hTemp,"InterlockedCompareExchange"); pfnInterlockedIncrement = (INTERLOCKED_INCREMENT_FN) GetProcAddress(hTemp,"InterlockedIncrement"); pfnInterlockedDecrement = (INTERLOCKED_DECREMENT_FN) GetProcAddress(hTemp,"InterlockedDecrement"); pfnReadDirChangesW = (READ_DIR_CHANGES_W_FN) GetProcAddress(hTemp,"ReadDirectoryChangesW"); FreeLibrary(hTemp); if ( !pfnInterlockedExchangeAdd || !pfnInterlockedCompareExchange || !pfnInterlockedIncrement || !pfnInterlockedDecrement || !pfnReadDirChangesW ) { DBGPRINTF((DBG_CONTEXT, "Unable to obtain NT kernel32 entry point\n")); goto error_exit; } } else { DBGPRINTF((DBG_CONTEXT,"Error %d loading kernel32.dll\n", GetLastError())); goto error_exit; } #endif // // load the service locator entry points. Not fatal on failure. // // Loading of the inetsloc.dll service is disabled // g_hSvcLocDll = LoadLibrary("inetsloc.dll"); g_hSvcLocDll = NULL; if ( g_hSvcLocDll != NULL ) { pfnInetRegisterSvc = (INET_REGISTER_SVC_FN) GetProcAddress( g_hSvcLocDll, "INetRegisterService" ); pfnInetDeregisterSvc = (INET_DEREGISTER_SVC_FN) GetProcAddress( g_hSvcLocDll, "INetDeregisterService" ); pfnInitSvcLoc = (INET_INIT_CONTROL_SVC_FN) GetProcAddress( g_hSvcLocDll, "InitSvcLocator" ); pfnTerminateSvcLoc = (INET_INIT_CONTROL_SVC_FN) GetProcAddress( g_hSvcLocDll, "TerminateSvcLocator" ); if ( !pfnInetRegisterSvc || !pfnInetDeregisterSvc || !pfnInitSvcLoc || !pfnTerminateSvcLoc ) { DBGPRINTF((DBG_CONTEXT,"Unable to find an inetsloc entrypoint\n")); FreeLibrary( g_hSvcLocDll ); g_hSvcLocDll = NULL; } } if ( g_hSvcLocDll == NULL ) { DBGPRINTF((DBG_CONTEXT, "Unable to find an inetsloc.dll entrypoints!!!. Ignore if NTW.\n")); pfnInitSvcLoc = (INET_INIT_CONTROL_SVC_FN)DummySvclocFn; pfnTerminateSvcLoc = (INET_INIT_CONTROL_SVC_FN)DummySvclocFn; } // // rpcref // g_hRpcRef = LoadLibrary("rpcref.dll"); if ( g_hRpcRef != NULL ) { pfnInetinfoStartRpcServer = (PFN_INETINFO_START_RPC_SERVER) GetProcAddress(g_hRpcRef,"InetinfoStartRpcServerListen"); pfnInetinfoStopRpcServer = (PFN_INETINFO_STOP_RPC_SERVER) GetProcAddress(g_hRpcRef,"InetinfoStopRpcServerListen"); } else { DBGPRINTF((DBG_CONTEXT, "Error %d loading rpcref.dll\n", GetLastError() )); goto error_exit; } if ( !LoadNTSecurityEntryPoints( ) ) { goto error_exit; } return(TRUE); win95_only: g_hLonsiW95 = LoadLibrary( "lonsiw95.dll" ); if ( g_hLonsiW95 == NULL ) { DBGPRINTF((DBG_CONTEXT,"Error %d loading lonsiw95.dll\n", GetLastError())); goto error_exit; } // // kernel32 // pfnInterlockedExchangeAdd = (INTERLOCKED_EXCHANGE_ADD_FN) GetProcAddress(g_hLonsiW95,"FakeInterlockedExchangeAdd"); pfnInterlockedCompareExchange = (INTERLOCKED_COMPARE_EXCHANGE_FN) GetProcAddress(g_hLonsiW95,"FakeInterlockedCompareExchange"); pfnInterlockedIncrement = (INTERLOCKED_INCREMENT_FN) GetProcAddress(g_hLonsiW95,"FakeInterlockedIncrement"); pfnInterlockedDecrement = (INTERLOCKED_DECREMENT_FN) GetProcAddress(g_hLonsiW95,"FakeInterlockedDecrement"); if ( !pfnInterlockedExchangeAdd || !pfnInterlockedCompareExchange || !pfnInterlockedIncrement || !pfnInterlockedDecrement ) { DBGPRINTF((DBG_CONTEXT, "Unable to obtain Win95 kernel32 entry points\n")); goto error_exit; } // // svcloc // pfnInitSvcLoc = (INET_INIT_CONTROL_SVC_FN)DummySvclocFn; pfnTerminateSvcLoc = (INET_INIT_CONTROL_SVC_FN)DummySvclocFn; // // security/schannel/lsa // if ( !LoadW95SecurityEntryPoints( ) ) { goto error_exit; } return(TRUE); error_exit: return(FALSE); } // GetDynamicEntryPoints VOID FreeDynamicLibraries( VOID ) { if ( g_hSchannel != NULL ) { FreeLibrary( g_hSchannel ); g_hSchannel = NULL; } if ( g_hCrypt32Dll != NULL ) { FreeLibrary( g_hCrypt32Dll ); g_hCrypt32Dll = NULL; } if ( g_hSecurityDll != NULL ) { FreeLibrary( g_hSecurityDll ); g_hSecurityDll = NULL; } if ( g_hSvcLocDll != NULL ) { FreeLibrary( g_hSvcLocDll ); g_hSvcLocDll = NULL; } if ( g_hRpcRef != NULL ) { FreeLibrary( g_hRpcRef ); g_hRpcRef = NULL; } if ( g_hLonsiNT != NULL ) { FreeLibrary( g_hLonsiNT ); g_hLonsiNT = NULL; } if ( g_hLonsiW95 != NULL ) { FreeLibrary( g_hLonsiW95 ); g_hLonsiW95 = NULL; } return; } // FreeDynamicLibraries BOOL LoadNTSecurityEntryPoints( VOID ) { IF_DEBUG(DLL_SECURITY) { DBGPRINTF((DBG_CONTEXT,"Entering LoadNTSecurityEntryPoints\n")); } // // Load Schannel // g_hSchannel = LoadLibrary( "schannel.dll" ); if ( g_hSchannel != NULL ) { fnCrackCert = (SSL_CRACK_CERTIFICATE_FN) GetProcAddress( g_hSchannel, "SslCrackCertificate" ); fnFreeCert = (SSL_FREE_CERTIFICATE_FN) GetProcAddress( g_hSchannel, "SslFreeCertificate" ); } else { DBGPRINTF((DBG_CONTEXT, "Unable to load schannel.dll[err %d]\n", GetLastError() )); } // // Load Crypt32 // g_hCrypt32Dll = LoadLibrary( "crypt32.dll" ); if ( g_hCrypt32Dll != NULL ) { pfnFreeCertCtxt = (CRYPT32_FREE_CERTCTXT_FN) GetProcAddress( g_hCrypt32Dll, "CertFreeCertificateContext" ); pfnGetCertCtxtProp = (CRYPT32_GET_CERTCTXT_PROP_FN) GetProcAddress( g_hCrypt32Dll, "CertGetCertificateContextProperty" ); pfnCertVerifyRevocation = (CRYPT32_CERT_VERIFY_REVOCATION_FN) GetProcAddress( g_hCrypt32Dll, "CertVerifyRevocation" ); pfnCertVerifyTimeValidity = (CRYPT32_CERT_VERIFY_TIME_VALIDITY) GetProcAddress( g_hCrypt32Dll, "CertVerifyTimeValidity" ); pfnCertNameToStrA = (CRYPT32_CERT_NAME_TO_STR_A_FN) GetProcAddress( g_hCrypt32Dll, "CertNameToStrA" ); } else { DBGPRINTF((DBG_CONTEXT, "Unable to load crypt32.dll[err %d]\n", GetLastError() )); } DBG_ASSERT( pfnFreeCertCtxt ); DBG_ASSERT( pfnGetCertCtxtProp ); DBG_ASSERT( pfnCertVerifyRevocation ); DBG_ASSERT( pfnCertVerifyTimeValidity ); DBG_ASSERT( pfnCertNameToStrA ); // // Load security.dll // g_hSecurityDll = LoadLibrary( "security.dll" ); if ( g_hSecurityDll == NULL ) { DBGPRINTF((DBG_CONTEXT,"Error %d loading security.dll\n", GetLastError())); return(FALSE); } if ( !GetSecurityDllEntryPoints( g_hSecurityDll ) ) { return(FALSE); } // // Load lsa stuff from lonsint.dll // g_hLonsiNT = LoadLibrary( "lonsint.dll" ); if ( g_hLonsiNT == NULL ) { DBGPRINTF((DBG_CONTEXT,"Error %d loading lonsint.dll\n", GetLastError())); return(FALSE); } if ( !GetLogonDllEntryPoints( g_hLonsiNT ) ) { return FALSE; } return(TRUE); } // LoadNTSecurityEntryPoints BOOL LoadW95SecurityEntryPoints( VOID ) { IF_DEBUG(DLL_SECURITY) { DBGPRINTF((DBG_CONTEXT,"Entering LoadW95SecurityEntryPoints\n")); } // // Load Schannel // fnCrackCert = NULL; fnFreeCert = NULL; // // Load security.dll // DBG_ASSERT(g_hLonsiW95 != NULL); if ( !GetSecurityDllEntryPoints( g_hLonsiW95 ) ) { return(FALSE); } if ( !GetLogonDllEntryPoints( g_hLonsiW95 ) ) { return FALSE; } return(TRUE); } // LoadNTSecurityEntryPoints BOOL GetSecurityDllEntryPoints( IN HINSTANCE hInstance ) { pfnAcceptSecurityContext = (ACCEPT_SECURITY_CONTEXT_FN) GetProcAddress( hInstance, "AcceptSecurityContext" ); pfnAcquireCredentialsHandle = (ACQUIRE_CREDENTIALS_HANDLE_FN) GetProcAddress( hInstance, "AcquireCredentialsHandleA" ); pfnCompleteAuthToken = (COMPLETE_AUTH_TOKEN_FN) GetProcAddress( hInstance, "CompleteAuthToken" ); pfnDeleteSecurityContext = (DELETE_SECURITY_CONTEXT_FN) GetProcAddress( hInstance, "DeleteSecurityContext" ); pfnEnumerateSecurityPackages = (ENUMERATE_SECURITY_PACKAGES_FN) GetProcAddress( hInstance, "EnumerateSecurityPackagesA" ); pfnImpersonateSecurityContext = (IMPERSONATE_SECURITY_CONTEXT_FN) GetProcAddress( hInstance, "ImpersonateSecurityContext" ); pfnInitializeSecurityContext = (INITIALIZE_SECURITY_CONTEXT_FN) GetProcAddress( hInstance, "InitializeSecurityContextA" ); pfnFreeContextBuffer = (FREE_CONTEXT_BUFFER_FN) GetProcAddress( hInstance, "FreeContextBuffer" ); pfnFreeCredentialsHandle = (FREE_CREDENTIALS_HANDLE_FN) GetProcAddress( hInstance, "FreeCredentialsHandle" ); pfnQueryContextAttributes = (QUERY_CONTEXT_ATTRIBUTES_FN) GetProcAddress( hInstance, "QueryContextAttributesA" ); pfnQuerySecurityContextToken = (QUERY_SECURITY_CONTEXT_TOKEN_FN) GetProcAddress( hInstance, "QuerySecurityContextToken" ); pfnQuerySecurityPackageInfo = (QUERY_SECURITY_PACKAGE_INFO_FN) GetProcAddress( hInstance, "QuerySecurityPackageInfoA" ); pfnRevertSecurityContext = (REVERT_SECURITY_CONTEXT_FN) GetProcAddress( hInstance, "RevertSecurityContext" ); if ( !pfnAcceptSecurityContext || !pfnAcquireCredentialsHandle || !pfnCompleteAuthToken || !pfnDeleteSecurityContext || !pfnEnumerateSecurityPackages || !pfnImpersonateSecurityContext || !pfnInitializeSecurityContext || !pfnFreeContextBuffer || !pfnFreeCredentialsHandle || !pfnQueryContextAttributes || !pfnQuerySecurityContextToken || !pfnQuerySecurityPackageInfo || !pfnRevertSecurityContext ) { DBGPRINTF((DBG_CONTEXT,"Unable to get security entry points\n")); SetLastError(ERROR_PROC_NOT_FOUND); DBG_ASSERT(FALSE); return FALSE; } return(TRUE); } // GetSecurityDllEntryPoints BOOL GetLogonDllEntryPoints( IN HINSTANCE hInstance ) { pfnLogon32Initialize = (LOGON32_INITIALIZE_FN) GetProcAddress( hInstance, "IISLogon32Initialize" ); pfnLogonNetUserA = (LOGON_NET_USER_A_FN) GetProcAddress( hInstance, "IISLogonNetUserA" ); pfnLogonNetUserW = (LOGON_NET_USER_W_FN) GetProcAddress( hInstance, "IISLogonNetUserW" ); pfnNetUserCookieA = (NET_USER_COOKIE_A_FN) GetProcAddress( hInstance, "IISNetUserCookieA" ); pfnLogonDigestUserA = (LOGON_DIGEST_USER_A_FN) GetProcAddress( hInstance, "IISLogonDigestUserA" ); pfnGetDefaultDomainName = (GET_DEFAULT_DOMAIN_NAME_FN) GetProcAddress( hInstance, "IISGetDefaultDomainName" ); if ( !pfnLogon32Initialize || !pfnLogonNetUserA || !pfnLogonNetUserW || !pfnNetUserCookieA || !pfnLogonDigestUserA || !pfnGetDefaultDomainName ) { DBGPRINTF((DBG_CONTEXT,"Unable to get an entry point on lonsint.dll\n")); SetLastError( ERROR_PROC_NOT_FOUND ); DBG_ASSERT(FALSE); return FALSE; } return(TRUE); } // GetLogonDllEntryPoints #ifdef _NO_TRACING_ DWORD GetDebugFlagsFromReg(IN LPCTSTR pszRegEntry) { HKEY hkey = NULL; DWORD err; DWORD dwDebug = DEFAULT_DEBUG_FLAGS_VALUE; err = RegOpenKeyEx( HKEY_LOCAL_MACHINE, pszRegEntry, 0, KEY_READ, &hkey); if ( hkey != NULL) { DBG_CODE( dwDebug = LOAD_DEBUG_FLAGS_FROM_REG(hkey, DEFAULT_DEBUG_FLAGS_VALUE) ); RegCloseKey(hkey); } return ( dwDebug); } // GetDebugFlagsFromReg() #endif BOOL DummySvclocFn( VOID ) { return(TRUE); } // DummySvclocFn