|
|
// This is a part of the Microsoft Management Console.
// Copyright (C) 1995-2001 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Management Console and related
// electronic documentation provided with the interfaces.
#include "stdafx.h"
#include "snapmgr.h"
#include "util.h"
#include "regvldlg.h"
//#include <shlwapi.h>
//#include <shlwapip.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
long GetRegValueItemID(LPCWSTR szItem) //Raid #510407, 2/24/2002, yanggao
{ long itemID = 0; if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Services\\NTDS\\Parameters\\LDAPServerIntegrity") == 0 ) { itemID = IDS_LDAPSERVERINTEGRITY; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Services\\Netlogon\\Parameters\\SignSecureChannel") == 0 ) { itemID = IDS_SIGNSECURECHANNEL; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Services\\Netlogon\\Parameters\\SealSecureChannel") == 0 ) { itemID = IDS_SEALSECURECHANNEL; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Services\\Netlogon\\Parameters\\RequireStrongKey") == 0 ) { itemID = IDS_REQUIRESTRONGKEY; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Services\\Netlogon\\Parameters\\RequireSignOrSeal") == 0 ) { itemID = IDS_REQUIRESIGNORSEAL; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Services\\Netlogon\\Parameters\\RefusePasswordChange") == 0 ) { itemID = IDS_REFUSEPASSWORDCHANGE; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Services\\Netlogon\\Parameters\\MaximumPasswordAge") == 0 ) { itemID = IDS_MAXIMUMPASSWORDAGE; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Services\\Netlogon\\Parameters\\DisablePasswordChange") == 0 ) { itemID = IDS_DISABLEPASSWORDCHANGE; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Services\\LDAP\\LDAPClientIntegrity") == 0 ) { itemID = IDS_LDAPCLIENTINTEGRITY; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Services\\LanmanWorkstation\\Parameters\\RequireSecuritySignature") == 0 ) { itemID = IDS_REQUIRESECURITYSIGNATURE; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Services\\LanmanWorkstation\\Parameters\\EnableSecuritySignature") == 0 ) { itemID = IDS_ENABLESECURITYSIGNATURE; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Services\\LanmanWorkstation\\Parameters\\EnablePlainTextPassword") == 0 ) { itemID = IDS_ENABLEPLAINTEXTPASSWORD; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Services\\LanManServer\\Parameters\\RestrictNullSessAccess") == 0 ) { itemID = IDS_RESTRICTNULLSESSACCESS; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Services\\LanManServer\\Parameters\\RequireSecuritySignature") == 0 ) { itemID = IDS_SERREQUIRESECURITYSIGNATURE; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Services\\LanManServer\\Parameters\\NullSessionShares") == 0 ) { itemID = IDS_NULLSESSIONSHARES; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Services\\LanManServer\\Parameters\\NullSessionPipes") == 0 ) { itemID = IDS_NULLSESSIONPIPES; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Services\\LanManServer\\Parameters\\EnableSecuritySignature") == 0 ) { itemID = IDS_SERENABLESECURITYSIGNATURE; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Services\\LanManServer\\Parameters\\EnableForcedLogOff") == 0 ) { itemID = IDS_ENABLEFORCEDLOGOFF; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Services\\LanManServer\\Parameters\\AutoDisconnect") == 0 ) { itemID = IDS_AUTODISCONNECT; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\ProtectionMode") == 0 ) { itemID = IDS_PROTECTIONMODE; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\Memory Management\\ClearPageFileAtShutdown") == 0 ) { itemID = IDS_CLEARPAGEFILEATSHUTDOWN; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\Kernel\\ObCaseInsensitive") == 0 ) { itemID = IDS_OBCASEINSENSITIVE; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\SecurePipeServers\\Winreg\\AllowedPaths\\Machine") == 0 ) { itemID = IDS_MACHINE; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Print\\Providers\\LanMan Print Services\\Servers\\AddPrinterDrivers") == 0 ) { itemID = IDS_ADDPRINTERDRIVERS; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Lsa\\SubmitControl") == 0 ) { itemID = IDS_SUBMITCONTROL; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Lsa\\RestrictAnonymousSAM") == 0 ) { itemID = IDS_RESTRICTANONYMOUSSAM; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Lsa\\RestrictAnonymous") == 0 ) { itemID = IDS_RESTRICTANONYMOUS; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Lsa\\NoLMHash") == 0 ) { itemID = IDS_NOLMHASH; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Lsa\\NoDefaultAdminOwner") == 0 ) { itemID = IDS_NODEFAULTADMINOWNER; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Lsa\\MSV1_0\\NTLMMinServerSec") == 0 ) { itemID = IDS_NTLMMINSERVERSEC; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Lsa\\MSV1_0\\NTLMMinClientSec") == 0 ) { itemID = IDS_NTLMMINCLIENTSEC; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Lsa\\LmCompatibilityLevel") == 0 ) { itemID = IDS_LMCOMPATIBILITYLEVEL; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Lsa\\LimitBlankPasswordUse") == 0 ) { itemID = IDS_LIMITBLANKPASSWORDUSE; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Lsa\\FullPrivilegeAuditing") == 0 ) { itemID = IDS_FULLPRIVILEGEAUDITING; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Lsa\\ForceGuest") == 0 ) { itemID = IDS_FORCEGUEST; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Lsa\\FIPSAlgorithmPolicy") == 0 ) { itemID = IDS_FIPSALGORITHMPOLICY; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Lsa\\EveryoneIncludesAnonymous") == 0 ) { itemID = IDS_EVERYONEINCLUDESANONYMOUS; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Lsa\\DisableDomainCreds") == 0 ) { itemID = IDS_DISABLEDOMAINCREDS; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Lsa\\CrashOnAuditFail") == 0 ) { itemID = IDS_CRASHONAUDITFAIL; }else if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Lsa\\AuditBaseObjects") == 0 ) { itemID = IDS_AUDITBASEOBJECTS; }else if( _wcsicmp(szItem, L"MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\UndockWithoutLogon") == 0 ) { itemID = IDS_UNDOCKWITHOUTLOGON; }else if( _wcsicmp(szItem, L"MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\ShutdownWithoutLogon") == 0 ) { itemID = IDS_SHUTDOWNWITHOUTLOGON; }else if( _wcsicmp(szItem, L"MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\ScForceOption") == 0 ) { itemID = IDS_SCFORCEOPTION; }else if( _wcsicmp(szItem, L"MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\LegalNoticeText") == 0 ) { itemID = IDS_LEGALNOTICETEXT; }else if( _wcsicmp(szItem, L"MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\LegalNoticeCaption") == 0 ) { itemID = IDS_LEGALNOTICECAPTION; }else if( _wcsicmp(szItem, L"MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\DontDisplayLastUserName") == 0 ) { itemID = IDS_DONTDISPLAYLASTUSERNAME; }else if( _wcsicmp(szItem, L"MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\DisableCAD") == 0 ) { itemID = IDS_DISABLECAD; }else if( _wcsicmp(szItem, L"MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\ScRemoveOption") == 0 ) { itemID = IDS_SCREMOVEOPTION; }else if( _wcsicmp(szItem, L"MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\PasswordExpiryWarning") == 0 ) { itemID = IDS_PASSWORDEXPIRYWARNING; }else if( _wcsicmp(szItem, L"MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\ForceUnlockLogon") == 0 ) { itemID = IDS_FORCEUNLOCKLOGON; }else if( _wcsicmp(szItem, L"MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\CachedLogonsCount") == 0 ) { itemID = IDS_CACHEDLOGONSCOUNT; }else if( _wcsicmp(szItem, L"MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\AllocateFloppies") == 0 ) { itemID = IDS_ALLOCATEFLOPPIES; }else if( _wcsicmp(szItem, L"MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\AllocateDASD") == 0 ) { itemID = IDS_ALLOCATEDASD; }else if( _wcsicmp(szItem, L"MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\AllocateCDRoms") == 0 ) { itemID = IDS_ALLOCATECDROMS; }else if( _wcsicmp(szItem, L"MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Setup\\RecoveryConsole\\SetCommand") == 0 ) { itemID = IDS_SETCOMMAND; }else if( _wcsicmp(szItem, L"MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Setup\\RecoveryConsole\\SecurityLevel") == 0 ) { itemID = IDS_SECURITYLEVEL; }else if( _wcsicmp(szItem, L"MACHINE\\Software\\Microsoft\\Driver Signing\\Policy") == 0 ) { itemID = IDS_REGPOLICY; }else //Raid #652307, yanggao, 8/9/2002
if( _wcsicmp(szItem, L"MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\SubSystems\\optional") == 0 ) { itemID = IDS_OPTIONAL; }else if( _wcsicmp(szItem, L"MACHINE\\Software\\Policies\\Microsoft\\Windows\\Safer\\CodeIdentifiers\\AuthenticodeEnabled") == 0 ) { itemID = IDS_AUTHENTICODEENABLED; }else if( _wcsicmp(szItem, L"MACHINE\\Software\\Policies\\Microsoft\\Cryptography\\ForceKeyProtection") == 0 ) { itemID = IDS_FORCEHIGHPROTECTION; } return itemID; } //
// create registry value list under configuration node
//
void CSnapin::CreateProfileRegValueList(MMC_COOKIE cookie, PEDITTEMPLATE pSceInfo, LPDATAOBJECT pDataObj) { if ( !pSceInfo || !(pSceInfo->pTemplate) ) { return; }
DWORD nCount = pSceInfo->pTemplate->RegValueCount; PSCE_REGISTRY_VALUE_INFO regArray = pSceInfo->pTemplate->aRegValues;
CString strDisplayName; LPTSTR pDisplayName=NULL; DWORD displayType = 0; LPTSTR szUnits=NULL; PREGCHOICE pChoices=NULL; PREGFLAGS pFlags=NULL; CResult *pResult; long itemID = 0;
for ( DWORD i=0; i<nCount; i++) {
if ( !LookupRegValueProperty(regArray[i].FullValueName, &pDisplayName, &displayType, &szUnits, &pChoices, &pFlags) ) { continue; }
if ( !pDisplayName ) {
strDisplayName = regArray[i].FullValueName;
} else { strDisplayName = pDisplayName; LocalFree(pDisplayName); }
itemID = GetRegValueItemID(regArray[i].FullValueName);
//
// add this item
//
pResult = AddResultItem(strDisplayName, NULL, (LONG_PTR)&(regArray[i]), ITEM_PROF_REGVALUE, -1, cookie, false, szUnits, displayType, pSceInfo, pDataObj, NULL, itemID //assign an identifier to this item
);
if (pResult && pChoices) { pResult->SetRegChoices(pChoices); } if (pResult && pFlags) { pResult->SetRegFlags(pFlags); }
if ( szUnits ) { LocalFree(szUnits); } szUnits = NULL;
}
return; }
void CSnapin::CreateAnalysisRegValueList(MMC_COOKIE cookie, PEDITTEMPLATE pAnalTemp, PEDITTEMPLATE pEditTemp, LPDATAOBJECT pDataObj, RESULT_TYPES type) { if ( !pAnalTemp || !(pAnalTemp->pTemplate) || !pEditTemp || !(pEditTemp->pTemplate) ) {
return; }
DWORD nEditCount = pEditTemp->pTemplate->RegValueCount; // should be everything
PSCE_REGISTRY_VALUE_INFO paEdit = pEditTemp->pTemplate->aRegValues; PSCE_REGISTRY_VALUE_INFO paAnal = pAnalTemp->pTemplate->aRegValues;
CString strDisplayName; LPTSTR pDisplayName=NULL; DWORD displayType = 0; LPTSTR szUnits = NULL; PREGCHOICE pChoices = NULL; PREGFLAGS pFlags = NULL; CResult *pResult=NULL; long itemID = 0;
for ( DWORD i=0; i<nEditCount; i++) {
if ( !LookupRegValueProperty(paEdit[i].FullValueName, &pDisplayName, &displayType, &szUnits, &pChoices, &pFlags) ) { continue; }
if ( !pDisplayName ) {
strDisplayName = paEdit[i].FullValueName;
} else { strDisplayName = pDisplayName; LocalFree(pDisplayName); }
itemID = GetRegValueItemID(paEdit[i].FullValueName); //
// find the match in the analysis array
// should always find a match because all existing reg values are
// added to the array when getinfo is called
//
for ( DWORD j=0; j< pAnalTemp->pTemplate->RegValueCount; j++ ) {
if ( pAnalTemp->pTemplate->aRegValues && pAnalTemp->pTemplate->aRegValues[j].FullValueName && _wcsicmp(pAnalTemp->pTemplate->aRegValues[j].FullValueName, paEdit[i].FullValueName) == 0 ) {
if( reinterpret_cast<CFolder *>(cookie)->GetModeBits() & MB_LOCAL_POLICY ){ break; }
//
// find a analysis result - this item may be a mismatch (when Value is not NULL)
// SceEnumAllRegValues will set the status field to good if this item was not
// added because it did not exist when it was originally loaded from the SAP table.
// This tells us that this item is a MATCH and we should copy the value.
//
if ( !(paAnal[j].Value) && paEdit[i].Value && paAnal[j].Status != SCE_STATUS_ERROR_NOT_AVAILABLE && paAnal[j].Status != SCE_STATUS_NOT_ANALYZED ) {
//
// this is a good item, copy the config info as the analysis info
//
paAnal[j].Value = (PWSTR)LocalAlloc(0, (wcslen(paEdit[i].Value)+1)*sizeof(WCHAR));
if ( paAnal[j].Value ) { //This may not be a safe usage. Both paAnal[j].Value and paEdit[i].Value are LPTSTR. Consider fix.
wcscpy(paAnal[j].Value, paEdit[i].Value);
} else { // else out of memory
if ( szUnits ) { LocalFree(szUnits); } szUnits = NULL; return; } } break; } }
DWORD status = SCE_STATUS_GOOD; if ( j < pAnalTemp->pTemplate->RegValueCount ) { status = CEditTemplate::ComputeStatus( &paEdit[i], &pAnalTemp->pTemplate->aRegValues[j] ); } else { //
// did not find the analysis array, shouldn't happen
//
status = SCE_STATUS_NOT_CONFIGURED; }
//
// add this item
//
if ( j < pAnalTemp->pTemplate->RegValueCount) {
pResult = AddResultItem(strDisplayName, (LONG_PTR)&(pAnalTemp->pTemplate->aRegValues[j]), (LONG_PTR)&(paEdit[i]), type, status, cookie, false, szUnits, displayType, pEditTemp, pDataObj, NULL, itemID);
if (pResult && pChoices) { pResult->SetRegChoices(pChoices); } if (pResult && pFlags) { pResult->SetRegFlags(pFlags); } } else { //
// a good/not configured item
//
pResult = AddResultItem(strDisplayName, NULL, (LONG_PTR)&(paEdit[i]), type, status, cookie, false, szUnits, displayType, pEditTemp, pDataObj, NULL, itemID);
if (pResult && pChoices) { pResult->SetRegChoices(pChoices); } }
if ( szUnits ) { LocalFree(szUnits); } szUnits = NULL;
}
return; }
BOOL LookupRegValueProperty( IN LPTSTR RegValueFullName, OUT LPTSTR *pDisplayName, OUT PDWORD displayType, OUT LPTSTR *pUnits OPTIONAL, OUT PREGCHOICE *pChoices OPTIONAL, OUT PREGFLAGS *pFlags OPTIONAL ) { if ( !RegValueFullName || !pDisplayName || !displayType ) { return FALSE; }
CString strTmp = RegValueFullName;
//
// replace the \\ with / before search reg
//
int npos = strTmp.Find(L'\\');
while (npos > 0) { *(strTmp.GetBuffer(1)+npos) = L'/'; npos = strTmp.Find(L'\\'); }
//
// query the values from registry
//
*pDisplayName = NULL;
HKEY hKey=NULL; HKEY hKey2=NULL; DWORD rc = RegOpenKeyEx( HKEY_LOCAL_MACHINE, SCE_ROOT_REGVALUE_PATH, 0, KEY_READ, &hKey );
if (rc == ERROR_SUCCESS) {
rc = RegOpenKeyEx( hKey, (PWSTR)(LPCTSTR)strTmp, 0, KEY_READ, &hKey2 );
}
BOOL bRet;
if ( ERROR_SUCCESS == rc) {
DWORD RegType = 0; PWSTR Value=NULL; HRESULT hr = S_OK;
Value = (PWSTR) LocalAlloc(LPTR,MAX_PATH*sizeof(WCHAR)); if (Value) { //
// 126714 - shouldn't hard code display strings in the registry
// store them indirectly so they can support MUI
//
hr = SHLoadRegUIString(hKey2, SCE_REG_DISPLAY_NAME, Value, MAX_PATH); if (FAILED(hr)) { rc = MyRegQueryValue( hKey, (PWSTR)(LPCTSTR)strTmp, SCE_REG_DISPLAY_NAME, (PVOID *)&Value, &RegType ); } else { rc = ERROR_SUCCESS; } } if ( rc == ERROR_SUCCESS ) {
if ( Value ) { *pDisplayName = Value; Value = NULL; } else { //
// did not find correct display name, use the reg name (outsize)
//
*pDisplayName = NULL; } }
rc = MyRegQueryValue( hKey, (PWSTR)(LPCTSTR)strTmp, SCE_REG_DISPLAY_TYPE, (PVOID *)&displayType, &RegType );
if ( Value ) { LocalFree(Value); Value = NULL; }
if ( pUnits ) { //
// query the units
//
rc = MyRegQueryValue( hKey, (PWSTR)(LPCTSTR)strTmp, SCE_REG_DISPLAY_UNIT, (PVOID *)&Value, &RegType );
if ( rc == ERROR_SUCCESS ) {
if ( RegType == REG_SZ && Value ) { *pUnits = Value; Value = NULL; } else { //
// did not find units
//
*pUnits = NULL; } } if ( Value ) { LocalFree(Value); Value = NULL; } }
//
// find the registry key but may not find the display name
//
bRet = TRUE;
if ( pChoices ) { //
// query the choices
//
*pChoices = NULL;
rc = MyRegQueryValue(hKey, (PWSTR)(LPCTSTR)strTmp, SCE_REG_DISPLAY_CHOICES, (PVOID *)&Value, &RegType ); if (ERROR_SUCCESS == rc) { if ((REG_MULTI_SZ == RegType) && Value) { LPTSTR szChoice = NULL; LPTSTR szLabel = NULL; // max field size for szChoice + dwVal
DWORD dwVal = -1; PREGCHOICE pRegChoice = NULL; PREGCHOICE pLast = NULL;
szChoice = Value; do { //
// Divide szChoice into dwValue and szLabel sections
//
szLabel = _tcschr(szChoice,L'|'); if( szLabel == NULL ) //Raid #553113, yanggao
{ break; } *szLabel = L'\0'; szLabel++; if( szLabel == NULL ) //Raid #553113, yanggao
{ break; } dwVal = _ttoi(szChoice);
pRegChoice = (PREGCHOICE) LocalAlloc(LPTR,sizeof(REGCHOICE)); if (pRegChoice) { //
// Fill in fields of new reg choice
//
pRegChoice->dwValue = dwVal; pRegChoice->szName = (LPTSTR) LocalAlloc(LPTR,(lstrlen(szLabel)+1)*sizeof(TCHAR)); if (NULL == pRegChoice->szName) { //
// Out of memory. Bummer.
//
LocalFree(pRegChoice); pRegChoice = NULL; break; } //This is not a safe usage. Validate szLabel.
lstrcpy(pRegChoice->szName,szLabel); //
// Attach new item to end of list
//
if (NULL == *pChoices) { *pChoices = pRegChoice; } else { pLast->pNext = pRegChoice; } pLast = pRegChoice; } szChoice = _tcschr(szLabel,L'\0'); if( szChoice == NULL ) { break; } szChoice++; } while (*szChoice); } else { //
// Did not find choices
//
bRet = FALSE; } }
if ( Value ) { LocalFree(Value); Value = NULL; }
}
if ( pFlags ) { //
// query the Flags
//
*pFlags = NULL;
rc = MyRegQueryValue(hKey, (PWSTR)(LPCTSTR)strTmp, SCE_REG_DISPLAY_FLAGLIST, (PVOID *)&Value, &RegType ); if (ERROR_SUCCESS == rc) { if ((REG_MULTI_SZ == RegType) && Value) { LPTSTR szFlag = NULL; LPTSTR szLabel = NULL; // max field size for szFlag + dwVal
DWORD dwVal = -1; PREGFLAGS pRegFlag = NULL; PREGFLAGS pLast = NULL;
szFlag = Value; do { //
// Divide szFlag into dwValue and szLabel sections
//
szLabel = _tcschr(szFlag,L'|'); if( szLabel == NULL ) //Raid #553113, yanggao
{ break; } *szLabel = L'\0'; szLabel++; if( szLabel == NULL ) //Raid #553113, yanggao
{ break; } dwVal = _ttoi(szFlag);
pRegFlag = (PREGFLAGS) LocalAlloc(LPTR,sizeof(REGFLAGS)); if (pRegFlag) { //
// Fill in fields of new reg Flag
//
pRegFlag->dwValue = dwVal; pRegFlag->szName = (LPTSTR) LocalAlloc(LPTR,(lstrlen(szLabel)+1)*sizeof(TCHAR)); if (NULL == pRegFlag->szName) { //
// Out of memory. Bummer.
//
LocalFree(pRegFlag); pRegFlag = NULL; break; } //This is not a safe usage. need to validate szLabel.
lstrcpy(pRegFlag->szName,szLabel); //
// Attach new item to end of list
//
if (NULL == *pFlags) { *pFlags = pRegFlag; } else { pLast->pNext = pRegFlag; } pLast = pRegFlag; } szFlag = wcschr(szLabel,L'\0'); if( szFlag == NULL ) { break; } szFlag++;
} while (*szFlag); } else { //
// Did not find Flags
//
bRet = FALSE; } }
if ( Value ) { LocalFree(Value); Value = NULL; }
} } else { //
// did not find the registry key
//
bRet = FALSE; }
if ( hKey ) { RegCloseKey(hKey); } if ( hKey2 ) { RegCloseKey(hKey2); }
return bRet; }
|