Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1949 lines
62 KiB

/**************************************************************************
Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
MODULE: REGCFG.CPP
PURPOSE: Source module reading/writing PM config sets from the registry
FUNCTIONS:
COMMENTS:
**************************************************************************/
/**************************************************************************
Include Files
**************************************************************************/
#include "pmcfg.h"
#include "keycrypto.h"
// Reg Keys/values that we care about
TCHAR g_szPassportReg[] = TEXT("Software\\Microsoft\\Passport");
TCHAR g_szPassportPartner[] = TEXT("Software\\Microsoft\\Passport\\Nexus\\Partner");
TCHAR g_szPassportEnvironments[] = TEXT("Software\\Microsoft\\Passport\\Environments");
TCHAR g_szEncryptionKeyData[] = TEXT("KeyData");
TCHAR g_szKeyTimes[] = TEXT("KeyTimes");
TCHAR g_szNexus[] = TEXT("Nexus");
TCHAR g_szPartner[] = TEXT("Partner");
TCHAR g_szInstallDir[] = TEXT("InstallDir");
TCHAR g_szVersion[] = TEXT("Version");
TCHAR g_szTimeWindow[] = TEXT("TimeWindow");
TCHAR g_szForceSignIn[] = TEXT("ForceSignIn");
TCHAR g_szNSRefresh[] = TEXT("NSRefresh");
TCHAR g_szLanguageID[] = TEXT("LanguageID");
TCHAR g_szCoBrandTemplate[] = TEXT("CoBrandTemplate");
TCHAR g_szSiteID[] = TEXT("SiteID");
TCHAR g_szReturnURL[] = TEXT("ReturnURL");
TCHAR g_szTicketDomain[] = TEXT("TicketDomain");
TCHAR g_szTicketPath[] = TEXT("TicketPath");
TCHAR g_szProfileDomain[] = TEXT("ProfileDomain");
TCHAR g_szProfilePath[] = TEXT("ProfilePath");
TCHAR g_szSecureDomain[] = TEXT("SecureDomain");
TCHAR g_szSecurePath[] = TEXT("SecurePath");
TCHAR g_szCurrentKey[] = TEXT("CurrentKey");
TCHAR g_szStandAlone[] = TEXT("StandAlone");
TCHAR g_szDisableCookies[] = TEXT("DisableCookies");
TCHAR g_szDisasterURL[] = TEXT("DisasterURL");
TCHAR g_szHostName[] = TEXT("HostName");
TCHAR g_szHostIP[] = TEXT("HostIP");
//JVP 3/2/2000
TCHAR g_szVerboseMode[] = TEXT("Verbose");
TCHAR g_szEnvName[] = TEXT("Environment");
TCHAR g_szRemoteFile[] = TEXT("CCDRemoteFile");
TCHAR g_szLocalFile[] = TEXT("CCDLocalFile");
TCHAR g_szVersion14[] = TEXT("1.4");
TCHAR g_szSecureLevel[] = TEXT("SecureLevel");
#define REG_PASSPORT_SITES_VALUE TEXT("Software\\Microsoft\\Passport\\Sites")
#define REG_PASSPORT_SITES_LEN (sizeof(REG_PASSPORT_SITES_VALUE) / sizeof(TCHAR) - 1)
#define REG_CLOSE_KEY_NULL(a) { if ((a) != NULL) { RegCloseKey(a); (a) = NULL; } }
// -------------------------------------------------------------------------------
//
//
// -------------------------------------------------------------------------------
BOOL WriteGlobalConfigSettings(HWND hWndDlg, HKEY hklm, LPPMSETTINGS lpPMConfig, LPTSTR lpszRemoteComputer)
{
HKEY hkeyPassport = NULL, hkeyPassportSubKey = NULL;
long lRet;
BOOL bReturn = FALSE;
TCHAR szConfigName[MAX_CONFIGSETNAME];
TCHAR szTmpBuf[REG_PASSPORT_SITES_LEN + 1 + MAX_CONFIGSETNAME + 1] = REG_PASSPORT_SITES_VALUE;
ULONG nConfigNameSize = MAX_CONFIGSETNAME;
FILETIME ftime;
long nCurrentSubKey;
// First, open the keys for the default set
//
if ((lRet = RegOpenKeyEx(hklm, g_szPassportReg, 0, KEY_ALL_ACCESS, &hkeyPassport)) != ERROR_SUCCESS)
{
LPVOID lpMsgBuf;
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
lRet,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL) != 0)
{
TCHAR pszTitle[MAX_RESOURCE];
// Display the string
LoadString(g_hInst, IDS_ERROR, pszTitle, DIMENSION(pszTitle));
MessageBox( NULL, (LPCTSTR)lpMsgBuf, pszTitle, MB_OK | MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
}
bReturn = FALSE;
goto Cleanup;
}
// Write the value for NSRefresh
RegSetValueEx(hkeyPassport,
g_szNSRefresh,
NULL,
REG_DWORD,
(LPBYTE)&lpPMConfig->dwEnableManualRefresh,
sizeof(DWORD));
// Write the environment
RegSetValueEx(hkeyPassport,
g_szEnvName,
NULL,
REG_SZ,
(LPBYTE)lpPMConfig->szEnvName,
(lstrlen(lpPMConfig->szEnvName) + 1) * sizeof(TCHAR));
RegCloseKey(hkeyPassport);
hkeyPassport = NULL;
// If the "Sites" key was not found, then there are no Sites to configure
//
if ((lRet = RegOpenKeyEx(hklm,
REG_PASSPORT_SITES_VALUE,
0,
KEY_ALL_ACCESS,
&hkeyPassport)) != ERROR_SUCCESS)
{
bReturn = TRUE;
goto Cleanup;
}
nCurrentSubKey = 0;
while (lRet = RegEnumKeyEx(hkeyPassport,
nCurrentSubKey++,
szConfigName,
&nConfigNameSize,
NULL,
NULL,
NULL,
&ftime) == ERROR_SUCCESS)
{
*(szTmpBuf + REG_PASSPORT_SITES_LEN) = _T('\\');
*(szTmpBuf + REG_PASSPORT_SITES_LEN + 1) = _T('\0');
_tcscat(szTmpBuf + REG_PASSPORT_SITES_LEN + 1, szConfigName);
if ((lRet = RegOpenKeyEx(hklm,
szTmpBuf,
0,
KEY_ALL_ACCESS,
&hkeyPassportSubKey)) != ERROR_SUCCESS)
{
ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
bReturn = FALSE;
goto Cleanup;
}
// Write the value for NSRefresh
RegSetValueEx(hkeyPassportSubKey,
g_szNSRefresh,
NULL,
REG_DWORD,
(LPBYTE) &lpPMConfig->dwEnableManualRefresh,
sizeof(DWORD));
// Write the environment
RegSetValueEx(hkeyPassportSubKey,
g_szEnvName,
NULL,
REG_SZ,
(LPBYTE) lpPMConfig->szEnvName,
(lstrlen(lpPMConfig->szEnvName) + 1) * sizeof(TCHAR));
RegCloseKey(hkeyPassportSubKey);
hkeyPassportSubKey = NULL;
nConfigNameSize = MAX_CONFIGSETNAME * sizeof(TCHAR);
}
if (lRet == ERROR_SUCCESS)
bReturn = TRUE;
Cleanup:
if (hkeyPassport)
RegCloseKey(hkeyPassport);
if (hkeyPassportSubKey)
RegCloseKey(hkeyPassportSubKey);
return bReturn;
}
/**************************************************************************
WriteRegTestKey
Installs the default test key for the named config set. This is
only called in the case where a new config set key was created in
OpenRegConfigSet.
**************************************************************************/
BOOL
WriteRegTestKey
(
HKEY hkeyConfigKey,
PSECURITY_DESCRIPTOR pSD
)
{
BOOL bReturn;
CKeyCrypto kc;
HKEY hkDataKey = NULL, hkTimeKey = NULL;
TCHAR szKeyNum[2];
DWORD dwKeyVer = 1;
// Try to encrypt it with MAC address
BYTE original[CKeyCrypto::RAWKEY_SIZE];
DATA_BLOB iBlob;
DATA_BLOB oBlob;
SECURITY_ATTRIBUTES SecAttrib;
iBlob.cbData = sizeof(original);
iBlob.pbData = original;
ZeroMemory(&oBlob, sizeof(oBlob));
memcpy(original, "123456781234567812345678", CKeyCrypto::RAWKEY_SIZE);
if (kc.encryptKey(&iBlob, &oBlob) != S_OK)
{
bReturn = FALSE;
goto Cleanup;
}
// Now add it to registry
lstrcpy(szKeyNum, TEXT("1"));
// set up the security attributes structure for the KeyData reg key
SecAttrib.nLength = sizeof(SECURITY_ATTRIBUTES);
SecAttrib.lpSecurityDescriptor = pSD;
SecAttrib.bInheritHandle = FALSE;
if(ERROR_SUCCESS != RegCreateKeyEx(hkeyConfigKey,
TEXT("KeyData"),
0,
TEXT(""),
0,
KEY_ALL_ACCESS,
&SecAttrib,
&hkDataKey,
NULL))
{
bReturn = FALSE;
goto Cleanup;
}
if(ERROR_SUCCESS != RegCreateKeyEx(hkeyConfigKey,
TEXT("KeyTimes"),
0,
TEXT(""),
0,
KEY_ALL_ACCESS,
NULL,
&hkTimeKey,
NULL))
{
bReturn = FALSE;
goto Cleanup;
}
if(ERROR_SUCCESS != RegSetValueEx(hkDataKey,
szKeyNum,
0,
REG_BINARY,
oBlob.pbData,
oBlob.cbData))
{
bReturn = FALSE;
goto Cleanup;
}
if(ERROR_SUCCESS != RegSetValueEx(hkeyConfigKey,
TEXT("CurrentKey"),
0,
REG_DWORD,
(LPBYTE) &dwKeyVer,
sizeof(DWORD)))
{
bReturn = FALSE;
goto Cleanup;
}
bReturn = TRUE;
Cleanup:
if (hkDataKey)
RegCloseKey(hkDataKey);
if (hkTimeKey)
RegCloseKey(hkTimeKey);
if (oBlob.pbData)
::LocalFree(oBlob.pbData);
return bReturn;
}
/**************************************************************************
OpenRegConfigSet
Open and return an HKEY for a named configuration set
current passport manager config set from the registry
**************************************************************************/
HKEY OpenRegConfigSet
(
HKEY hkeyLocalMachine, // Local or remote HKLM
LPTSTR lpszConfigSetName // Name of config set
)
{
HKEY hkeyConfigSets = NULL;
HKEY hkeyConfigSet = NULL;
DWORD dwDisp;
PSECURITY_DESCRIPTOR pSD = NULL;
HKEY hDefKeyData = NULL;
DWORD cbSD = 0;
long lRet;
//
// Can't create an unnamed config set.
//
if(lpszConfigSetName == NULL ||
lpszConfigSetName[0] == TEXT('\0'))
{
lRet = ERROR_INVALID_PARAMETER;
goto Cleanup;
}
if (ERROR_SUCCESS != (lRet = RegCreateKeyEx(hkeyLocalMachine,
REG_PASSPORT_SITES_VALUE,
0,
TEXT(""),
0,
KEY_ALL_ACCESS,
NULL,
&hkeyConfigSets,
NULL)))
{
goto Cleanup;
}
//
// Create the key if it doesn't exist, otherwise
// open it.
//
if (ERROR_SUCCESS != (lRet = RegCreateKeyEx(hkeyConfigSets,
lpszConfigSetName,
0,
TEXT(""),
0,
KEY_ALL_ACCESS,
NULL,
&hkeyConfigSet,
&dwDisp)))
{
goto Cleanup;
}
//
// If we created a new regkey, add encryption keys
//
if(dwDisp == REG_CREATED_NEW_KEY)
{
// first read the SD from the default key data
if (ERROR_SUCCESS !=
RegOpenKeyEx(hkeyLocalMachine,
L"Software\\Microsoft\\Passport\\KeyData",
0,
KEY_READ,
&hDefKeyData))
{
RegCloseKey(hkeyConfigSet);
hkeyConfigSet = NULL;
goto Cleanup;
}
if (ERROR_INSUFFICIENT_BUFFER !=
RegGetKeySecurity(hDefKeyData,
DACL_SECURITY_INFORMATION,
&cbSD,
&cbSD))
{
RegCloseKey(hkeyConfigSet);
hkeyConfigSet = NULL;
goto Cleanup;
}
if (NULL == (pSD = (PSECURITY_DESCRIPTOR)LocalAlloc(LMEM_FIXED, cbSD)))
{
RegCloseKey(hkeyConfigSet);
hkeyConfigSet = NULL;
goto Cleanup;
}
if (ERROR_SUCCESS !=
RegGetKeySecurity(hDefKeyData,
DACL_SECURITY_INFORMATION,
pSD,
&cbSD))
{
RegCloseKey(hkeyConfigSet);
hkeyConfigSet = NULL;
goto Cleanup;
}
// create the new key data
if (!WriteRegTestKey(hkeyConfigSet, pSD))
{
RegCloseKey(hkeyConfigSet);
hkeyConfigSet = NULL;
goto Cleanup;
}
}
Cleanup:
if (pSD)
{
LocalFree(pSD);
}
if (hDefKeyData)
{
RegCloseKey(hDefKeyData);
}
if(hkeyConfigSets)
RegCloseKey(hkeyConfigSets);
else {
LPVOID lpMsgBuf;
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
lRet,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL) != 0)
{
TCHAR pszTitle[MAX_RESOURCE];
// Display the string.
LoadString(g_hInst, IDS_ERROR, pszTitle, DIMENSION(pszTitle));
MessageBox( NULL, (LPCTSTR) lpMsgBuf, pszTitle, MB_OK | MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
}
}
return hkeyConfigSet;
}
/**************************************************************************
OpenTopRegKey
Open the top reg key, if we aren't allowed to then fail.
**************************************************************************/
BOOL OpenTopRegKey
(
HWND hWndDlg,
LPTSTR lpszRemoteComputer,
HKEY *phklm,
HKEY *phkeyPassport
)
{
BOOL bReturn;
long lRet;
// Open the Passport Regkey ( either locally or remotly
if (lpszRemoteComputer && (TEXT('\0') != lpszRemoteComputer[0]))
{
//
// Attempt to connect to the HKEY_LOCAL_MACHINE of the remote computer.
// If this fails, assume that the computer doesn't exist or doesn't have
// the registry server running.
//
switch (lRet = RegConnectRegistry(lpszRemoteComputer,
HKEY_LOCAL_MACHINE,
phklm))
{
case ERROR_SUCCESS:
break;
case ERROR_ACCESS_DENIED:
ReportError(hWndDlg, IDS_CONNECTACCESSDENIED);
bReturn = FALSE;
goto Cleanup;
default:
ReportError(hWndDlg, IDS_CONNECTBADNAME);
bReturn = FALSE;
goto Cleanup;
}
}
else
{
*phklm = HKEY_LOCAL_MACHINE;
}
// Open the key we want
if (ERROR_SUCCESS != (lRet = RegOpenKeyEx(*phklm,
g_szPassportReg,
0,
KEY_ALL_ACCESS,
phkeyPassport)))
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
lRet,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// Display the string.
{
TCHAR pszTitle[MAX_RESOURCE];
LoadString(g_hInst, IDS_ERROR, pszTitle, DIMENSION(pszTitle));
MessageBox( NULL, (LPCTSTR) lpMsgBuf, pszTitle, MB_OK | MB_ICONINFORMATION );
}
// Free the buffer.
LocalFree( lpMsgBuf );
// ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
bReturn = FALSE;
goto Cleanup;
}
bReturn = TRUE;
Cleanup:
return bReturn;
}
/**************************************************************************
ReadRegConfigSet
Read the current passport manager config set from the registry
**************************************************************************/
BOOL ReadRegConfigSet
(
HWND hWndDlg,
LPPMSETTINGS lpPMConfig,
LPTSTR lpszRemoteComputer,
LPTSTR lpszConfigSetName
)
{
BOOL bReturn;
HKEY hkeyPassport = NULL; // Regkey where Passport Setting live
HKEY hkeyConfigSets = NULL;
HKEY hkeyConfig = NULL;
HKEY hkeyPartner = NULL;
HKEY hklm = NULL;
DWORD dwcbTemp;
DWORD dwType;
TCHAR szText[MAX_RESOURCE];
TCHAR szTitle[MAX_RESOURCE];
long lRet;
if (!OpenTopRegKey(hWndDlg, lpszRemoteComputer, &hklm, &hkeyPassport))
{
bReturn = FALSE;
goto Cleanup;
}
// Open Partner key
if (ERROR_SUCCESS != (lRet = RegOpenKeyEx(hklm,
g_szPassportPartner,
0,
KEY_ALL_ACCESS,
&hkeyPartner)))
{
LPVOID lpMsgBuf;
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
lRet,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL) != 0)
{
TCHAR pszTitle[MAX_RESOURCE];
// Display the string.
LoadString(g_hInst, IDS_ERROR, pszTitle, DIMENSION(pszTitle));
MessageBox( NULL, (LPCTSTR) lpMsgBuf, pszTitle, MB_OK | MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
}
// ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
bReturn = FALSE;
goto Cleanup;
}
// open Site key
if(lpszConfigSetName && lpszConfigSetName[0] != TEXT('\0'))
{
hkeyConfig = OpenRegConfigSet(hklm, lpszConfigSetName);
if(hkeyConfig == NULL)
{
ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
bReturn = FALSE;
goto Cleanup;
}
}
else
{
hkeyConfig = hkeyPassport;
}
// The Install dir and Version number go into globals, because they are read
// only values that must come from the target machine's registry.
// Read the Install Dir.
dwcbTemp = MAX_PATH;
dwType = REG_SZ;
g_szInstallPath[0] = TEXT('\0'); // Default value
RegQueryValueEx(hkeyPassport,
g_szInstallDir,
NULL,
&dwType,
(LPBYTE)g_szInstallPath,
&dwcbTemp);
// Read the version Number
dwcbTemp = MAX_REGISTRY_STRING;
dwType = REG_SZ;
g_szPMVersion[0] = TEXT('\0'); // Default value
RegQueryValueEx(hkeyPassport,
g_szVersion,
NULL,
&dwType,
(LPBYTE)&g_szPMVersion,
&dwcbTemp);
// The Remaining settings are read/write and get put into a PMSETTINGS struct
// Read the Time Window Number
dwcbTemp = sizeof(DWORD);
dwType = REG_DWORD;
lpPMConfig->dwTimeWindow = DEFAULT_TIME_WINDOW;
RegQueryValueEx(hkeyConfig,
g_szTimeWindow,
NULL,
&dwType,
(LPBYTE)&lpPMConfig->dwTimeWindow,
&dwcbTemp);
// Read the value for Forced Signin
dwcbTemp = sizeof(DWORD);
dwType = REG_DWORD;
lpPMConfig->dwForceSignIn = 0; // Don't force a signin by default
RegQueryValueEx(hkeyConfig,
g_szForceSignIn,
NULL,
&dwType,
(LPBYTE)&lpPMConfig->dwForceSignIn,
&dwcbTemp);
// Read the value for NSRefresh
dwcbTemp = sizeof(DWORD);
dwType = REG_DWORD;
lpPMConfig->dwEnableManualRefresh = 0; // Don't enable NS Manual Refresh by default
RegQueryValueEx(hkeyConfig,
g_szNSRefresh,
NULL,
&dwType,
(LPBYTE)&lpPMConfig->dwEnableManualRefresh,
&dwcbTemp);
// Read the default language ID
dwcbTemp = sizeof(DWORD);
dwType = REG_DWORD;
lpPMConfig->dwLanguageID = DEFAULT_LANGID; // english
RegQueryValueEx(hkeyConfig,
g_szLanguageID,
NULL,
&dwType,
(LPBYTE)&lpPMConfig->dwLanguageID,
&dwcbTemp);
// Get the co-branding template
dwcbTemp = lpPMConfig->cbCoBrandTemplate;
dwType = REG_SZ;
lpPMConfig->szCoBrandTemplate[0] = TEXT('\0'); // Default value
RegQueryValueEx(hkeyConfig,
g_szCoBrandTemplate,
NULL,
&dwType,
(LPBYTE)lpPMConfig->szCoBrandTemplate,
&dwcbTemp);
// Get the SiteID
dwcbTemp = sizeof(DWORD);
dwType = REG_DWORD;
lpPMConfig->dwSiteID = 1; // Default Site ID
RegQueryValueEx(hkeyConfig,
g_szSiteID,
NULL,
&dwType,
(LPBYTE)&lpPMConfig->dwSiteID,
&dwcbTemp);
// Get the return URL template
dwcbTemp = lpPMConfig->cbReturnURL;
dwType = REG_SZ;
lpPMConfig->szReturnURL[0] = TEXT('\0'); // Set a default for the current value
RegQueryValueEx(hkeyConfig,
g_szReturnURL,
NULL,
&dwType,
(LPBYTE)lpPMConfig->szReturnURL,
&dwcbTemp);
// Get the ticket cookie domain
dwcbTemp = lpPMConfig->cbTicketDomain;
dwType = REG_SZ;
lpPMConfig->szTicketDomain[0] = TEXT('\0'); // Set a default for the current value
RegQueryValueEx(hkeyConfig,
g_szTicketDomain,
NULL,
&dwType,
(LPBYTE)lpPMConfig->szTicketDomain,
&dwcbTemp);
// Get the ticket cookie path
dwcbTemp = lpPMConfig->cbTicketPath;
dwType = REG_SZ;
lpPMConfig->szTicketPath[0] = TEXT('\0'); // Set a default for the current value
RegQueryValueEx(hkeyConfig,
g_szTicketPath,
NULL,
&dwType,
(LPBYTE)lpPMConfig->szTicketPath,
&dwcbTemp);
// Get the profile cookie domain
dwcbTemp = lpPMConfig->cbProfileDomain;
dwType = REG_SZ;
lpPMConfig->szProfileDomain[0] = TEXT('\0'); // Set a default for the current value
RegQueryValueEx(hkeyConfig,
g_szProfileDomain,
NULL,
&dwType,
(LPBYTE)lpPMConfig->szProfileDomain,
&dwcbTemp);
// Get the profile cookie path
dwcbTemp = lpPMConfig->cbProfilePath;
dwType = REG_SZ;
lpPMConfig->szProfilePath[0] = TEXT('\0'); // Set a default for the current value
RegQueryValueEx(hkeyConfig,
g_szProfilePath,
NULL,
&dwType,
(LPBYTE)lpPMConfig->szProfilePath,
&dwcbTemp);
// Get the secure cookie domain
dwcbTemp = lpPMConfig->cbSecureDomain;
dwType = REG_SZ;
lpPMConfig->szSecureDomain[0] = TEXT('\0'); // Set a default for the current value
RegQueryValueEx(hkeyConfig,
g_szSecureDomain,
NULL,
&dwType,
(LPBYTE)lpPMConfig->szSecureDomain,
&dwcbTemp);
// Get the secure cookie path
dwcbTemp = lpPMConfig->cbSecurePath;
dwType = REG_SZ;
lpPMConfig->szSecurePath[0] = TEXT('\0'); // Set a default for the current value
RegQueryValueEx(hkeyConfig,
g_szSecurePath,
NULL,
&dwType,
(LPBYTE)lpPMConfig->szSecurePath,
&dwcbTemp);
// Get the Disaster URL
dwcbTemp = lpPMConfig->cbDisasterURL;
dwType = REG_SZ;
lpPMConfig->szDisasterURL[0] = TEXT('\0'); // Set a default for the current value
RegQueryValueEx(hkeyConfig,
g_szDisasterURL,
NULL,
&dwType,
(LPBYTE)lpPMConfig->szDisasterURL,
&dwcbTemp);
// Get Standalone mode setting
dwcbTemp = sizeof(DWORD);
dwType = REG_DWORD;
lpPMConfig->dwStandAlone = 0; // NOT standalone by default
RegQueryValueEx(hkeyConfig,
g_szStandAlone,
NULL,
&dwType,
(LPBYTE)&lpPMConfig->dwStandAlone,
&dwcbTemp);
/////////////////////////////////////////////////////////////////////////
//JVP 3/2/2000 START CHANGES
/////////////////////////////////////////////////////////////////////////
// Get Verbose mode setting
dwcbTemp = sizeof(DWORD);
dwType = REG_DWORD;
lpPMConfig->dwVerboseMode = 0; // NOT verbose by default
RegQueryValueEx(hkeyConfig,
g_szVerboseMode,
NULL,
&dwType,
(LPBYTE)&lpPMConfig->dwVerboseMode,
&dwcbTemp);
/////////////////////////////////////////////////////////////////////////
//JVP 3/2/2000 END CHANGES
/////////////////////////////////////////////////////////////////////////
// Get the current environment
dwcbTemp = lpPMConfig->cbEnvName;
dwType = REG_SZ;
lpPMConfig->szEnvName[0] = TEXT('\0'); // Set a default for the current value
RegQueryValueEx(hkeyConfig,
g_szEnvName,
NULL,
&dwType,
(LPBYTE)lpPMConfig->szEnvName,
&dwcbTemp);
// Get the current environment
dwcbTemp = lpPMConfig->cbRemoteFile;
dwType = REG_SZ;
lpPMConfig->szRemoteFile[0] = TEXT('\0'); // Set a default for the current value
RegQueryValueEx(hkeyPartner,
g_szRemoteFile,
NULL,
&dwType,
(LPBYTE)lpPMConfig->szRemoteFile,
&dwcbTemp);
// Get DisableCookies mode setting
dwcbTemp = sizeof(DWORD);
dwType = REG_DWORD;
lpPMConfig->dwDisableCookies = 0; // Cookies ENABLED by default
RegQueryValueEx(hkeyConfig,
g_szDisableCookies,
NULL,
&dwType,
(LPBYTE)&lpPMConfig->dwDisableCookies,
&dwcbTemp);
#ifdef DO_KEYSTUFF
// Get the current encryption key
dwcbTemp = sizeof(DWORD);
dwType = REG_DWORD;
lpPMConfig->dwCurrentKey = 1;
RegQueryValueEx(hkeyConfig,
g_szCurrentKey,
NULL,
&dwType,
(LPBYTE)&lpPMConfig->dwCurrentKey,
&dwcbTemp);
#endif
// For these next two, since they're required for named configs, we need
// to check for too much data and truncate it.
// Get the Host Name
dwcbTemp = lpPMConfig->cbHostName;
dwType = REG_SZ;
lpPMConfig->szHostName[0] = TEXT('\0'); // Set a default for the current value
if(ERROR_MORE_DATA == RegQueryValueEx(hkeyConfig,
g_szHostName,
NULL,
&dwType,
(LPBYTE)lpPMConfig->szHostName,
&dwcbTemp))
{
LPBYTE pb = (LPBYTE)malloc(dwcbTemp);
if(pb)
{
RegQueryValueEx(hkeyConfig,
g_szHostName,
NULL,
&dwType,
pb,
&dwcbTemp);
memcpy(lpPMConfig->szHostName, pb, lpPMConfig->cbHostName);
free(pb);
ReportError(hWndDlg, IDS_HOSTNAMETRUNC_WARN);
}
}
// Get the Host IP
dwcbTemp = lpPMConfig->cbHostIP;
dwType = REG_SZ;
lpPMConfig->szHostIP[0] = TEXT('\0'); // Set a default for the current value
if(ERROR_MORE_DATA == RegQueryValueEx(hkeyConfig,
g_szHostIP,
NULL,
&dwType,
(LPBYTE)lpPMConfig->szHostIP,
&dwcbTemp))
{
LPBYTE pb = (LPBYTE)malloc(dwcbTemp);
if(pb)
{
RegQueryValueEx(hkeyConfig,
g_szHostIP,
NULL,
&dwType,
pb,
&dwcbTemp);
memcpy(lpPMConfig->szHostIP, pb, lpPMConfig->cbHostIP);
free(pb);
ReportError(hWndDlg, IDS_HOSTIPTRUNC_WARN);
}
}
// Query for the secure level setting
dwcbTemp = sizeof(DWORD);
dwType = REG_DWORD;
lpPMConfig->dwSecureLevel = 0; // If this is an existing site then we level set the
// secure level at 0 so that we don't break anyone,
// even though the default for a new site is level 10.
RegQueryValueEx(hkeyConfig,
g_szSecureLevel,
NULL,
&dwType,
(LPBYTE)&lpPMConfig->dwSecureLevel,
&dwcbTemp);
// If we got empty strings for HostName or
// HostIP, and we have a named config it
// means someone's been mucking with
// the registry. Give them a warning and
// return FALSE.
if(lpszConfigSetName && lpszConfigSetName[0] &&
(lpPMConfig->szHostName[0] == TEXT('\0') ||
lpPMConfig->szHostIP[0] == TEXT('\0')))
{
ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
bReturn = FALSE;
goto Cleanup;
}
bReturn = TRUE;
Cleanup:
if (hkeyConfig && hkeyConfig != hkeyPassport)
RegCloseKey(hkeyConfig);
if (hkeyPassport)
RegCloseKey(hkeyPassport);
if (hkeyConfigSets)
RegCloseKey(hkeyConfigSets);
if (hklm && hklm != HKEY_LOCAL_MACHINE)
RegCloseKey(hklm);
if (hkeyPartner)
RegCloseKey(hkeyPartner);
return bReturn;
}
/**************************************************************************
WriteRegConfigSet
Write the current passport manager config set from the registry
**************************************************************************/
BOOL WriteRegConfigSet
(
HWND hWndDlg,
LPPMSETTINGS lpPMConfig,
LPTSTR lpszRemoteComputer,
LPTSTR lpszConfigSetName
)
{
BOOL bReturn;
HKEY hkeyPassport = NULL; // Regkey where Passport Setting live
HKEY hkeyConfigSets = NULL;
HKEY hkeyPartner = NULL;
HKEY hklm = NULL;
long lRet;
// Open the Passport Regkey ( either locally or remotly
if (lpszRemoteComputer && (TEXT('\0') != lpszRemoteComputer[0]))
{
//
// Attempt to connect to the HKEY_LOCAL_MACHINE of the remote computer.
// If this fails, assume that the computer doesn't exist or doesn't have
// the registry server running.
//
switch (lRet = RegConnectRegistry(lpszRemoteComputer,
HKEY_LOCAL_MACHINE,
&hklm))
{
case ERROR_SUCCESS:
break;
case ERROR_ACCESS_DENIED:
ReportError(hWndDlg, IDS_CONNECTACCESSDENIED);
bReturn = FALSE;
goto Cleanup;
default:
ReportError(hWndDlg, IDS_CONNECTBADNAME);
bReturn = FALSE;
goto Cleanup;
}
}
else
{
hklm = HKEY_LOCAL_MACHINE;
}
// Open the key we want
if(lpszConfigSetName && lpszConfigSetName[0] != TEXT('\0'))
{
hkeyPassport = OpenRegConfigSet(hklm, lpszConfigSetName);
if(hkeyPassport == NULL)
{
ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
bReturn = FALSE;
goto Cleanup;
}
}
else
{
if (ERROR_SUCCESS != (lRet = RegOpenKeyEx(hklm,
g_szPassportReg,
0,
KEY_ALL_ACCESS,
&hkeyPassport)))
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
lRet,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
{
TCHAR pszTitle[MAX_RESOURCE];
// Display the string.
LoadString(g_hInst, IDS_ERROR, pszTitle, DIMENSION(pszTitle));
MessageBox( NULL, (LPCTSTR) lpMsgBuf, pszTitle, MB_OK | MB_ICONINFORMATION );
}
// Free the buffer.
LocalFree( lpMsgBuf );
// ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
bReturn = FALSE;
goto Cleanup;
}
}
WriteGlobalConfigSettings(hWndDlg, hklm, lpPMConfig, lpszRemoteComputer);
// Open Partner key
if (ERROR_SUCCESS != (lRet = RegOpenKeyEx(hklm,
g_szPassportPartner,
0,
KEY_ALL_ACCESS,
&hkeyPartner)))
{
LPVOID lpMsgBuf;
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
lRet,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL) != 0)
{
TCHAR pszTitle[MAX_RESOURCE];
// Display the string.
LoadString(g_hInst, IDS_ERROR, pszTitle, DIMENSION(pszTitle));
MessageBox( NULL, (LPCTSTR) lpMsgBuf, pszTitle, MB_OK | MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
}
// ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
bReturn = FALSE;
goto Cleanup;
}
// Write the Time Window Number
RegSetValueEx(hkeyPassport,
g_szTimeWindow,
NULL,
REG_DWORD,
(LPBYTE)&lpPMConfig->dwTimeWindow,
sizeof(DWORD));
// Write the value for Forced Signin
RegSetValueEx(hkeyPassport,
g_szForceSignIn,
NULL,
REG_DWORD,
(LPBYTE)&lpPMConfig->dwForceSignIn,
sizeof(DWORD));
// Write the default language ID
RegSetValueEx(hkeyPassport,
g_szLanguageID,
NULL,
REG_DWORD,
(LPBYTE)&lpPMConfig->dwLanguageID,
sizeof(DWORD));
// Write the co-branding template
RegSetValueEx(hkeyPassport,
g_szCoBrandTemplate,
NULL,
REG_SZ,
(LPBYTE)lpPMConfig->szCoBrandTemplate,
(lstrlen(lpPMConfig->szCoBrandTemplate) + 1) * sizeof(TCHAR));
// Write the SiteID
RegSetValueEx(hkeyPassport,
g_szSiteID,
NULL,
REG_DWORD,
(LPBYTE)&lpPMConfig->dwSiteID,
sizeof(DWORD));
// Write the return URL template
RegSetValueEx(hkeyPassport,
g_szReturnURL,
NULL,
REG_SZ,
(LPBYTE)lpPMConfig->szReturnURL,
(lstrlen(lpPMConfig->szReturnURL) + 1) * sizeof(TCHAR));
// Write the ticket cookie domain
RegSetValueEx(hkeyPassport,
g_szTicketDomain,
NULL,
REG_SZ,
(LPBYTE)lpPMConfig->szTicketDomain,
(lstrlen(lpPMConfig->szTicketDomain) + 1) * sizeof(TCHAR));
// Write the ticket cookie path
RegSetValueEx(hkeyPassport,
g_szTicketPath,
NULL,
REG_SZ,
(LPBYTE)lpPMConfig->szTicketPath,
(lstrlen(lpPMConfig->szTicketPath) + 1) * sizeof(TCHAR));
// Write the profile cookie domain
RegSetValueEx(hkeyPassport,
g_szProfileDomain,
NULL,
REG_SZ,
(LPBYTE)lpPMConfig->szProfileDomain,
(lstrlen(lpPMConfig->szProfileDomain) + 1) * sizeof(TCHAR));
// Write the profile cookie path
RegSetValueEx(hkeyPassport,
g_szProfilePath,
NULL,
REG_SZ,
(LPBYTE)lpPMConfig->szProfilePath,
(lstrlen(lpPMConfig->szProfilePath) + 1) * sizeof(TCHAR));
// Write the secure cookie domain
RegSetValueEx(hkeyPassport,
g_szSecureDomain,
NULL,
REG_SZ,
(LPBYTE)lpPMConfig->szSecureDomain,
(lstrlen(lpPMConfig->szSecureDomain) + 1) * sizeof(TCHAR));
// Write the secure cookie path
RegSetValueEx(hkeyPassport,
g_szSecurePath,
NULL,
REG_SZ,
(LPBYTE)lpPMConfig->szSecurePath,
(lstrlen(lpPMConfig->szSecurePath) + 1) * sizeof(TCHAR));
// Write the DisasterURL
RegSetValueEx(hkeyPassport,
g_szDisasterURL,
NULL,
REG_SZ,
(LPBYTE)lpPMConfig->szDisasterURL,
(lstrlen(lpPMConfig->szDisasterURL) + 1) * sizeof(TCHAR));
// Write Standalone mode setting
RegSetValueEx(hkeyPassport,
g_szStandAlone,
NULL,
REG_DWORD,
(LPBYTE)&lpPMConfig->dwStandAlone,
sizeof(DWORD));
/////////////////////////////////////////////////////////////////////////
//JVP 3/2/2000 START CHANGES
/////////////////////////////////////////////////////////////////////////
// Write Verbose mode setting
RegSetValueEx(hkeyPassport,
g_szVerboseMode,
NULL,
REG_DWORD,
(LPBYTE)&lpPMConfig->dwVerboseMode,
sizeof(DWORD));
/////////////////////////////////////////////////////////////////////////
//JVP 3/2/2000 END CHANGES
/////////////////////////////////////////////////////////////////////////
// Write the Partner RemoteFile
RegSetValueEx(hkeyPartner,
g_szRemoteFile,
NULL,
REG_SZ,
(LPBYTE)lpPMConfig->szRemoteFile,
(lstrlen(lpPMConfig->szRemoteFile) + 1) * sizeof(TCHAR));
// Write Environment RemoteFile
if (lstrcmp(g_szPMVersion, g_szVersion14) >= 0) // Write EnvName for 1.4 and later
WriteRegEnv(hWndDlg, lpPMConfig, hklm, lpPMConfig->szEnvName);
// Write DisableCookies mode setting
RegSetValueEx(hkeyPassport,
g_szDisableCookies,
NULL,
REG_DWORD,
(LPBYTE)&lpPMConfig->dwDisableCookies,
sizeof(DWORD));
// Only write HostName and HostIP for non-default config sets.
if(lpszConfigSetName && lpszConfigSetName[0])
{
// Write the HostName
RegSetValueEx(hkeyPassport,
g_szHostName,
NULL,
REG_SZ,
(LPBYTE)lpPMConfig->szHostName,
(lstrlen(lpPMConfig->szHostName) + 1) * sizeof(TCHAR));
// Write the HostIP
RegSetValueEx(hkeyPassport,
g_szHostIP,
NULL,
REG_SZ,
(LPBYTE)lpPMConfig->szHostIP,
(lstrlen(lpPMConfig->szHostIP) + 1) * sizeof(TCHAR));
}
// Write the secure level (note this reg value is not exposed through the UI
// users need to go directly to the registry to edit this value)
RegSetValueEx(hkeyPassport,
g_szSecureLevel,
NULL,
REG_DWORD,
(LPBYTE)&lpPMConfig->dwSecureLevel,
sizeof(DWORD));
bReturn = TRUE;
Cleanup:
if(hklm && hklm != HKEY_LOCAL_MACHINE)
RegCloseKey(hklm);
if(hkeyConfigSets)
RegCloseKey(hkeyConfigSets);
if(hkeyPassport)
RegCloseKey(hkeyPassport);
if(hkeyPartner)
RegCloseKey(hkeyPartner);
return bReturn;
}
/**************************************************************************
RemoveRegConfigSet
Verify that the passed in config set is consistent with the current
values in the registry.
**************************************************************************/
BOOL RemoveRegConfigSet
(
HWND hWndDlg,
LPTSTR lpszRemoteComputer,
LPTSTR lpszConfigSetName
)
{
BOOL bReturn;
HKEY hklm = NULL;
HKEY hkeyPassportConfigSets = NULL;
long lRet;
// Can't delete the default configuration set.
if(lpszConfigSetName == NULL || lpszConfigSetName[0] == TEXT('\0'))
{
bReturn = FALSE;
goto Cleanup;
}
// Open the Passport Configuration Sets Regkey ( either locally or remotly
if (lpszRemoteComputer && (TEXT('\0') != lpszRemoteComputer[0]))
{
//
// Attempt to connect to the HKEY_LOCAL_MACHINE of the remote computer.
// If this fails, assume that the computer doesn't exist or doesn't have
// the registry server running.
//
switch (RegConnectRegistry(lpszRemoteComputer,
HKEY_LOCAL_MACHINE,
&hklm))
{
case ERROR_SUCCESS:
break;
case ERROR_ACCESS_DENIED:
ReportError(hWndDlg, IDS_CONNECTACCESSDENIED);
bReturn = FALSE;
goto Cleanup;
default:
ReportError(hWndDlg, IDS_CONNECTBADNAME);
bReturn = FALSE;
goto Cleanup;
}
}
else
{
hklm = HKEY_LOCAL_MACHINE;
}
// Open the key we want
if (ERROR_SUCCESS != (lRet = RegOpenKeyEx(hklm,
REG_PASSPORT_SITES_VALUE,
0,
KEY_ALL_ACCESS,
&hkeyPassportConfigSets)))
{
LPVOID lpMsgBuf;
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
lRet,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL) != 0)
{
TCHAR pszTitle[MAX_RESOURCE];
// Display the string.
LoadString(g_hInst, IDS_ERROR, pszTitle, DIMENSION(pszTitle));
MessageBox( NULL, (LPCTSTR) lpMsgBuf, pszTitle, MB_OK | MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
}
// ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
bReturn = FALSE;
goto Cleanup;
}
// Delete the config set key
if (ERROR_SUCCESS != SHDeleteKey(hkeyPassportConfigSets, lpszConfigSetName))
{
ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
bReturn = FALSE;
goto Cleanup;
}
bReturn = TRUE;
Cleanup:
if(hklm && hklm != HKEY_LOCAL_MACHINE)
RegCloseKey(hklm);
if(hkeyPassportConfigSets)
RegCloseKey(hkeyPassportConfigSets);
return bReturn;
}
/**************************************************************************
VerifyRegConfigSet
Verify that the passed in config set is consistent with the current
values in the registry.
**************************************************************************/
BOOL VerifyRegConfigSet
(
HWND hWndDlg,
LPPMSETTINGS lpPMConfig,
LPTSTR lpszRemoteComputer,
LPTSTR lpszConfigSetName
)
{
BOOL fResult = FALSE;
PMSETTINGS *pPMCurrent = NULL;
pPMCurrent = (PMSETTINGS*)LocalAlloc(LMEM_FIXED, sizeof(PMSETTINGS));
if (NULL == pPMCurrent)
{
goto Cleanup;
}
InitializePMConfigStruct(pPMCurrent);
ReadRegConfigSet(hWndDlg, pPMCurrent, lpszRemoteComputer, lpszConfigSetName);
fResult = (0 == memcmp(pPMCurrent, lpPMConfig, sizeof(PMSETTINGS)));
Cleanup:
if (pPMCurrent)
{
LocalFree(pPMCurrent);
}
return fResult;
}
/**************************************************************************
ReadRegConfigSetNames
Get back a list of config set names on a local or remote machine.
Caller is responsible for calling free() on the returned pointer.
When this function returns TRUE, lppszConfigSetNames will either
contain NULL or a string containing the NULL delimited config set
names on the given computer.
When this function returns FALSE, *lppszConfigSetNames will not
be modified.
**************************************************************************/
BOOL ReadRegConfigSetNames
(
HWND hWndDlg,
LPTSTR lpszRemoteComputer,
LPTSTR* lppszConfigSetNames
)
{
BOOL bReturn;
HKEY hklm = NULL;
HKEY hkeyConfigSets = NULL;
DWORD dwIndex;
DWORD dwNumSubKeys;
DWORD dwMaxKeyNameLen;
TCHAR achKeyName[MAX_PATH];
ULONGLONG ullAllocSize;
LPTSTR lpszConfigSetNames;
LPTSTR lpszCur;
// Open the Passport Regkey ( either locally or remotly
if (lpszRemoteComputer && (TEXT('\0') != lpszRemoteComputer[0]))
{
//
// Attempt to connect to the HKEY_LOCAL_MACHINE of the remote computer.
// If this fails, assume that the computer doesn't exist or doesn't have
// the registry server running.
//
switch (RegConnectRegistry(lpszRemoteComputer,
HKEY_LOCAL_MACHINE,
&hklm))
{
case ERROR_SUCCESS:
break;
case ERROR_ACCESS_DENIED:
ReportError(hWndDlg, IDS_CONNECTACCESSDENIED);
bReturn = FALSE;
goto Cleanup;
default:
ReportError(hWndDlg, IDS_CONNECTBADNAME);
bReturn = FALSE;
goto Cleanup;
}
}
else
{
hklm = HKEY_LOCAL_MACHINE;
}
if (ERROR_SUCCESS != RegOpenKeyEx(hklm,
REG_PASSPORT_SITES_VALUE,
0,
KEY_ALL_ACCESS,
&hkeyConfigSets))
{
bReturn = FALSE;
goto Cleanup;
}
if (ERROR_SUCCESS != RegQueryInfoKey(hkeyConfigSets,
NULL,
NULL,
NULL,
&dwNumSubKeys,
&dwMaxKeyNameLen,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL))
{
bReturn = FALSE;
goto Cleanup;
}
//
// Nothing to do!
//
if(dwNumSubKeys == 0)
{
bReturn = TRUE;
*lppszConfigSetNames = NULL;
goto Cleanup;
}
// Too big? BUGBUG - We should make sure we check for this
// When writing out config sets.
ullAllocSize = UInt32x32To64(dwNumSubKeys, dwMaxKeyNameLen + 1);
ullAllocSize = (ullAllocSize+1)*sizeof(TCHAR);
if(ullAllocSize & 0xFFFFFFFF00000000)
{
bReturn = FALSE;
goto Cleanup;
}
// This should allocate more space than we need.
lpszConfigSetNames = (LPTSTR)malloc(((dwNumSubKeys * (dwMaxKeyNameLen + 1)) + 1) * sizeof(TCHAR));
if(lpszConfigSetNames == NULL)
{
bReturn = FALSE;
goto Cleanup;
}
// Read all names into the buffer. Names are NULL delimited and
// two NULLs end the entire thing.
dwIndex = 0;
lpszCur = lpszConfigSetNames;
while (ERROR_SUCCESS == RegEnumKey(hkeyConfigSets, dwIndex++, achKeyName, DIMENSION(achKeyName)))
{
_tcscpy(lpszCur, achKeyName);
lpszCur = _tcschr(lpszCur, TEXT('\0')) + 1;
}
*lpszCur = TEXT('\0');
*lppszConfigSetNames = lpszConfigSetNames;
bReturn = TRUE;
Cleanup:
if(hklm)
RegCloseKey(hklm);
if(hkeyConfigSets)
RegCloseKey(hkeyConfigSets);
return bReturn;
}
/**************************************************************************
WriteRegEnv
Write the current passport manager env set from the registry
**************************************************************************/
BOOL WriteRegEnv
(
HWND hWndDlg,
LPPMSETTINGS lpPMConfig,
HKEY hklm,
LPTSTR lpszEnvName
)
{
BOOL bReturn;
HKEY hkeyEnv = NULL;
long lRet;
// Open Env key
TCHAR szTemp[MAX_RESOURCE];
wsprintf(szTemp, TEXT("%s\\%s"), g_szPassportEnvironments, lpszEnvName);
if (ERROR_SUCCESS != (lRet = RegOpenKeyEx(hklm,
szTemp,
0,
KEY_ALL_ACCESS,
&hkeyEnv)))
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
lRet,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
{
TCHAR pszTitle[MAX_RESOURCE];
// Display the string.
LoadString(g_hInst, IDS_ERROR, pszTitle, DIMENSION(pszTitle));
MessageBox( NULL, (LPCTSTR) lpMsgBuf, pszTitle, MB_OK | MB_ICONINFORMATION );
}
// Free the buffer.
LocalFree( lpMsgBuf );
// ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
bReturn = FALSE;
goto Cleanup;
}
// Write the Env RemoteFile
RegSetValueEx(hkeyEnv,
g_szRemoteFile,
NULL,
REG_SZ,
(LPBYTE)lpPMConfig->szRemoteFile,
(lstrlen(lpPMConfig->szRemoteFile) + 1) * sizeof(TCHAR));
bReturn = TRUE;
Cleanup:
REG_CLOSE_KEY_NULL(hkeyEnv);
return bReturn;
}
/**************************************************************************
ReadRegEnv
Read the current passport manager env set from the registry
**************************************************************************/
BOOL ReadRegRemoteFile
(
HWND hWndDlg,
LPTSTR lpszRemoteFile,
LPTSTR lpszRemoteComputer,
LPTSTR lpszEnvName
)
{
BOOL bReturn;
HKEY hklm = NULL;
HKEY hkeyEnv = NULL;
long lRet;
// Open the Passport Regkey ( either locally or remotly
if (lpszRemoteComputer && (TEXT('\0') != lpszRemoteComputer[0]))
{
//
// Attempt to connect to the HKEY_LOCAL_MACHINE of the remote computer.
// If this fails, assume that the computer doesn't exist or doesn't have
// the registry server running.
//
switch (RegConnectRegistry(lpszRemoteComputer,
HKEY_LOCAL_MACHINE,
&hklm))
{
case ERROR_SUCCESS:
break;
case ERROR_ACCESS_DENIED:
ReportError(hWndDlg, IDS_CONNECTACCESSDENIED);
bReturn = FALSE;
goto Cleanup;
default:
ReportError(hWndDlg, IDS_CONNECTBADNAME);
bReturn = FALSE;
goto Cleanup;
}
}
else
{
hklm = HKEY_LOCAL_MACHINE;
}
// Open Env key
TCHAR szTemp[MAX_RESOURCE];
wsprintf(szTemp, TEXT("%s\\%s"), g_szPassportEnvironments, lpszEnvName);
if (ERROR_SUCCESS != (lRet = RegOpenKeyEx(hklm,
szTemp,
0,
KEY_ALL_ACCESS,
&hkeyEnv)))
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
lRet,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
{
TCHAR pszTitle[MAX_RESOURCE];
// Display the string.
LoadString(g_hInst, IDS_ERROR, pszTitle, DIMENSION(pszTitle));
MessageBox( NULL, (LPCTSTR) lpMsgBuf, pszTitle, MB_OK | MB_ICONINFORMATION );
}
// Free the buffer.
LocalFree( lpMsgBuf );
// ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
bReturn = FALSE;
goto Cleanup;
}
// Get the current environment
DWORD dwcbTemp;
DWORD dwType;
TCHAR szName[INTERNET_MAX_URL_LENGTH];
dwcbTemp = sizeof(szName);
dwType = REG_SZ;
szName[0] = TEXT('\0'); // Set a default for the current value
if (ERROR_SUCCESS == RegQueryValueEx(hkeyEnv,
g_szRemoteFile,
NULL,
&dwType,
(LPBYTE)szName,
&dwcbTemp))
{
lstrcpy(lpszRemoteFile, szName);
bReturn = TRUE;
}
else
bReturn = FALSE;
Cleanup:
REG_CLOSE_KEY_NULL(hklm);
REG_CLOSE_KEY_NULL(hkeyEnv);
return bReturn;
}
/**************************************************************************
ReadRegEnv
Read the current passport manager env set from the registry
**************************************************************************/
BOOL ReadRegLocalFile
(
HWND hWndDlg,
LPTSTR lpszRemoteComputer,
LPTSTR lpszLocalFile
)
{
BOOL bReturn;
HKEY hklm = NULL;
HKEY hkeyPartner = NULL;
long lRet;
// Open the Passport Regkey ( either locally or remotly
if (lpszRemoteComputer && (TEXT('\0') != lpszRemoteComputer[0]))
{
//
// Attempt to connect to the HKEY_LOCAL_MACHINE of the remote computer.
// If this fails, assume that the computer doesn't exist or doesn't have
// the registry server running.
//
switch (RegConnectRegistry(lpszRemoteComputer,
HKEY_LOCAL_MACHINE,
&hklm))
{
case ERROR_SUCCESS:
break;
case ERROR_ACCESS_DENIED:
ReportError(hWndDlg, IDS_CONNECTACCESSDENIED);
bReturn = FALSE;
goto Cleanup;
default:
ReportError(hWndDlg, IDS_CONNECTBADNAME);
bReturn = FALSE;
goto Cleanup;
}
}
else
{
hklm = HKEY_LOCAL_MACHINE;
}
// Open Partner key
if (ERROR_SUCCESS != (lRet = RegOpenKeyEx(hklm,
g_szPassportPartner,
0,
KEY_ALL_ACCESS,
&hkeyPartner)))
{
LPVOID lpMsgBuf;
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
lRet,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL) != 0)
{
TCHAR pszTitle[MAX_RESOURCE];
// Display the string.
LoadString(g_hInst, IDS_ERROR, pszTitle, DIMENSION(pszTitle));
MessageBox( NULL, (LPCTSTR) lpMsgBuf, pszTitle, MB_OK | MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
}
// ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
bReturn = FALSE;
goto Cleanup;
}
// Get the current environment
DWORD dwcbTemp;
DWORD dwType;
TCHAR szName[INTERNET_MAX_URL_LENGTH];
dwcbTemp = sizeof(szName);
dwType = REG_SZ;
lpszLocalFile[0] = TEXT('\0'); // Set a default for the current value
if (ERROR_SUCCESS == RegQueryValueEx(hkeyPartner,
g_szLocalFile,
NULL,
&dwType,
(LPBYTE)szName,
&dwcbTemp))
{
lstrcpy(lpszLocalFile, szName);
bReturn = TRUE;
}
else
bReturn = FALSE;
Cleanup:
REG_CLOSE_KEY_NULL(hklm);
REG_CLOSE_KEY_NULL(hkeyPartner);
return bReturn;
}