windows-nt/Source/XPSP1/NT/base/ntsetup/opktools/factory/oemfolder.c
2020-09-26 16:20:57 +08:00

307 lines
10 KiB
C

/*++
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);
}
}