307 lines
10 KiB
C
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);
|
||
|
}
|
||
|
}
|