#include "stdafx.h" #include // 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; }