/*++ Copyright (c) 2000 Microsoft Corporation Module Name: oemfolder.c Abstract: Create registry entries that identify the OEM folder using the data from WINBOM.INI file. Author: Sankar Ramasubramanian 11/21/2000 Revision History: Sankar 3/23/2001: Added support for Oem Branding link and Desktop Shortcuts folder. --*/ #include "factoryp.h" const TCHAR c_szOemBrandLinkText[] = _T("OemBrandLinkText"); const TCHAR c_szOemBrandLinkInfotip[] = _T("OemBrandLinkInfotip"); const TCHAR c_szOemBrandIcon[] = _T("OemBrandIcon"); const TCHAR c_szOemBrandLink[] = _T("OemBrandLink"); const TCHAR c_szDesktopShortcutsFolderName[]= _T("DesktopShortcutsFolderName"); const TCHAR c_szOemStartMenuData[] = _T("Software\\Microsoft\\Windows\\CurrentVersion\\OemStartMenuData"); const TCHAR c_szRegCLSIDKey[] = _T("CLSID\\{2559a1f6-21d7-11d4-bdaf-00c04f60b9f0}"); const TCHAR c_szSubKeyPropBag[] = _T("Instance\\InitPropertyBag"); const TCHAR c_szSubKeyDefIcon[] = _T("DefaultIcon"); const TCHAR c_szValNameInfoTip[] = _T("InfoTip"); const TCHAR c_szValNameParam1[] = _T("Param1"); const TCHAR c_szValNameCommand[] = _T("Command"); const TCHAR c_szRegShowOemLinkKey[] = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StartMenu\\StartPanel\\ShowOEMLink"); const TCHAR c_szValNoOemLink[] = _T("NoOEMLinkInstalled"); #define STR_0 _T("0") typedef struct { LPCTSTR pszSectionName; // Section Name in WinBom.ini file. LPCTSTR pszIniKeyName; // Key name under the section in WinBom.ini file. HKEY hkRoot; // HKEY_CLASSES_ROOT or HKEY_LOCAL_MACHINE LPCTSTR pszRegKey; // Reg Key value. LPCTSTR pszSubKey; // Subkey in registry. LPCTSTR pszRegValueName; // Value name under which it is saved in registry. DWORD dwValueType; // Registry Value type. BOOL fExpandSz; // Should we expand the string for environment variables? LPCTSTR pszLogFileText; // Information for the logfile. } OEM_STARTMENU_DATA; // // The following OemInfo[] table contains all the registry key, sub-key, value-name information // for a given oem data. // OEM_STARTMENU_DATA OemInfo[] = { { WBOM_OEMLINK_SECTION, c_szOemBrandLinkText, HKEY_CLASSES_ROOT, c_szRegCLSIDKey, NULL, NULL, REG_SZ, FALSE, _T("Oem Link's Text") }, { WBOM_OEMLINK_SECTION, c_szOemBrandLinkText, HKEY_CLASSES_ROOT, c_szRegCLSIDKey, c_szSubKeyPropBag, c_szValNameCommand, REG_SZ, FALSE, _T("Oem Link's Default Command") }, { WBOM_OEMLINK_SECTION, c_szOemBrandLinkInfotip, HKEY_CLASSES_ROOT, c_szRegCLSIDKey, NULL, c_szValNameInfoTip, REG_SZ, FALSE, _T("Oem Link's InfoTip text") }, { WBOM_OEMLINK_SECTION, c_szOemBrandIcon, HKEY_CLASSES_ROOT, c_szRegCLSIDKey, c_szSubKeyDefIcon, NULL, REG_EXPAND_SZ, TRUE, _T("Oem Link's Icon path") }, { WBOM_OEMLINK_SECTION, c_szOemBrandLink, HKEY_CLASSES_ROOT, c_szRegCLSIDKey, c_szSubKeyPropBag, c_szValNameParam1, REG_SZ, TRUE, _T("Oem Link's path to HTM file") }, { WBOM_DESKFLDR_SECTION, c_szDesktopShortcutsFolderName, HKEY_LOCAL_MACHINE, c_szOemStartMenuData, NULL, c_szDesktopShortcutsFolderName, REG_SZ, FALSE, _T("Desktop shortcuts cleanup Folder name") } }; // // Given an index into OemInfo[] table and the data, this function updates the proper registry // with the given data. // BOOL ProcessOemEntry(HKEY hOemDataKey, int iIndex, LPTSTR pszOemData) { HKEY hkSubKey = NULL; BOOL fSubKeyOpened = FALSE; BOOL fOemEntryEntered = FALSE; //See if we need to open a subkey under the given key. if(OemInfo[iIndex].pszSubKey) { //if so open the sub-key. if(ERROR_SUCCESS == RegCreateKeyEx(hOemDataKey, OemInfo[iIndex].pszSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE, NULL, &hkSubKey, NULL)) { fSubKeyOpened = TRUE; //Remember to close this sub-key before we return. } else hkSubKey = NULL; } else hkSubKey = hOemDataKey; if(*pszOemData == NULLCHR) { // BUG#441349: Sometimes factory.exe gets confused and runs with // a blank WINBOM.INI. So don't treat the absence of OEM data as // a cue to remove the OEM Link; otherwise we end up uninstalling // what got successfully installed by the previous factory run... fOemEntryEntered = FALSE; //No OEM data (this time) } else { LPTSTR psz; TCHAR szLocalStr[MAX_PATH+1]; psz = pszOemData; // Check if we need to expand the value for environment variables! if(OemInfo[iIndex].fExpandSz) { if(ExpandEnvironmentStrings((LPCTSTR)pszOemData, szLocalStr, ARRAYSIZE(szLocalStr))) psz = szLocalStr; } //Set the value of the "OEM Link" value. if ( (hkSubKey == NULL) || (ERROR_SUCCESS != RegSetValueEx(hkSubKey, OemInfo[iIndex].pszRegValueName, 0, OemInfo[iIndex].dwValueType, (LPBYTE) (psz), (lstrlen(psz)+1) * sizeof(TCHAR)))) { fOemEntryEntered = FALSE; //Error adding the entry! FacLogFile(0 | LOG_ERR, IDS_ERR_SET_OEMDATA, OemInfo[iIndex].pszLogFileText, psz); } else { fOemEntryEntered = TRUE; FacLogFile(2, IDS_SUCCESS_OEMDATA, OemInfo[iIndex].pszLogFileText, psz); } } if(fSubKeyOpened) // If we opened the sub-key earlier,.... RegCloseKey(hkSubKey); //... better close it before we return! return(fOemEntryEntered); //Return Successfully entered or deleted the entry! } // // This function creates the registry entries that specifies the Oem Link and the // Desktop Shortcuts Folder name. // BOOL OemData(LPSTATEDATA lpStateData) { LPTSTR lpszWinBOMPath = lpStateData->lpszWinBOMPath; HKEY hOemDataKey; int iIndex; BOOL fEnableOemLink = FALSE; //By default disable it! for(iIndex = 0; iIndex < ARRAYSIZE(OemInfo); iIndex++) { //Open the key under HKLM if (ERROR_SUCCESS == RegCreateKeyEx(OemInfo[iIndex].hkRoot, OemInfo[iIndex].pszRegKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE, NULL, &hOemDataKey, NULL)) { TCHAR szOemData[MAX_PATH]; BOOL fSuccess = FALSE; szOemData[0] = NULLCHR; GetPrivateProfileString(OemInfo[iIndex].pszSectionName, OemInfo[iIndex].pszIniKeyName, NULLSTR, szOemData, AS(szOemData), lpszWinBOMPath); fSuccess = ProcessOemEntry(hOemDataKey, iIndex, &szOemData[0]); //If we successfully added the "Command" for the OEM link, then ... if(fSuccess && (lstrcmpi(OemInfo[iIndex].pszRegValueName, c_szValNameCommand) == 0)) { //..We should enable the link in the registry! fEnableOemLink = TRUE; } RegCloseKey(hOemDataKey); } } // We enable the OEM link in the registry, only if we could successfully add the OemLink data // earlier. if(fEnableOemLink) { HKEY hKey; if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_LOCAL_MACHINE, c_szRegShowOemLinkKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE, NULL, &hKey, NULL)) { DWORD dwNoOemLink = 0; //Writing '0' to "NoOemLinkInstalled" will enable this! if(ERROR_SUCCESS != RegSetValueEx(hKey, c_szValNoOemLink, 0, REG_DWORD, (LPBYTE)(&dwNoOemLink), sizeof(dwNoOemLink))) { FacLogFile(0 | LOG_ERR, IDS_ERR_SET_OEMDATA, c_szValNoOemLink, STR_0); } else { FacLogFile(2, IDS_SUCCESS_OEMDATA, c_szValNoOemLink, STR_0); } RegCloseKey(hKey); // Now tell the Start Menu to pick up the new OEM link NotifyStartMenu(TMFACTORY_OEMLINK); } } return TRUE; } BOOL DisplayOemData(LPSTATEDATA lpStateData) { int iIndex; BOOL bRet = FALSE; for( iIndex = 0; ( iIndex < AS(OemInfo) ) && !bRet; iIndex++ ) { if ( IniSettingExists(lpStateData->lpszWinBOMPath, OemInfo[iIndex].pszSectionName, OemInfo[iIndex].pszIniKeyName, NULL) ) { bRet = TRUE; } } return bRet; } #define TM_FACTORY (WM_USER+0x103) void NotifyStartMenu(UINT code) { HWND hwnd = FindWindow(TEXT("Shell_TrayWnd"), NULL); if (hwnd) { SendMessage(hwnd, TM_FACTORY, code, 0); } }