#include #include #include "sdsutils.h" const char c_szUNINSTALLDAT[]="ie6bak.dat"; const char c_szUNINSTALLINI[] = "ie6bak.ini"; const char c_szIE4SECTIONNAME[] = "backup"; const char c_szIE4_OPTIONS[] = "Software\\Microsoft\\IE Setup\\Options"; const char c_szIE4_UNINSTALLDIR[] = "UninstallDir"; // the following functions are stolen from ie4.dll BOOL FileVerGreaterOrEqual(LPSTR lpszFileName, DWORD dwReqMSVer, DWORD dwReqLSVer) { DWORD dwMSVer, dwLSVer; MyGetVersionFromFile(lpszFileName, &dwMSVer, &dwLSVer, TRUE); return ((dwMSVer > dwReqMSVer) || ((dwMSVer == dwReqMSVer) && (dwLSVer >= dwReqLSVer))); } void BuildPath( char *szPath, const char *szDirPath, const char *szFileName ) { lstrcpy( szPath, szDirPath ); AddPath( szPath, szFileName ); } ULONG FileSize( LPSTR lpFile ) { ULONG ulFileSize = (ULONG) -1; WIN32_FIND_DATA FindFileData; HANDLE hFile; if ( lpFile == NULL || *lpFile == 0 ) return ulFileSize; if ((hFile = FindFirstFile( lpFile, &FindFileData )) != INVALID_HANDLE_VALUE) { ulFileSize = (FindFileData.nFileSizeHigh * MAXDWORD) + FindFileData.nFileSizeLow; FindClose( hFile ); } return ulFileSize; } BOOL ValidateUninstallFiles(LPSTR lpszPath) { HKEY hKey; DWORD dwType; DWORD dwValue; DWORD dwSize; char szTmp[MAX_PATH]; BOOL bValidFiles = FALSE; if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, c_szIE4_OPTIONS, 0, KEY_READ, &hKey)) { dwSize = sizeof(dwValue); if ( RegQueryValueEx(hKey, c_szUNINSTALLDAT, NULL, &dwType, (LPBYTE)&dwValue, &dwSize) == ERROR_SUCCESS ) { BuildPath(szTmp, lpszPath, c_szUNINSTALLDAT); if (dwType == REG_DWORD) bValidFiles = (dwValue == FileSize(szTmp)); } if (bValidFiles) { dwSize = sizeof(dwValue); if ( RegQueryValueEx(hKey, c_szUNINSTALLINI, NULL, &dwType, (LPBYTE)&dwValue, &dwSize) == ERROR_SUCCESS ) { BuildPath(szTmp, lpszPath, c_szUNINSTALLINI); if (dwType == REG_DWORD) bValidFiles = (dwValue == FileSize(szTmp)); } } RegCloseKey(hKey); } return bValidFiles; } BOOL GetUninstallDirFromReg(LPSTR lpszUninstallDir) { HKEY hKey; DWORD dwType; char szValue[MAX_PATH]; DWORD dwSize = MAX_PATH; *szValue = '\0'; if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, c_szIE4_OPTIONS, 0, KEY_READ, &hKey)) { if ( RegQueryValueEx(hKey, c_szIE4_UNINSTALLDIR, NULL, &dwType, (LPBYTE) szValue, &dwSize) == ERROR_SUCCESS ) { if (lpszUninstallDir) lstrcpy (lpszUninstallDir, szValue); } RegCloseKey(hKey); } return (*szValue != '\0'); } BOOL FileBackupEntryExists(LPCSTR lpcszFileName) { BOOL bRet = FALSE; char szPath[MAX_PATH]; if (GetUninstallDirFromReg(szPath) && ValidateUninstallFiles(szPath)) { char szPath[MAX_PATH]; // Get backup directory from registry if (GetUninstallDirFromReg(szPath)) { DWORD dwSaveAttribs; char szLine[MAX_PATH]; AddPath(szPath, c_szUNINSTALLINI); // c_szUNINSTALLINI has HR attribs set; GetPrivateProfileString might fail because of HR attribs. // set the attribs to normal and restore the original attribs at the end dwSaveAttribs = GetFileAttributes(szPath); SetFileAttributes(szPath, FILE_ATTRIBUTE_NORMAL); bRet = (GetPrivateProfileString(c_szIE4SECTIONNAME, lpcszFileName, "", szLine, sizeof(szLine), szPath) != 0); if (dwSaveAttribs != (DWORD) -1) SetFileAttributes(szPath, dwSaveAttribs); } } return bRet; } #define REGSTR_CCS_CONTROL_WINDOWS REGSTR_PATH_CURRENT_CONTROL_SET "\\WINDOWS" #define CSDVERSION "CSDVersion" #define NTSP6_VERSION 0x0600 // version updated to SP6! BOOL CheckForNT4_SP6() { HKEY hKey; DWORD dwCSDVersion; DWORD dwSize; static BOOL bNTSP6 = -1; if ( bNTSP6 == -1) { if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGSTR_CCS_CONTROL_WINDOWS, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { // assign the default bNTSP6 = FALSE; dwSize = sizeof(dwCSDVersion); if (RegQueryValueEx(hKey, CSDVERSION, NULL, NULL, (unsigned char*)&dwCSDVersion, &dwSize) == ERROR_SUCCESS) { bNTSP6 = (LOWORD(dwCSDVersion) >= NTSP6_VERSION); } RegCloseKey(hKey); } } return bNTSP6; } #define SP4_CRYPT32_DLL_MAJOR_VER 0x00050083 // 5.131 #define SP4_CRYPT32_DLL_MINOR_VER 0x07550005 // 1877.5 = SP6 level BOOL FSP4LevelCryptoInstalled() { static BOOL bSP4LevelCryptoInstalled = 2; if (bSP4LevelCryptoInstalled == 2) { OSVERSIONINFO VerInfo; bSP4LevelCryptoInstalled = FALSE; VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&VerInfo); if (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) { char szCrypt32DLL[MAX_PATH]; GetSystemDirectory(szCrypt32DLL, sizeof(szCrypt32DLL)); AddPath(szCrypt32DLL, "crypt32.dll"); // we have to distinguish the case when a user is upgrading or reinstalling IE5; in this case, // backup entry for crypt32.dll would exist in ie5bak.ini and bSP4LevelCryptoInstalled should be set to FALSE if (VerInfo.dwMajorVersion >= 5 || CheckForNT4_SP6() || (FileVerGreaterOrEqual(szCrypt32DLL, SP4_CRYPT32_DLL_MAJOR_VER, SP4_CRYPT32_DLL_MINOR_VER) && !FileBackupEntryExists(szCrypt32DLL))) bSP4LevelCryptoInstalled = TRUE; } } return bSP4LevelCryptoInstalled; }