windows-nt/Source/XPSP1/NT/admin/pchealth/helpctr/rc/unattend/unattend.cpp
2020-09-26 16:20:57 +08:00

268 lines
7.6 KiB
C++

/*
Copyright (c) 2000 Microsoft Corporation
Module Name:
UnAttend.cpp
Abstract:
Reads entries from the ini file and adds them to the registry.We assume that the
ini file key name and registry key name are the same.
Revision History:
created a-josem 12/11/00
revised a-josem 12/12/00 Changed TCHAR to WCHAR, moved the global variables to
local scope.
*/
#include "UnAttend.h"
/*
This generic structure has the Key Name, datatype of the key and iterate says if
the Key Name is to be appended with 1,2,3.. or used directly.
*/
struct RegEntries
{
WCHAR strIniKey[MAX_PATH];//Name of the key in the Ini file
WCHAR strKey[MAX_PATH]; //Name of the key in the registry
DWORD dwType; //Type of the key to be used when writing into the registry
BOOL bIterate; //TRUE or FALSE for iterating 1,2,3,....
};
#define ARRAYSIZE(a) (sizeof(a)/sizeof(*a))
//Section name in the registry.
static const WCHAR strSection[] = L"PCHealth";
static const WCHAR strErrorReportingSubKey[] = L"SOFTWARE\\Microsoft\\PCHealth\\ErrorReporting\\";
static const RegEntries ErrorReportingRegEntries[] =
{
{L"ER_Display_UI",L"ShowUI",REG_DWORD,FALSE},
{L"ER_Enable_Kernel_Errors",L"IncludeKernelFaults",REG_DWORD,FALSE},
{L"ER_Enable_Reporting",L"DoReport",REG_DWORD,FALSE},
{L"ER_Enable_Windows_Components",L"IncludeWindowsApps",REG_DWORD,FALSE},
{L"ER_Include_MSApps",L"IncludeMicrosoftApps",REG_DWORD,FALSE},
{L"ER_ Force_Queue_Mode",L"ForceQueueMode",REG_DWORD,FALSE},
{L"ER_ Include_Shutdowns_Errs",L"IncludeShutdownsErrs",REG_DWORD,FALSE},
};
static const WCHAR strExclusionSubKey[] = L"SOFTWARE\\Microsoft\\PCHealth\\ErrorReporting\\ExclusionList\\";
static const RegEntries ExclusionRegEntries[] =
{
{L"ER_Exclude_EXE",L"",REG_DWORD,TRUE}
};
static const WCHAR strInclusionSubKey[] = L"SOFTWARE\\Microsoft\\PCHealth\\ErrorReporting\\InclusionList\\";
static const RegEntries InclusionRegEntries[] =
{
{L"ER_Include_EXE",L"",REG_DWORD,TRUE}
};
static const WCHAR strDWSubKey[] = L"SOFTWARE\\Microsoft\\PCHealth\\ErrorReporting\\DW\\";
static const RegEntries DWRegEntries[] =
{
{L"ER_Report_Path",L"DWFileTreeRoot",REG_SZ,FALSE},
{L"ER_No_External_URLs",L"DWNoExternalURL",REG_DWORD,FALSE},
{L"ER_No_File_Collection",L"DWNoFileCollection",REG_DWORD,FALSE},
{L"ER_No_Data_Collection",L"DWNoSecondLevelCollection",REG_DWORD,FALSE},
};
static const WCHAR strTerminalServerSubKey[] = L"SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\";
static const RegEntries TerminalServerRegEntries[] =
{
{L"RA_AllowToGetHelp",L"fAllowToGetHelp",REG_DWORD,FALSE},
{L"RA_AllowUnSolicited",L"fAllowUnsolicited",REG_DWORD,FALSE},
{L"RA_AllowFullControl",L"fAllowFullControl",REG_DWORD,FALSE},
{L"RA_AllowRemoteAssistance",L"fAllowRemoteAssistance",REG_DWORD,FALSE},
{L"RA_MaxTicketExpiry",L"MaxTicketExpiry",REG_DWORD,FALSE},
};
/*++
Routine Description:
Reads ini file and adds those values in the registry
Arguments:
lpstrSubKey - SubKey under which the entries are to be made.
arrRegEntries - Array of RegEntries structure
nCount - Count of elements in the array.
Return Value:
TRUE or FALSE depending on the Registry key opening.
--*/
static BOOL UnAttendedSetup(LPCWSTR lpstrSubKey,const RegEntries *arrRegEntries,int nCount)
{
//Ini File Path Temprorary path will be overwritten.
WCHAR strFilePath[MAX_PATH];// = L"C:\\PCHealth.ini";
BOOL fRetVal = TRUE;
HKEY hKey = NULL;
//The Key already exists just open the key.
// BUGBUG: Change this to Create
// Did the changes
DWORD dwDisposition = 0;
if (ERROR_SUCCESS != ::RegCreateKeyEx(HKEY_LOCAL_MACHINE,lpstrSubKey,0,NULL,
REG_OPTION_VOLATILE,KEY_WRITE,NULL,&hKey,&dwDisposition))
{
fRetVal = FALSE;
goto doneUnAttend;
}
//Comment out the following three lines for testing purposes.
GetSystemDirectory(strFilePath,MAX_PATH);
lstrcat(strFilePath,TEXT("\\"));
lstrcat(strFilePath,WINNT_GUI_FILE);
///////
WCHAR strRetVal[MAX_PATH];
for (int nIndex = 0; nIndex < nCount; nIndex++)
{
if (arrRegEntries[nIndex].bIterate == FALSE)
{
if (GetPrivateProfileString(strSection,arrRegEntries[nIndex].strIniKey,
NULL,strRetVal,MAX_PATH,strFilePath) != 0)
{
if (arrRegEntries[nIndex].dwType == REG_DWORD)
{
DWORD nVal = 0;
nVal = _wtoi(strRetVal);
RegSetValueEx(hKey,arrRegEntries[nIndex].strKey,0,REG_DWORD,
(unsigned char *)&nVal,sizeof(DWORD));
}
else if (arrRegEntries[nIndex].dwType == REG_SZ)
{
RegSetValueEx(hKey,arrRegEntries[nIndex].strKey,0,REG_SZ,
(LPBYTE)strRetVal, (lstrlen(strRetVal) + 1) * sizeof(WCHAR) );
}
}
}
else
{
if(arrRegEntries[nIndex].dwType == REG_DWORD)
{
int nCount = 0;
int nFileIndex = 0;
do
{
WCHAR strFileTagName[MAX_PATH];
WCHAR strI[10];
lstrcpy(strFileTagName,arrRegEntries[nIndex].strIniKey);
_itow(++nFileIndex,strI,10);
lstrcat(strFileTagName,strI);
nCount = GetPrivateProfileString(strSection,strFileTagName,0,
strRetVal,MAX_PATH,strFilePath);
if (nCount)
{
DWORD dwVal = 1;
RegSetValueEx(hKey,strRetVal,0,REG_DWORD,
(unsigned char*)&dwVal,sizeof(DWORD));
}
}while(nCount);
}
}
}
doneUnAttend:
if (hKey)
RegCloseKey(hKey);
return fRetVal;
}
/*++
Routine Description:
Handles the special case of ER_Enable_Application
Arguments:
lpstrSubKey - SubKey under which the entries are to be made.
Return Value:
TRUE or FALSE depending on the Registry key opening.
--*/
static BOOL SpecialCases(LPCWSTR lpstrSubKey)
{
//Ini File Path temprorary path will be overwritten.
WCHAR strFilePath[MAX_PATH];// = L"C:\\PCHealth.ini";
BOOL fRetVal = TRUE;
//Handling special cases
WCHAR strRetVal[MAX_PATH];
HKEY hKey = NULL;
DWORD dwDisposition = 0;
if (ERROR_SUCCESS != ::RegCreateKeyEx(HKEY_LOCAL_MACHINE,lpstrSubKey,0,NULL,
REG_OPTION_VOLATILE,KEY_WRITE,NULL,&hKey,&dwDisposition))
{
fRetVal = FALSE;
goto done;
}
//Comment out the following three lines for testing purposes.
GetSystemDirectory(strFilePath,MAX_PATH);
lstrcat(strFilePath,TEXT("\\"));
lstrcat(strFilePath,WINNT_GUI_FILE);
///////
if (GetPrivateProfileString(strSection,TEXT("ER_Enable_Applications"),NULL,
strRetVal,MAX_PATH,strFilePath) != 0)
{
DWORD nVal = 0;
if (!lstrcmpi(L"all",strRetVal))
{
nVal = 1;
RegSetValueEx(hKey,L"AllOrNone",0,REG_DWORD,
(unsigned char *)&nVal,sizeof(DWORD));
}
else if (!lstrcmpi(L"Listed",strRetVal))
{
nVal = 0;
RegSetValueEx(hKey,L"AllOrNone",0,REG_DWORD,
(unsigned char *)&nVal,sizeof(DWORD));
}
else if (!lstrcmpi(L"None",strRetVal))
{
nVal = 2;
RegSetValueEx(hKey,L"AllOrNone",0,REG_DWORD,
(unsigned char *)&nVal,sizeof(DWORD));
}
}
done:
if (hKey)
RegCloseKey(hKey);
return fRetVal;
}
/*++
Routine Description:
To be called from Register Server.
Arguments:
None
Return Value:
TRUE or FALSE depending on the Registry key opening.
--*/
BOOL PCHealthUnAttendedSetup()
{
BOOL bRetVal1,bRetVal2,bRetVal3,bRetVal4,bRetVal5;
SpecialCases(strErrorReportingSubKey);
bRetVal1 = UnAttendedSetup(strErrorReportingSubKey,
ErrorReportingRegEntries,ARRAYSIZE(ErrorReportingRegEntries));
bRetVal2 = UnAttendedSetup(strExclusionSubKey,ExclusionRegEntries,
ARRAYSIZE(ExclusionRegEntries));
bRetVal3 = UnAttendedSetup(strInclusionSubKey,InclusionRegEntries,
ARRAYSIZE(InclusionRegEntries));
bRetVal4 = UnAttendedSetup(strDWSubKey,DWRegEntries,ARRAYSIZE(DWRegEntries));
bRetVal5 = UnAttendedSetup(strTerminalServerSubKey,TerminalServerRegEntries,
ARRAYSIZE(TerminalServerRegEntries));
if ((bRetVal1== TRUE) && (bRetVal2 == TRUE) && (bRetVal3 == TRUE) &&
(bRetVal4 == TRUE) && (bRetVal5 == TRUE))
return TRUE;
else
return FALSE;
}