// // PROGRAMS.CPP // #include "precomp.h" static BOOL importProgramsHelper(LPCTSTR pcszInsFile, LPCTSTR pcszWorkDir, BOOL fImport); BOOL WINAPI ImportProgramsA(LPCSTR pcszInsFile, LPCSTR pcszWorkDir, BOOL fImport) { USES_CONVERSION; return importProgramsHelper(A2CT(pcszInsFile), A2CT(pcszWorkDir), fImport); } BOOL WINAPI ImportProgramsW(LPCWSTR pcwszInsFile, LPCWSTR pcwszWorkDir, BOOL fImport) { USES_CONVERSION; return importProgramsHelper(W2CT(pcwszInsFile), W2CT(pcwszWorkDir), fImport); } void ExportProgram(HKEY hkClientKey, HANDLE hFile, LPCTSTR pcszProgramType) { HKEY hk; TCHAR szKey[MAX_PATH]; PathCombine(szKey, RK_CLIENT, pcszProgramType); if (SHOpenKey(hkClientKey, pcszProgramType, KEY_READ, &hk) == ERROR_SUCCESS) ExportRegValue2Inf(hk, NULL, TEXT("HKLM"), szKey, hFile); } void ExportHTMLEditor(HANDLE hFile, BOOL fHKLM) { HKEY hk; DWORD dwIndex, dwSize; TCHAR szSubKey[MAX_PATH]; if (fHKLM) { if (SHOpenKeyHKLM(RK_HTMLEDIT, KEY_DEFAULT_ACCESS, &hk) != ERROR_SUCCESS) return; } else { if (SHOpenKeyHKCU(RK_HTMLEDIT, KEY_DEFAULT_ACCESS, &hk) != ERROR_SUCCESS) return; } // this value is needed for the edit button and menu item in IE ExportRegValue2Inf(hk, TEXT("Description"), fHKLM ? TEXT("HKLM") : TEXT("HKCU"), RK_HTMLEDIT, hFile); dwIndex = 0; dwSize = ARRAYSIZE(szSubKey); while (RegEnumKeyEx(hk, dwIndex, szSubKey, &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { HKEY hkSub; TCHAR szKey[MAX_PATH]; PathCombine(szKey, RK_HTMLEDIT, szSubKey); if (SHOpenKey(hk, szSubKey, KEY_DEFAULT_ACCESS, &hkSub) == ERROR_SUCCESS) ExportRegTree2Inf(hkSub, fHKLM ? TEXT("HKLM") : TEXT("HKCU"), szKey, hFile, TRUE); dwSize = ARRAYSIZE(szSubKey); dwIndex++; } } static BOOL importProgramsHelper(LPCTSTR pcszInsFile, LPCTSTR pcszWorkDir, BOOL fImport) { HANDLE hFile; TCHAR szProgramsFile[MAX_PATH]; // clear out extreginf entry WritePrivateProfileString(EXTREGINF, IK_PROGRAMS, NULL, pcszInsFile); WritePrivateProfileString(IS_EXTREGINF_HKLM, IK_PROGRAMS, NULL, pcszInsFile); WritePrivateProfileString(IS_EXTREGINF_HKCU, IK_PROGRAMS, NULL, pcszInsFile); // clear any old inf out of working dir PathCombine(szProgramsFile, pcszWorkDir, TEXT("programs.inf")); DeleteFile(szProgramsFile); if (!fImport) return TRUE; if ((hFile = CreateNewFile(szProgramsFile)) != INVALID_HANDLE_VALUE) { TCHAR szBuf[MAX_PATH]; HKEY hkPrograms; WriteStringToFile(hFile, (LPCVOID) PROGRAMS_INF_ADD, StrLen(PROGRAMS_INF_ADD)); // do HKLM stuff first // export all defaults except for HTML editor which is in a different place if (SHOpenKeyHKLM(RK_CLIENT, KEY_READ, &hkPrograms) == ERROR_SUCCESS) { ExportProgram(hkPrograms, hFile, TEXT("Calendar")); ExportProgram(hkPrograms, hFile, TEXT("Contacts")); ExportProgram(hkPrograms, hFile, TEXT("Internet Call")); ExportProgram(hkPrograms, hFile, TEXT("Mail")); ExportProgram(hkPrograms, hFile, TEXT("News")); RegCloseKey(hkPrograms); } // need to look in both HKCU AND HKLM for html editor info ExportHTMLEditor(hFile, TRUE); // need to export mailto: protocol stuff in HKCR if (SHOpenKeyHKCR(TEXT("mailto"), KEY_READ, &hkPrograms) == ERROR_SUCCESS) { ExportRegTree2Inf(hkPrograms, TEXT("HKCR"), TEXT("mailto"), hFile, TRUE); RegCloseKey(hkPrograms); } // now do HKCU stuff WriteStringToFile(hFile, INF_IEAKADDREG_HKCU, StrLen(INF_IEAKADDREG_HKCU)); // whether or not to check if IE is default browser value if (SHOpenKeyHKCU(RK_IE_MAIN, KEY_READ, &hkPrograms) == ERROR_SUCCESS) { ExportRegValue2Inf(hkPrograms, TEXT("Check_Associations"), TEXT("HKCU"), RK_IE_MAIN, hFile); RegCloseKey(hkPrograms); } ExportHTMLEditor(hFile, FALSE); CloseHandle(hFile); wnsprintf(szBuf, ARRAYSIZE(szBuf), TEXT("*,%s,DefaultInstall"), PathFindFileName(szProgramsFile)); WritePrivateProfileString(EXTREGINF, IK_PROGRAMS, szBuf, pcszInsFile); if (!InsIsSectionEmpty(IS_IEAKADDREG_HKLM, szProgramsFile)) { wnsprintf(szBuf, ARRAYSIZE(szBuf), TEXT("*,%s,IEAKInstall.HKLM"), PathFindFileName(szProgramsFile)); WritePrivateProfileString(IS_EXTREGINF_HKLM, IK_PROGRAMS, szBuf, pcszInsFile); } if (!InsIsSectionEmpty(IS_IEAKADDREG_HKCU, szProgramsFile)) { wnsprintf(szBuf, ARRAYSIZE(szBuf), TEXT("*,%s,IEAKInstall.HKCU"), PathFindFileName(szProgramsFile)); WritePrivateProfileString(IS_EXTREGINF_HKCU, IK_PROGRAMS, szBuf, pcszInsFile); } return TRUE; } return FALSE; }