//+---------------------------------------------------------------------------- // // File: util.cpp // // Module: CMMGR32.EXE // // Synopsis: Utility functions for cmmgr32.exe // // Copyright (c) 1998-1999 Microsoft Corporation // // Author: quintinb created Header 08/16/99 // //+---------------------------------------------------------------------------- #include "cmmaster.h" //+---------------------------------------------------------------------------- // // Function GetProfileInfo // // Synopsis get the service name from cms // // // Arguments pszCmpName the cmp file name. Can be in one of the following // 3 formats: // // 1. relative paths without the extension(e.g. msn, cm\msn) // 2. relative path with the extension(e.g. msn.cmp, cm\msn.cmp) // 3. full path(e.g. c:\cm\msn.cmp) // // pszServiceName the output buffer for the service name(ServiceName). // must be at least RAS_MaxEntryName. // // Returns BOOL TRUE=success, FALSE=failure // //----------------------------------------------------------------------------- BOOL GetProfileInfo( LPTSTR pszCmpName, LPTSTR pszServiceName ) { LPTSTR pszTmp; LPTSTR pszDot; LPTSTR pszSlash; LPTSTR pszColon; TCHAR szFileName[MAX_PATH + 1]; TCHAR szCmsFile[MAX_PATH + 1]; TCHAR szPath[MAX_PATH + 1]; lstrcpynU(szFileName, pszCmpName, sizeof(szFileName)/sizeof(TCHAR)-1); pszDot = CmStrrchr(szFileName, TEXT('.')); pszSlash = CmStrrchr(szFileName, TEXT('\\')); pszColon = CmStrrchr(szFileName, TEXT(':')); if ((pszSlash >= pszDot) && (pszColon >= pszDot)) { // // The argument doesn't have an extension, so we'll include one. // lstrcatU(szFileName, TEXT(".cmp")); } // // We need to change our current dir to read the profiles. // If we found a slash, it's either a UNC path, relative path, or // a full path. Use it to set the current dir. Otherwise use we // assume that the profile is local and use the application path. // if (pszSlash) { *pszSlash = TEXT('\0'); MYVERIFY(SetCurrentDirectoryU(szFileName)); // // restore the slash // *pszSlash = TEXT('\\'); } else { // // Assumes its local, use app path for current dir // TCHAR szCurrent[MAX_PATH]; if (GetModuleFileNameU(NULL, szCurrent, MAX_PATH - 1)) { pszSlash = CmStrrchr(szCurrent, TEXT('\\')); MYDBGASSERT(pszSlash); if (pszSlash) { *pszSlash = TEXT('\0'); MYVERIFY(SetCurrentDirectoryU(szCurrent)); } } } // // test whether this is a valid cmp // if (SearchPathU(NULL, szFileName, NULL, MAX_PATH, szPath, &pszTmp)) { BOOL bReturn = FALSE; // // szPath should now be a full path. // // // first get the CMS file path from the cmp file. // GetPrivateProfileStringU(c_pszCmSection, c_pszCmEntryCmsFile, TEXT(""), szCmsFile, MAX_PATH, szPath); // // construct the cms file path. the cms file path obtained from the cmp file // is a relative path. // pszTmp = CmStrrchr(szPath, TEXT('\\')); if (NULL != pszTmp) { // // Move past the '\\' // pszTmp = CharNextU(pszTmp); if (NULL != pszTmp) { lstrcpyU(pszTmp, szCmsFile); GetPrivateProfileStringU(c_pszCmSection, c_pszCmEntryServiceName, TEXT(""), pszServiceName, MAX_PATH, szPath); // // If the .cms file doesn't exist or is corrupt // the value of pszService will be "" // if (TEXT('\0') != *pszServiceName) { bReturn = TRUE; } } } return bReturn; } else { // // there isn't much we can do here // *pszServiceName = TEXT('\0'); return FALSE; } } //+---------------------------------------------------------------------------- // // Function IsCmpPathAllUser // // Synopsis If this function is executed on NT5, then it checks to see if // the passed in CMP file path has the users APP_DATA directory as // part of the path. If so, then it considers the profile to be // single user. Otherwise it returns that the profile is all user. // If the function encounters an error it returns that the profile // is all user (that is considered the default case). // // // Arguments pszCmp the cmp file name // // Returns BOOL TRUE == All User Profile, FALSE == Single User profile // // History quintinb Created 05/12/99 // //----------------------------------------------------------------------------- BOOL IsCmpPathAllUser(LPCTSTR pszCmp) { BOOL bReturn = TRUE; // // If we get an invalid input parameter then just assume that it is // All User. On the other hand, if the OS isn't NT5, then we are // All User so there is no need to check the path. If we are on // NT5 and the beginning of the cmp path matches the users // Application data dir, then we have a single user profile and // should return false. // if ((NULL != pszCmp) && (TEXT('\0') != pszCmp[0]) && OS_NT5) { // // Load shell32 here so that we can call the shell to find out // the path to the Application Data directory. // typedef HRESULT (WINAPI *pfnSHGetSpecialFolderLocationSpec)(HWND, int, LPITEMIDLIST*); typedef BOOL (WINAPI *pfnSHGetPathFromIDListSpec)(LPCITEMIDLIST, LPTSTR); typedef HRESULT (WINAPI *pfnSHGetMallocSpec)(LPMALLOC *); pfnSHGetSpecialFolderLocationSpec pfnSHGetSpecialFolderLocation; pfnSHGetMallocSpec pfnSHGetMalloc; pfnSHGetPathFromIDListSpec pfnSHGetPathFromIDList; HMODULE hShell32 = LoadLibraryExA("Shell32.dll", NULL, 0); if (hShell32) { pfnSHGetSpecialFolderLocation = (pfnSHGetSpecialFolderLocationSpec)GetProcAddress(hShell32, "SHGetSpecialFolderLocation"); pfnSHGetMalloc = (pfnSHGetMallocSpec)GetProcAddress(hShell32, "SHGetMalloc"); #ifdef UNICODE pfnSHGetPathFromIDList = (pfnSHGetPathFromIDListSpec)GetProcAddress(hShell32, "SHGetPathFromIDListW"); #else pfnSHGetPathFromIDList = (pfnSHGetPathFromIDListSpec)GetProcAddress(hShell32, "SHGetPathFromIDListA"); #endif if (pfnSHGetSpecialFolderLocation && pfnSHGetPathFromIDList && pfnSHGetMalloc) { LPITEMIDLIST pidl; TCHAR szAppDataDir[MAX_PATH+1]; TCHAR szTemp[MAX_PATH+1]; HRESULT hr = pfnSHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl); if (SUCCEEDED(hr)) { if (pfnSHGetPathFromIDList(pidl, szAppDataDir)) { UINT uiLen = lstrlenU(szAppDataDir) + 1; lstrcpynU(szTemp, pszCmp, uiLen); if (0 == lstrcmpiU(szAppDataDir, szTemp)) { bReturn = FALSE; } } LPMALLOC pMalloc; if (SUCCEEDED(pfnSHGetMalloc(&pMalloc))) { pMalloc->Free(pidl); MYVERIFY(SUCCEEDED(pMalloc->Release())); } } } FreeLibrary(hShell32); } } // // Figure out what the user directory of the current user is. We can compare this // against the directory of the phonebook and see if we have a private user // profile or an all user profile. return bReturn; }