//+---------------------------------------------------------------------------- // // File: cmsafenet.cpp // // Module: CMDIAL32.DLL AND CMSTP.EXE // // Synopsis: This module contains the functions to allow Connection Manager to // interact with the SafeNet downlevel L2TP/IPSec client. // // Copyright (c) 1997-1999 Microsoft Corporation // // Author: quintinb created 09/10/01 // //+---------------------------------------------------------------------------- //+---------------------------------------------------------------------------- // // Function IsSafeNetClientAvailable // // Synopsis Check to see if the SafeNet L2TP client is installed // // Arguments None // // Returns TRUE - SafeNet L2TP client has been installed // FALSE - otherwise // // History 9/7/01 quintinb Created // //----------------------------------------------------------------------------- BOOL IsSafeNetClientAvailable(void) { BOOL bReturn = FALSE; // // More cmstp fixups... // #ifndef OS_NT4 CPlatform plat; if (plat.IsNT4() || plat.IsWin9x()) #else if (OS_NT4 || OS_W9X) #endif { // // If this isn't NT5+ then we need to look for the SafeNet // client. First look for the downlevel l2tp client version regkey. // HKEY hKey = NULL; LONG lResult = RegOpenKeyExU(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Microsoft IPsec VPN"), 0, KEY_READ, &hKey); if (ERROR_SUCCESS == lResult) { // // Okay, we have the regkey that is good enough to tell us the client // is available. We should further try linking to the SnPolicy.dll and // querying for a version of the API that we can live with, but this // is enough to tell us it is available. // RegCloseKey(hKey); bReturn = TRUE; } } return bReturn; } //+---------------------------------------------------------------------------- // // Function LinkToSafeNet // // Synopsis Loads the snpolicy.dll and calls the SnPolicyApiNegotiateVersion // API to get the SafeNet Config utility APIs. // // Arguments SafeNetLinkageStruct* pSnLinkage - struct to hold the SafeNet // function pointers. // // Returns TRUE - if the SafeNet L2TP config APIs were loaded // FALSE - otherwise // // History 9/7/01 quintinb Created // //----------------------------------------------------------------------------- BOOL LinkToSafeNet(SafeNetLinkageStruct* pSnLinkage) { if (NULL == pSnLinkage) { CMASSERTMSG(FALSE, TEXT("LinkToSafeNet -- NULL pointer passed for the SafeNetLinkageStruct")); return FALSE; } BOOL bReturn = FALSE; pSnLinkage->hSnPolicy = LoadLibraryA("snpolicy.dll"); if (pSnLinkage->hSnPolicy) { pfnSnPolicyApiNegotiateVersionSpec pfnSnPolicyApiNegotiateVersion = (pfnSnPolicyApiNegotiateVersionSpec)GetProcAddress(pSnLinkage->hSnPolicy, "SnPolicyApiNegotiateVersion"); if (pfnSnPolicyApiNegotiateVersion) { DWORD dwMajor = POLICY_MAJOR_VERSION; DWORD dwMinor = POLICY_MINOR_VERSION; POLICY_FUNCS_V1_0 PolicyFuncs = {0}; if (pfnSnPolicyApiNegotiateVersion(&dwMajor, &dwMinor, &PolicyFuncs)) { bReturn = (PolicyFuncs.SnPolicySet && PolicyFuncs.SnPolicyGet && PolicyFuncs.SnPolicyReload); if (bReturn) { pSnLinkage->pfnSnPolicySet = PolicyFuncs.SnPolicySet; pSnLinkage->pfnSnPolicyGet = PolicyFuncs.SnPolicyGet; pSnLinkage->pfnSnPolicyReload = PolicyFuncs.SnPolicyReload; } else { FreeLibrary(pSnLinkage->hSnPolicy); } } } } else { CMTRACE1(TEXT("LinkToSafeNet -- unable to load snpolicy.dll, GLE %d"), GetLastError()); } return bReturn; } //+---------------------------------------------------------------------------- // // Function UnLinkFromSafeNet // // Synopsis Unloads the SafeNet configuration dll and zeros the // passed in linkage structure. // // Arguments SafeNetLinkageStruct* pSnLinkage - struct to holding the SafeNet // linkage info. // // Returns Nothing // // History 9/7/01 quintinb Created // //----------------------------------------------------------------------------- void UnLinkFromSafeNet(SafeNetLinkageStruct* pSnLinkage) { if (pSnLinkage) { if (pSnLinkage->hSnPolicy) { FreeLibrary(pSnLinkage->hSnPolicy); } ZeroMemory(pSnLinkage, sizeof(SafeNetLinkageStruct)); } } //+---------------------------------------------------------------------------- // // Function GetPathToSafeNetLogFile // // Synopsis Returns the full path to the SafeNet log file by looking up the // SafeNet directory in the registry and appending the fixed log // file name. Note that this function allocates the memory for the // string which must be freed by the caller. // // Arguments None // // Returns Allocated buffer holding the full path to the SafeNet log file. // // History 9/7/01 quintinb Created // //----------------------------------------------------------------------------- LPTSTR GetPathToSafeNetLogFile(void) { HKEY hKey; LPTSTR pszLogFilePath = NULL; DWORD dwSize = 0; DWORD dwType; const TCHAR* const c_pszRegKeySafeNetProgramPaths = TEXT("SOFTWARE\\IRE\\SafeNet/Soft-PK\\ProgramPaths"); const TCHAR* const c_pszRegValueCertMgrPath = TEXT("CERTMGRPATH"); const TCHAR* const c_pszSafeNetLogFileName = TEXT("\\isakmp.log"); LONG lResult = RegOpenKeyExU(HKEY_LOCAL_MACHINE, c_pszRegKeySafeNetProgramPaths, 0, NULL, &hKey); if (ERROR_SUCCESS == lResult) { // // First let's figure out the size of the path buffer // lResult = RegQueryValueExU(hKey, c_pszRegValueCertMgrPath, NULL, &dwType, NULL, &dwSize); if ((ERROR_SUCCESS == lResult) && (dwSize > 0)) { // // Okay, we have the size of the path. Now add the size of the file onto it and allocate // the string buffer. // dwSize = dwSize + lstrlenU(c_pszSafeNetLogFileName); // dwSize already includes the NULL char dwSize *= sizeof(TCHAR); pszLogFilePath = (LPTSTR)CmMalloc(dwSize); if (pszLogFilePath) { lResult = RegQueryValueExU(hKey, c_pszRegValueCertMgrPath, NULL, &dwType, (BYTE*)pszLogFilePath, &dwSize); if (ERROR_SUCCESS == lResult) { lstrcatU(pszLogFilePath, c_pszSafeNetLogFileName); } else { CmFree(pszLogFilePath); pszLogFilePath = NULL; } } } RegCloseKey(hKey); } return pszLogFilePath; }