Windows-Server-2003/inetcore/setup/sdslib/crypto.c

195 lines
5.7 KiB
C

#include <windows.h>
#include <regstr.h>
#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;
}