// // DESKTOP.CPP // #include "precomp.h" // prototype declarations static BOOL ImportADTInfoHelper(LPCTSTR pcszInsFile, LPCTSTR pcszDeskWorkDir, LPCTSTR pcszDeskInf, BOOL fImportADT); static BOOL ImportDesktopComps(LPCTSTR pcszInsFile, LPCTSTR pcszDeskWorkDir, LPCTSTR pcszDeskInf, BOOL fImportADTComps); static BOOL ImportWallpaperInfo(LPCTSTR pcszInsFile, LPCTSTR pcszWallpaperWorkDir, BOOL fImportWallpaper); static BOOL RunningOnWin98(); BOOL WINAPI ImportADTInfoA(LPCSTR pcszInsFile, LPCSTR pcszDeskWorkDir, LPCSTR pcszDeskInf, BOOL fImportADT) { USES_CONVERSION; return ImportADTInfoHelper(A2CT(pcszInsFile), A2CT(pcszDeskWorkDir), A2CT(pcszDeskInf), fImportADT); } BOOL WINAPI ImportADTInfoW(LPCWSTR pcwszInsFile, LPCWSTR pcwszDeskWorkDir, LPCWSTR pcwszDeskInf, BOOL fImportADT) { USES_CONVERSION; return ImportADTInfoHelper(W2CT((LPWSTR)pcwszInsFile), W2CT((LPWSTR)pcwszDeskWorkDir), W2CT((LPWSTR)pcwszDeskInf), fImportADT); } BOOL WINAPI ShowDeskCpl(VOID) { BOOL bRet = FALSE; HKEY hkPol; DWORD dwOldScrSav = 0, dwOldAppearance = 0, dwOldSettings = 0; // display desk.cpl (right-click->properties on the desktop) but hide the ScreenSaver, Appearance and Settings // tabs by setting their corresponding reg values to 1 if (RegCreateKeyEx(HKEY_CURRENT_USER, REGSTR_PATH_POLICIES TEXT("\\") REGSTR_KEY_SYSTEM, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_DEFAULT_ACCESS, NULL, &hkPol, NULL) == ERROR_SUCCESS) { DWORD dwData = 1; DWORD cbSize; // save the old values before setting them to 1 cbSize = sizeof(dwOldScrSav); RegQueryValueEx(hkPol, REGSTR_VAL_DISPCPL_NOSCRSAVPAGE, NULL, NULL, (LPBYTE) &dwOldScrSav, &cbSize); RegSetValueEx(hkPol, REGSTR_VAL_DISPCPL_NOSCRSAVPAGE, 0, REG_DWORD, (CONST BYTE *) &dwData, sizeof(dwData)); cbSize = sizeof(dwOldAppearance); RegQueryValueEx(hkPol, REGSTR_VAL_DISPCPL_NOAPPEARANCEPAGE, NULL, NULL, (LPBYTE) &dwOldAppearance, &cbSize); RegSetValueEx(hkPol, REGSTR_VAL_DISPCPL_NOAPPEARANCEPAGE, 0, REG_DWORD, (CONST BYTE *) &dwData, sizeof(dwData)); cbSize = sizeof(dwOldSettings); RegQueryValueEx(hkPol, REGSTR_VAL_DISPCPL_NOSETTINGSPAGE, NULL, NULL, (LPBYTE) &dwOldSettings, &cbSize); // if we are running on Win98, because of a bug in desk.cpl, if all the restrictions for the tabs in Display properties // are set to 1, the Web tab doesn't show up. Workaround for this bug is to not set the SettingsPage to 1. if (!IsOS(OS_MEMPHIS)) RegSetValueEx(hkPol, REGSTR_VAL_DISPCPL_NOSETTINGSPAGE, 0, REG_DWORD, (CONST BYTE *) &dwData, sizeof(dwData)); RegCloseKey(hkPol); } bRet = RunAndWaitA("rundll32.exe shell32.dll,Control_RunDLL desk.cpl", NULL, SW_SHOW); // restore the original values if (RegCreateKeyEx(HKEY_CURRENT_USER, REGSTR_PATH_POLICIES TEXT("\\") REGSTR_KEY_SYSTEM, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_DEFAULT_ACCESS, NULL, &hkPol, NULL) == ERROR_SUCCESS) { RegSetValueEx(hkPol, REGSTR_VAL_DISPCPL_NOSCRSAVPAGE, 0, REG_DWORD, (CONST BYTE *) &dwOldScrSav, sizeof(dwOldScrSav)); RegSetValueEx(hkPol, REGSTR_VAL_DISPCPL_NOAPPEARANCEPAGE, 0, REG_DWORD, (CONST BYTE *) &dwOldAppearance, sizeof(dwOldAppearance)); RegSetValueEx(hkPol, REGSTR_VAL_DISPCPL_NOSETTINGSPAGE, 0, REG_DWORD, (CONST BYTE *) &dwOldSettings, sizeof(dwOldSettings)); RegCloseKey(hkPol); } return bRet; } static BOOL ImportADTInfoHelper(LPCTSTR pcszInsFile, LPCTSTR pcszDeskWorkDir, LPCTSTR pcszDeskInf, BOOL fImportADT) { BOOL bRet = TRUE; if (pcszInsFile == NULL || pcszDeskWorkDir == NULL || pcszDeskInf == NULL) return FALSE; bRet = ImportDesktopComps(pcszInsFile, pcszDeskWorkDir, pcszDeskInf, fImportADT) && bRet; bRet = ImportWallpaperInfo(pcszInsFile, pcszDeskWorkDir, fImportADT) && bRet; return bRet; } static BOOL ImportDesktopComps(LPCTSTR pcszInsFile, LPCTSTR pcszDeskWorkDir, LPCTSTR pcszDeskInf, BOOL fImportADTComps) { BOOL bRet = FALSE; HKEY hkDesk; // Before processing anything, first clear out the entries in the INS file and delete work dirs // clear out the entries in the INS file that correspond to importing Active Desktop components InsWriteBool(DESKTOP_OBJ_SECT, IMPORT_DESKTOP, FALSE, pcszInsFile); InsWriteString(EXTREGINF, DESKTOP, NULL, pcszInsFile); // blow away the pcszDeskWorkDir and pcszDeskInf PathRemovePath(pcszDeskWorkDir); PathRemovePath(pcszDeskInf); if (!fImportADTComps) return TRUE; InsWriteBool(DESKTOP_OBJ_SECT, IMPORT_DESKTOP, TRUE, pcszInsFile); // Import the Active Desktop components if (RegOpenKeyEx(HKEY_CURRENT_USER, KEY_DESKTOP_COMP, 0, KEY_DEFAULT_ACCESS, &hkDesk) == ERROR_SUCCESS) { TCHAR szFullInfName[MAX_PATH]; HANDLE hInf; if (PathIsFileSpec(pcszDeskInf)) // create DESKTOP.INF under pcszDeskWorkDir PathCombine(szFullInfName, pcszDeskWorkDir, pcszDeskInf); else StrCpy(szFullInfName, pcszDeskInf); // create DESKTOP.INF file if ((hInf = CreateNewFile(szFullInfName)) != INVALID_HANDLE_VALUE) { DWORD dwType, dwOldGeneralFlags, dwGeneralFlags, cbSize; TCHAR szSubKey[MAX_PATH]; DWORD dwIndex, cchSize; BOOL fUpdateIns = FALSE; dwOldGeneralFlags = 0; cbSize = sizeof(dwOldGeneralFlags); RegQueryValueEx(hkDesk, GEN_FLAGS, NULL, &dwType, (LPBYTE) &dwOldGeneralFlags, &cbSize); dwGeneralFlags = dwOldGeneralFlags | RD_DIRTY; RegSetValueEx(hkDesk, GEN_FLAGS, 0, dwType, (CONST BYTE *) &dwGeneralFlags, sizeof(dwGeneralFlags)); // first, write the standard goo - [Version], [DefaultInstall], etc. - to DESKTOP.INF WriteStringToFile(hInf, (LPCVOID) DESK_INF_ADD, StrLen(DESK_INF_ADD)); ExportRegKey2Inf(hkDesk, TEXT("HKCU"), KEY_DESKTOP_COMP, hInf); WriteStringToFile(hInf, (LPCVOID) TEXT("\r\n"), 2); // restore the original value for GEN_FLAGS RegSetValueEx(hkDesk, GEN_FLAGS, 0, dwType, (CONST BYTE *) &dwOldGeneralFlags, sizeof(dwOldGeneralFlags)); // for each desktop component that's enumerated, spit out its information to DESKTOP.INF and // if it's a local file, copy it to pcszDeskWorkDir for (dwIndex = 0, cchSize = ARRAYSIZE(szSubKey); RegEnumKeyEx(hkDesk, dwIndex, szSubKey, &cchSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS; dwIndex++, cchSize = ARRAYSIZE(szSubKey)) { HKEY hkSub; if (RegOpenKeyEx(hkDesk, szSubKey, 0, KEY_DEFAULT_ACCESS, &hkSub) == ERROR_SUCCESS) { TCHAR szDeskCompFile[MAX_URL]; TCHAR szFullSubkey[MAX_PATH]; BOOL fRestoreSource = FALSE; // get the name of the component from SOURCE *szDeskCompFile = TEXT('\0'); cbSize = sizeof(szDeskCompFile); RegQueryValueEx(hkSub, SOURCE, NULL, NULL, (LPBYTE) szDeskCompFile, &cbSize); if (PathIsLocalPath(szDeskCompFile) && PathFileExists(szDeskCompFile) && !PathIsDirectory(szDeskCompFile)) { // During branding time, all the local files get copied into the // "\web" dir; so temporarily set the SOURCE in the registry // to point to this location before it's exported to DESKTOP.INF if (CopyFileToDir(szDeskCompFile, pcszDeskWorkDir)) { TCHAR szNewPath[MAX_URL]; // if the file is a .htm file, then copy all the IMG SRC's specified in it to pcszDeskWorkDir if (PathIsExtension(szDeskCompFile, TEXT(".htm")) || PathIsExtension(szDeskCompFile, TEXT(".html"))) CopyHtmlImgs(szDeskCompFile, pcszDeskWorkDir, NULL, NULL); wnsprintf(szNewPath, ARRAYSIZE(szNewPath), TEXT("%%25%%\\Web\\%s"), PathFindFileName(szDeskCompFile)); fRestoreSource = TRUE; RegSetValueEx(hkSub, SOURCE, 0, REG_SZ, (CONST BYTE *)szNewPath, (DWORD)StrCbFromSz(szNewPath)); RegSetValueEx(hkSub, SUBSCRIBEDURL, 0, REG_SZ, (CONST BYTE *)szNewPath, (DWORD)StrCbFromSz(szNewPath)); } } // dump the registry info for this component to DESKTOP.INF wnsprintf(szFullSubkey, ARRAYSIZE(szFullSubkey), TEXT("%s\\%s"), KEY_DESKTOP_COMP, szSubKey); ExportRegKey2Inf(hkSub, TEXT("HKCU"), szFullSubkey, hInf); WriteStringToFile(hInf, (LPCVOID) TEXT("\r\n"), 2); fUpdateIns = TRUE; if (fRestoreSource) { RegSetValueEx(hkSub, SOURCE, 0, REG_SZ, (CONST BYTE *)szDeskCompFile, (DWORD)StrCbFromSz(szDeskCompFile)); RegSetValueEx(hkSub, SUBSCRIBEDURL, 0, REG_SZ, (CONST BYTE *)szDeskCompFile, (DWORD)StrCbFromSz(szDeskCompFile)); } RegCloseKey(hkSub); } } CloseFile(hInf); if (fUpdateIns) { TCHAR szBuf[MAX_PATH]; // update the INS file wnsprintf(szBuf, ARRAYSIZE(szBuf), TEXT("*,%s,DefaultInstall"), PathFindFileName(pcszDeskInf)); WritePrivateProfileString(EXTREGINF, DESKTOP, szBuf, pcszInsFile); bRet = TRUE; } else { PathRemovePath(pcszDeskWorkDir); PathRemovePath(szFullInfName); } } RegCloseKey(hkDesk); } return bRet; } static BOOL ImportWallpaperInfo(LPCTSTR pcszInsFile, LPCTSTR pcszWallpaperWorkDir, BOOL fImportWallpaper) { BOOL bRet = FALSE; HKEY hkDesk; // Before processing anything, first clear out the entries in the INS file // delete the WALLPAPER section in the INS file WritePrivateProfileString(WALLPAPER, NULL, NULL, pcszInsFile); if (!fImportWallpaper) return TRUE; // Import the wallpaper information if (RegOpenKeyEx(HKEY_CURRENT_USER, KEY_DESKTOP_GEN, 0, KEY_DEFAULT_ACCESS, &hkDesk) == ERROR_SUCCESS) { DWORD cbSize; TCHAR szWallpaperFile[MAX_PATH]; *szWallpaperFile = TEXT('\0'); cbSize = sizeof(szWallpaperFile); if (RegQueryValueEx(hkDesk, WALLPAPER, NULL, NULL, (LPBYTE) szWallpaperFile, &cbSize) != ERROR_SUCCESS || *szWallpaperFile == TEXT('\0')) { // try reading the information from BACKUPWALLPAPER cbSize = sizeof(szWallpaperFile); RegQueryValueEx(hkDesk, BACKUPWALLPAPER, NULL, NULL, (LPBYTE) szWallpaperFile, &cbSize); } // During branding time, all the wallpaper files specified in the INS file will // get copied into whatever dir that's specified in the registry or if not found, // into "\web\wallpaper" // BUGBUG: even if szWallpaperFile points to a UNC or network path, we will still copy the files // to pcszWallpaperWorkDir and during branding time, would get copied into the client's machine if (CopyFileToDirEx(szWallpaperFile, pcszWallpaperWorkDir, WALLPAPER, pcszInsFile)) { TCHAR szBuf[16]; DWORD dwPos = 0; // if the file is a local .htm file, then copy all the IMG SRC's specified in it to pcszWallpaperWorkDir if (PathIsExtension(szWallpaperFile, TEXT(".htm")) || PathIsExtension(szWallpaperFile, TEXT(".htm"))) CopyHtmlImgs(szWallpaperFile, pcszWallpaperWorkDir, WALLPAPER, pcszInsFile); cbSize = sizeof(dwPos); RegQueryValueEx(hkDesk, COMPONENTPOS, NULL, NULL, (LPBYTE) &dwPos, &cbSize); wnsprintf(szBuf, ARRAYSIZE(szBuf), TEXT("%lu"), dwPos); // update the INS file WritePrivateProfileString(DESKTOP_OBJ_SECT, OPTION, TEXT("1"), pcszInsFile); WritePrivateProfileString(WALLPAPER, COMPONENTPOS, szBuf, pcszInsFile); bRet = TRUE; } RegCloseKey(hkDesk); } return bRet; }