|
|
#include "stdafx.h"
#include <LMCONS.H> // 97/07/22 vtan: for UNLEN
#pragma hdrstop
BOOL OnUpgradeDisableActiveDesktopFeatures();
void CreateMyCurHomeComponent(BOOL fChecked) { // If there is a policy to prevent adding desktop components, then we should not attempt to add.
// Otherwise, a new user gets an error message when they login for the first time.
// Bug #21300 -- Fixed on 2/28/2001 -- Sankar
if (SHRestricted(REST_NOADDDESKCOMP)) return; //Add the base components!
TCHAR szBuf[MAX_PATH]; ISubscriptionMgr * psm;
// Add a component that points to "about:home"
LoadString(HINST_THISDLL, IDS_MY_CURRENT_HOMEPAGE, szBuf, ARRAYSIZE(szBuf));
// 98/07/14 vtan #176721: Changed the following to pass default component
// positions to AddRemoveDesktopComponentNoUI so that the restored position may
// be set to the default component position.
AddRemoveDesktopComponentNoUI(TRUE, AD_APPLY_SAVE, MY_HOMEPAGE_SOURCE, szBuf, COMP_TYPE_WEBSITE, COMPONENT_DEFAULT_LEFT, COMPONENT_DEFAULT_TOP, COMPONENT_DEFAULT_WIDTH, COMPONENT_DEFAULT_HEIGHT, fChecked, IS_SPLIT); if (SUCCEEDED(CoCreateInstance(CLSID_SubscriptionMgr, NULL, CLSCTX_INPROC_SERVER, IID_ISubscriptionMgr, (void**)&psm))) { WCHAR wszName[MAX_PATH]; //We need to zero init this structure except the cbSize field.
SUBSCRIPTIONINFO siDefault = {sizeof(SUBSCRIPTIONINFO)};
SHTCharToUnicode(szBuf, wszName, ARRAYSIZE(wszName));
//This field is already initialized above.
//siDefault.cbSize = sizeof(siDefault);
psm->CreateSubscription(NULL, MY_HOMEPAGE_SOURCEW, wszName, CREATESUBS_NOUI, SUBSTYPE_DESKTOPURL, &siDefault); psm->Release(); } }
STDAPI CDeskHtmlProp_RegUnReg(BOOL bReg) { HKEY hKey; DWORD userNameSize; TCHAR szDeskcomp[MAX_PATH]; TCHAR userName[UNLEN];
// 98/07/22 vtan #202707: Problem: This code gets called for the first time when NT
// runs. This sets up the default user profile. Anything that is added to this profile
// is propagated to any current user when upgrading from NT 4.0 to NT 5.0. This
// causes the DeskHtmlVersion, DeskHtmlMinorVersion and Component\0 to be replaced
// with the default component. By replacing the version registry entries any old
// components will not get correctly upgraded by the component reading code. It also
// destroys the first component.
// Solution: Prevent a default component being added at setup time by checking the
// logged on user is "SYSTEM". If the user is anybody other than system then perform
// the update or addition of the default component.
userNameSize = ARRAYSIZE(userName); if ((GetUserName(userName, &userNameSize) != 0) && (lstrcmp(userName, TEXT("SYSTEM")) == 0)) return(S_OK); // an ungracious exit right here and now!
if(bReg) { DWORD dwDisposition; DWORD dwDeskHtmlVersion = 0; DWORD dwDeskHtmlMinorVersion = 0; DWORD dwType;
GetRegLocation(szDeskcomp, ARRAYSIZE(szDeskcomp), REG_DESKCOMP_COMPONENTS, NULL);
if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_CURRENT_USER, szDeskcomp, 0, NULL, 0, KEY_CREATE_SUB_KEY|KEY_QUERY_VALUE, NULL, &hKey, &dwDisposition)) { //Get the version stamp from the registry
if(dwDisposition == REG_OPENED_EXISTING_KEY) { DWORD dwDataLength = sizeof(DWORD); SHQueryValueEx(hKey, REG_VAL_COMP_VERSION, NULL, &dwType, (LPBYTE)(&dwDeskHtmlVersion), &dwDataLength); SHQueryValueEx(hKey, REG_VAL_COMP_MINOR_VERSION, NULL, &dwType, (LPBYTE)(&dwDeskHtmlMinorVersion), &dwDataLength); }
//We need to close this key before we delete it
RegCloseKey(hKey);
// If this branch is already there, don't set default comp.
// Note: The differences between IE4_DESKHTML_VERSION and CUR_DESKHTML_VERSION are
// automatically taken care of when we read the components. So, we need to check only
// for very old versions here.
if (dwDeskHtmlVersion < IE4_DESKHTML_VERSION) { //Delete the existing components.
SHDeleteKey(HKEY_CURRENT_USER, szDeskcomp);
// Create the default active desktop configuration
if(RegCreateKeyEx(HKEY_CURRENT_USER, szDeskcomp, 0, NULL, 0, (KEY_CREATE_SUB_KEY | KEY_SET_VALUE), NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) { //We need an initial state
DWORD dw;
dw = CUR_DESKHTML_VERSION; RegSetValueEx(hKey, REG_VAL_COMP_VERSION, 0, REG_DWORD, (LPBYTE)&dw, sizeof(dw));
dw = CUR_DESKHTML_MINOR_VERSION; RegSetValueEx(hKey, REG_VAL_COMP_MINOR_VERSION, 0, REG_DWORD, (LPBYTE)&dw, sizeof(dw)); dw = COMPSETTING_ENABLE; RegSetValueEx(hKey, REG_VAL_COMP_SETTINGS, 0, REG_DWORD, (LPBYTE)&dw, sizeof(dw));
//Add the home page component
CreateMyCurHomeComponent(FALSE); //For millennium we want to disable the component.
RegCloseKey(hKey); }
// Create the default active desktop safemode configuration
if(RegCreateKeyEx(HKEY_CURRENT_USER, REG_DESKCOMP_SAFEMODE, 0, NULL, 0, KEY_CREATE_SUB_KEY, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) { DWORD dwDisposition; HKEY hKey2;
if(RegCreateKeyEx(hKey, REG_DESKCOMP_GENERAL_SUFFIX, 0, NULL, 0, (KEY_CREATE_SUB_KEY | KEY_SET_VALUE), NULL, &hKey2, &dwDisposition) == ERROR_SUCCESS) { TCHAR szSafeMode[MAX_PATH]; GetWindowsDirectory(szSafeMode, ARRAYSIZE(szSafeMode));
HRESULT hr = StringCchCat(szSafeMode, ARRAYSIZE(szSafeMode), DESKTOPHTML_DEFAULT_SAFEMODE); if (SUCCEEDED(hr)) { // Show safemode.htx
SHRegSetPath(hKey2, NULL, REG_VAL_GENERAL_WALLPAPER, szSafeMode, 0); // Don't bring up the gallery dialog box
dwDisposition = 0; RegSetValueEx(hKey2, REG_VAL_GENERAL_VISITGALLERY, 0, REG_DWORD, (LPBYTE)&dwDisposition, sizeof(dwDisposition)); } RegCloseKey(hKey2); } RegCloseKey(hKey); }
// Create the default scheme key
if(RegCreateKeyEx(HKEY_CURRENT_USER, REG_DESKCOMP_SCHEME, 0, NULL, 0, (KEY_CREATE_SUB_KEY | KEY_SET_VALUE), NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) { RegSetValueEx(hKey, REG_VAL_SCHEME_EDIT, 0, REG_SZ, (LPBYTE)TEXT(""), sizeof(TCHAR)); RegSetValueEx(hKey, REG_VAL_SCHEME_DISPLAY, 0, REG_SZ, (LPBYTE)TEXT(""), sizeof(TCHAR)); RegCloseKey(hKey); }
// Set the components to be dirty sothat we re-generate desktop.htm
// the first boot after installing IE4.0.
SetDesktopFlags(COMPONENTS_DIRTY, COMPONENTS_DIRTY);
GetRegLocation(szDeskcomp, ARRAYSIZE(szDeskcomp), REG_DESKCOMP_GENERAL, NULL); if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_CURRENT_USER, szDeskcomp, 0, NULL, 0, KEY_CREATE_SUB_KEY, NULL, &hKey, &dwDisposition)) { RegCloseKey(hKey); } } else { //See if we are upgrading from an older version like IE4.
if (dwDeskHtmlVersion < CUR_DESKHTML_VERSION) { // If so, save the DESKHTML_VERSION we are upgrading from.
// We use this later in SHGetSetSettings to decide if active desktop is ON/OFF.
// NOTE: The "UpgradedFrom" value is at "...\Desktop" and NOT at "..\Desktop\Components"
// This is because the "Components" key gets destroyed very often.
SHSetValue(HKEY_CURRENT_USER, REG_DESKCOMP, REG_VAL_COMP_UPGRADED_FROM, REG_DWORD, (LPBYTE)&dwDeskHtmlVersion, sizeof(dwDeskHtmlVersion)); } // The major version numbers match. So check if the minor version numbers
// match too!
if(dwDeskHtmlMinorVersion < CUR_DESKHTML_MINOR_VERSION) { //Update the new Minor version number!
if(RegCreateKeyEx(HKEY_CURRENT_USER, szDeskcomp, 0, NULL, 0, (KEY_CREATE_SUB_KEY | KEY_SET_VALUE), NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) { DWORD dw; dw = CUR_DESKHTML_MINOR_VERSION; RegSetValueEx(hKey, REG_VAL_COMP_MINOR_VERSION, 0, REG_DWORD, (LPBYTE)&dw, sizeof(dw)); RegCloseKey(hKey); } // Add the new home page component
if((dwDeskHtmlVersion <= 0x10f) && (dwDeskHtmlMinorVersion <= 0x0001)) CreateMyCurHomeComponent(FALSE);
//
// If this is an upgrade from W2K or earlier, we need to check if the
// active desktop is OFF. If so, we need to turn off all the desktop components
// sothat the active desktop continues to be OFF.
if((dwDeskHtmlVersion <= NT5_DESKHTML_VERSION) && (dwDeskHtmlMinorVersion <= NT5_DESKHTML_MINOR_VERSION)) { OnUpgradeDisableActiveDesktopFeatures(); } // Minor version numbers do not match. So, set the dirty bit to force
// the regeneration of desktop.htt later when needed.
SetDesktopFlags(COMPONENTS_DIRTY, COMPONENTS_DIRTY);
// 98/07/16 vtan #176721/#202707: Added the following code to delete HKCU\Software\ // Microsoft\Internet Explorer\Desktop\General\ComponentsPositioned because in NT 4.0
// with IE 4.0 SP1 this registry entry is incorrectly incremented when the components
// are iterated rather than when they are positioned. This resets the counter
// in NT 5.0 where the bug has been fixed.
DWORD dw; GetRegLocation(szDeskcomp, ARRAYSIZE(szDeskcomp), REG_DESKCOMP_GENERAL, NULL); if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_CURRENT_USER, szDeskcomp, 0, NULL, 0, KEY_SET_VALUE, NULL, &hKey, &dw)) { (LONG)RegDeleteValue(hKey, REG_VAL_GENERAL_CCOMPPOS); (LONG)RegCloseKey(hKey); } } } } } else { SHDeleteKey(HKEY_LOCAL_MACHINE, c_szRegDeskHtmlProp); SHDeleteKey(HKEY_CURRENT_USER, REG_DESKCOMP_COMPONENTS_ROOT); SHDeleteKey(HKEY_CURRENT_USER, REG_DESKCOMP_GENERAL_ROOT); SHDeleteKey(HKEY_CURRENT_USER, REG_DESKCOMP_SAFEMODE); SHDeleteKey(HKEY_CURRENT_USER, REG_DESKCOMP_SCHEME); }
return S_OK; }
|