You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
458 lines
12 KiB
458 lines
12 KiB
//=--------------------------------------------------------------------------=
|
|
// iodver.cpp
|
|
//=--------------------------------------------------------------------------=
|
|
// Copyright 1997-1998 Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
//
|
|
//
|
|
|
|
#include "string.h"
|
|
#include "pch.h"
|
|
#include "advpub.h"
|
|
#include "iesetup.h"
|
|
#include <inetreg.h>
|
|
#include <shlwapi.h>
|
|
#include <wininet.h>
|
|
|
|
WINUSERAPI HWND WINAPI GetShellWindow(void);
|
|
|
|
HINSTANCE g_hInstance = NULL;
|
|
|
|
STDAPI_(BOOL) DllMain(HANDLE hDll, DWORD dwReason, void *lpReserved)
|
|
{
|
|
DWORD dwThreadID;
|
|
|
|
switch(dwReason)
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
g_hInstance = (HINSTANCE)hDll;
|
|
break;
|
|
|
|
case DLL_PROCESS_DETACH:
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
STDAPI DllRegisterServer(void)
|
|
{
|
|
// BUGBUG: pass back return from RegInstall ?
|
|
RegInstall(g_hInstance, "DllReg", NULL);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDAPI DllUnregisterServer(void)
|
|
{
|
|
RegInstall(g_hInstance, "DllUnreg", NULL);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
BOOL IsWinNT4()
|
|
{
|
|
OSVERSIONINFO VerInfo;
|
|
VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
|
GetVersionEx(&VerInfo);
|
|
|
|
if (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
|
|
{
|
|
return (VerInfo.dwMajorVersion == 4) ;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL IsWinXP()
|
|
{
|
|
OSVERSIONINFO VerInfo;
|
|
VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
|
GetVersionEx(&VerInfo);
|
|
|
|
if (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
|
|
{
|
|
return (VerInfo.dwMajorVersion > 5) ||
|
|
(VerInfo.dwMajorVersion == 5 && VerInfo.dwMinorVersion >= 1);
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
STDAPI DllInstall(BOOL bInstall, LPCWSTR lpCmdLine)
|
|
{
|
|
// BUGBUG: pass back return from RegInstall ?
|
|
if (bInstall)
|
|
{
|
|
RegInstall(g_hInstance, "DllUninstall", NULL);
|
|
if(IsWinNT4())
|
|
RegInstall(g_hInstance, "DllInstall.NT4Only", NULL);
|
|
else if(IsWinXP())
|
|
RegInstall(g_hInstance, "DllInstall.WinXP", NULL);
|
|
else
|
|
RegInstall(g_hInstance, "DllInstall", NULL);
|
|
}
|
|
else
|
|
RegInstall(g_hInstance, "DllUninstall", NULL);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
const TCHAR * const szAdvPack = TEXT("advpack.dll");
|
|
const TCHAR * const szExecuteCab = TEXT("ExecuteCab");
|
|
const TCHAR * const szKeyComponentAdmin = TEXT("Software\\Microsoft\\Active Setup\\Installed Components\\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}");
|
|
const TCHAR * const szKeyComponentUser = TEXT("Software\\Microsoft\\Active Setup\\Installed Components\\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}");
|
|
char szSectionHardenAdmin[] = "IEHardenAdmin";
|
|
char szSectionSoftenAdmin[] = "IESoftenAdmin";
|
|
char szSectionHardenUser[] = "IEHardenUser";
|
|
char szSectionSoftenUser[] = "IESoftenUser";
|
|
char szSectionHardenMachine[] = "IEHardenMachine";
|
|
char szSectionSoftenMachine[] = "IESoftenMachine";
|
|
const TCHAR * const szLocale = TEXT("Locale");
|
|
const TCHAR * const szVersion = TEXT("Version");
|
|
|
|
//Copy data from HKLM to HKCU
|
|
HRESULT CopyRegValue(LPCTSTR szSubKey, LPCTSTR szValue)
|
|
{
|
|
BYTE buffer[128];
|
|
HKEY hKeyDst = NULL, hKeySrc = NULL;
|
|
HRESULT hResult;
|
|
DWORD dwSize = sizeof(buffer);
|
|
|
|
hResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSubKey, 0, KEY_QUERY_VALUE, &hKeySrc);
|
|
if (FAILED(hResult))
|
|
goto Cleanup;
|
|
|
|
hResult = RegQueryValueEx(hKeySrc, szValue, NULL, NULL, (LPBYTE)buffer, &dwSize);
|
|
if (FAILED(hResult))
|
|
goto Cleanup;
|
|
|
|
hResult = RegCreateKeyEx(HKEY_CURRENT_USER, szSubKey, 0, NULL,
|
|
REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKeyDst, NULL);
|
|
if (FAILED(hResult))
|
|
goto Cleanup;
|
|
|
|
hResult = RegSetValueEx(hKeyDst, szValue, NULL, REG_SZ, (CONST BYTE *)buffer, dwSize);
|
|
|
|
Cleanup:
|
|
if (hKeySrc)
|
|
RegCloseKey(hKeySrc);
|
|
|
|
if (hKeyDst)
|
|
RegCloseKey(hKeyDst);
|
|
|
|
return hResult;
|
|
}
|
|
|
|
BOOL IsNtSetupRunning()
|
|
{
|
|
HKEY hKey;
|
|
long lRes = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"system\\Setup",
|
|
0, KEY_READ, &hKey);
|
|
if(lRes)
|
|
return false;
|
|
|
|
DWORD dwSetupRunning;
|
|
DWORD dwLen = sizeof(DWORD);
|
|
lRes = RegQueryValueExW(hKey, L"SystemSetupInProgress", NULL, NULL,
|
|
(LPBYTE)&dwSetupRunning, &dwLen);
|
|
RegCloseKey(hKey);
|
|
|
|
if(lRes == ERROR_SUCCESS && (dwSetupRunning == 1))
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// Return value: 1: Installed. 0: Uninstalled. -1: Not installed (component does not exist in registry)
|
|
int IsInstalled(const TCHAR * const szKeyComponent)
|
|
{
|
|
const TCHAR *szIsInstalled = TEXT("IsInstalled");
|
|
int bInstalled = -1;
|
|
DWORD dwValue, dwSize;
|
|
HKEY hKey;
|
|
|
|
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyComponent, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
|
|
{
|
|
dwSize = sizeof(dwValue);
|
|
if (RegQueryValueEx( hKey, szIsInstalled, NULL, NULL, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS)
|
|
{
|
|
dwValue = 0;
|
|
}
|
|
bInstalled = (dwValue != 0);
|
|
|
|
RegCloseKey(hKey);
|
|
}
|
|
//else Not installed.
|
|
|
|
return bInstalled;
|
|
}
|
|
|
|
//Get the inf file from system32 and run this section
|
|
HRESULT RunInfSection(const char * const szInfFile, const char * const szSection)
|
|
{
|
|
CABINFO CabInfo;
|
|
char szInfPathName[MAX_PATH];
|
|
HRESULT hResult;
|
|
|
|
memset(&CabInfo, 0, sizeof(CabInfo));
|
|
|
|
GetSystemDirectory(szInfPathName, sizeof(szInfPathName));
|
|
AddPath(szInfPathName, szInfFile);
|
|
CabInfo.pszInf = szInfPathName;
|
|
CabInfo.dwFlags = ALINF_QUIET;
|
|
CabInfo.pszSection = (PSTR)szSection;
|
|
|
|
hResult = ExecuteCab(NULL, &CabInfo, NULL);
|
|
|
|
return hResult;
|
|
}
|
|
|
|
HRESULT RunPerUserInfSection(char * szSection)
|
|
{
|
|
HRESULT hResult;
|
|
|
|
hResult = RunInfSection("ieuinit.inf", szSection);
|
|
|
|
return hResult;
|
|
}
|
|
|
|
const char * const szRegValueDefaultHomepage = "Default_Page_URL";
|
|
|
|
void GetOEMDefaultPageURL(LPTSTR szURL, DWORD cbData)
|
|
{
|
|
const TCHAR * const szIEDefaultPageURL = "http://www.microsoft.com/isapi/redir.dll?prd=ie&pver=6&ar=msnhome";
|
|
const TCHAR * const szIEStartPage = "http://www.microsoft.com/isapi/redir.dll?prd={SUB_PRD}&clcid={SUB_CLSID}&pver={SUB_PVER}&ar=home";
|
|
|
|
szURL[0] = 0;
|
|
if (ERROR_SUCCESS == SHRegGetUSValue(REGSTR_PATH_MAIN, szRegValueDefaultHomepage, NULL,
|
|
(LPVOID)szURL, &cbData, TRUE, NULL, NULL))
|
|
{
|
|
if (0 == StrCmpI(szURL, szIEDefaultPageURL))
|
|
{
|
|
//Ignore the default page url set by in.inf
|
|
szURL[0] = 0;
|
|
}
|
|
}
|
|
|
|
if (szURL[0] == 0)
|
|
{
|
|
if (ERROR_SUCCESS == SHRegGetUSValue(REGSTR_PATH_MAIN, REGSTR_VAL_STARTPAGE, NULL,
|
|
(LPVOID)szURL, &cbData, TRUE, NULL, NULL))
|
|
{
|
|
if (0 == StrCmpI(szURL, szIEStartPage))
|
|
{
|
|
//Ignore the start page url set by shdocvw.dll selfreg.inf
|
|
szURL[0] = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
//Set IE Hardening hompage, when there is no OEM customized default homepage URL.
|
|
HRESULT SetIEHardeningHomepage()
|
|
{
|
|
const char * const szHomePageFileName = "homepage.inf";
|
|
HRESULT hResult = S_OK;
|
|
TCHAR szOEMHomepage[INTERNET_MAX_URL_LENGTH] = "";
|
|
DWORD cbOEMHomepage;
|
|
|
|
cbOEMHomepage = sizeof(szOEMHomepage);
|
|
GetOEMDefaultPageURL(szOEMHomepage, cbOEMHomepage);
|
|
|
|
if (szOEMHomepage[0])
|
|
{
|
|
return hResult;
|
|
}
|
|
|
|
if (IsNTAdmin(0, NULL))
|
|
{
|
|
switch (IsInstalled(szKeyComponentAdmin))
|
|
{
|
|
case 1:
|
|
hResult = RunInfSection(szHomePageFileName, "Install.HardenAdmin");
|
|
break;
|
|
case 0:
|
|
hResult = RunInfSection(szHomePageFileName, "Install.SoftenAdmin");
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch (IsInstalled(szKeyComponentUser))
|
|
{
|
|
case 1:
|
|
hResult = RunInfSection(szHomePageFileName, "Install.HardenUser");
|
|
break;
|
|
case 0:
|
|
hResult = RunInfSection(szHomePageFileName, "Install.SoftenUser");
|
|
break;
|
|
}
|
|
}
|
|
|
|
return hResult;
|
|
}
|
|
|
|
//Set the homepage for IE peruser stub
|
|
HRESULT WINAPI SetFirstHomepage()
|
|
{
|
|
HRESULT hResult = S_OK;
|
|
TCHAR szOEMHomepage[INTERNET_MAX_URL_LENGTH] = "";
|
|
DWORD cbOEMHomepage;
|
|
HKEY hKey;
|
|
|
|
cbOEMHomepage = sizeof(szOEMHomepage);
|
|
GetOEMDefaultPageURL(szOEMHomepage, cbOEMHomepage);
|
|
|
|
if (szOEMHomepage[0])
|
|
{
|
|
//Delete the Default_Page_URL in HKCU
|
|
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER, REGSTR_PATH_MAIN, 0, KEY_SET_VALUE, &hKey))
|
|
{
|
|
RegDeleteValue(hKey, szRegValueDefaultHomepage);
|
|
RegCloseKey(hKey);
|
|
}
|
|
|
|
hResult = S_OK;
|
|
}
|
|
else
|
|
{
|
|
hResult = SetIEHardeningHomepage();
|
|
}
|
|
|
|
return hResult;
|
|
}
|
|
|
|
// Forward declaration:
|
|
HRESULT WINAPI IEHardenMachineNow(HWND, HINSTANCE, PSTR pszCmd, INT);
|
|
|
|
HRESULT WINAPI IEHardenAdmin(HWND, HINSTANCE, PSTR pszCmd, INT)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if (IsNTAdmin(0, NULL))
|
|
{
|
|
switch (IsInstalled(szKeyComponentAdmin))
|
|
{
|
|
case 1:
|
|
if(SUCCEEDED(hr = RunPerUserInfSection(szSectionHardenAdmin)))
|
|
{
|
|
// Harden the machine:
|
|
hr = IEHardenMachineNow(NULL, NULL, "i", 0);
|
|
}
|
|
break;
|
|
case 0:
|
|
if(SUCCEEDED(hr = RunPerUserInfSection(szSectionSoftenAdmin)))
|
|
{
|
|
// Soften the machine only if both user and admin are softened:
|
|
hr = IEHardenMachineNow(NULL, NULL, "u", 0);
|
|
}
|
|
|
|
break;
|
|
default:
|
|
hr = E_FAIL;
|
|
}
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = SetIEHardeningHomepage();
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT WINAPI IEHardenAdminNow(HWND, HINSTANCE, PSTR, INT)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
if (!IsNtSetupRunning())
|
|
{
|
|
hr = IEHardenAdmin(NULL, NULL, NULL, 0);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
CopyRegValue(szKeyComponentAdmin, szLocale);
|
|
CopyRegValue(szKeyComponentAdmin, szVersion);
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT WINAPI IEHardenUser(HWND, HINSTANCE, PSTR pszCmd, INT)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if (!IsNTAdmin(0, NULL))
|
|
{
|
|
switch (IsInstalled(szKeyComponentUser))
|
|
{
|
|
case 1:
|
|
hr = RunPerUserInfSection(szSectionHardenUser);
|
|
break;
|
|
case 0:
|
|
hr = RunPerUserInfSection(szSectionSoftenUser);
|
|
break;
|
|
default:
|
|
hr = E_FAIL;
|
|
}
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = SetIEHardeningHomepage();
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT WINAPI IEHardenMachineNow(HWND, HINSTANCE, PSTR pszCmd, INT)
|
|
{
|
|
HRESULT hr = E_INVALIDARG;
|
|
|
|
// Set per-machine inetcpl default settings according to user, not admin
|
|
// Requires the command line because this may run during NT setup.
|
|
|
|
if (pszCmd)
|
|
{
|
|
//Install or Uninstall
|
|
if (pszCmd[0] == 'i' || pszCmd[0] == 'I')
|
|
hr = RunPerUserInfSection(szSectionHardenMachine);
|
|
else if (pszCmd[0] == 'u' || pszCmd[0] == 'U')
|
|
{
|
|
// Soften the machine only if both user and admin are softened:
|
|
if (1 != IsInstalled(szKeyComponentAdmin) && 1 != IsInstalled(szKeyComponentUser))
|
|
hr = RunPerUserInfSection(szSectionSoftenMachine);
|
|
else
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// CRT stubs
|
|
//=--------------------------------------------------------------------------=
|
|
// these two things are here so the CRTs aren't needed. this is good.
|
|
//
|
|
// basically, the CRTs define this to pull in a bunch of stuff. we'll just
|
|
// define them here so we don't get an unresolved external.
|
|
//
|
|
// TODO: if you are going to use the CRTs, then remove this line.
|
|
//
|
|
extern "C" int _fltused = 1;
|
|
|
|
extern "C" int _cdecl _purecall(void)
|
|
{
|
|
// FAIL("Pure virtual function called.");
|
|
return 0;
|
|
}
|
|
|
|
#ifndef _X86_
|
|
extern "C" void _fpmath() {}
|
|
#endif
|
|
|