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.
 
 
 
 
 
 

171 lines
5.1 KiB

#include <TChar.h>
#include <StdLib.h>
#include <Windows.h>
#include <Folders.h>
namespace nsFolders
{
const _TCHAR REGKEY_MCSHKCU[] = _T("Software\\Mission Critical Software\\EnterpriseAdmin");
const _TCHAR REGKEY_MSHKCU[] = _T("Software\\ADMT\\EnterpriseAdmin");
const _TCHAR REGKEY_MSADMT[] = _T("Software\\Microsoft\\ADMT");
const _TCHAR REGKEY_MCSADMT[] = _T("Software\\Mission Critical Software\\DomainAdmin");
const _TCHAR REGKEY_ADMT[] = _T("Software\\Microsoft\\ADMT");
const _TCHAR REGKEY_REPORTING[] = _T("Software\\Microsoft\\ADMT\\Reporting");
const _TCHAR REGKEY_EXTENSIONS[] = _T("Software\\Microsoft\\ADMT\\Extensions");
const _TCHAR REGVAL_DIRECTORY[] = _T("Directory");
const _TCHAR REGVAL_DIRECTORY_MIGRATIONLOG[] = _T("DirectoryMigrationLog");
const _TCHAR REGVAL_REGISTRYUPDATED[] = _T("RegistryUpdated");
const _TCHAR REGKEY_APPLICATION_LOG[] = _T("System\\CurrentControlSet\\Services\\EventLog\\Application");
const _TCHAR REGKEY_ADMTAGENT_EVENT_SOURCE[] = _T("ADMTAgent");
const _TCHAR REGVAL_EVENT_CATEGORYCOUNT[] = _T("CategoryCount");
const _TCHAR REGVAL_EVENT_CATEGORYMESSAGEFILE[] = _T("CategoryMessageFile");
const _TCHAR REGVAL_EVENT_EVENTMESSAGEFILE[] = _T("EventMessageFile");
const _TCHAR REGVAL_EVENT_TYPESSUPPORTED[] = _T("TypesSupported");
const _TCHAR REGKEY_CURRENT_VERSION[] = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion");
const _TCHAR REGVAL_PROGRAM_FILES_DIRECTORY[] = _T("ProgramFilesDir");
const _TCHAR REGVAL_EXCHANGE_LDAP_PORT[] = _T("ExchangeLDAPPort");
const _TCHAR REGVAL_EXCHANGE_SSL_PORT[] = _T("ExchangeSSLPort");
const _TCHAR REGVAL_ALLOW_NON_CLOSEDSET_MOVE[] = _T("AllowNonClosedSetMove");
const _TCHAR DIR_LOGS[] = _T("Logs");
const _TCHAR DIR_REPORTS[] = _T("Reports");
const _TCHAR FNAME_MIGRATION[] = _T("Migration");
const _TCHAR FNAME_DISPATCH[] = _T("Dispatch");
const _TCHAR EXT_LOG[] = _T(".log");
_bstr_t __stdcall GetPath(LPCTSTR pszRegKey, LPCTSTR pszRegVal, LPCTSTR pszDir, LPCTSTR pszFName = NULL, LPCTSTR pszExt = NULL);
}
using namespace nsFolders;
// GetLogsFolder Method
//
// Retrieves default Logs folder.
_bstr_t __stdcall GetLogsFolder()
{
return GetPath(REGKEY_ADMT, REGVAL_DIRECTORY, DIR_LOGS);
}
// GetReportsFolder Method
//
// Retrieves default Reports folder and also creates folder if it doesn't exist.
_bstr_t __stdcall GetReportsFolder()
{
_bstr_t strFolder = GetPath(REGKEY_REPORTING, REGVAL_DIRECTORY, DIR_REPORTS);
if (strFolder.length())
{
if (!CreateDirectory(strFolder, NULL))
{
DWORD dwError = GetLastError();
if (dwError != ERROR_ALREADY_EXISTS)
{
_com_issue_error(HRESULT_FROM_WIN32(dwError));
}
}
}
return strFolder;
}
// GetMigrationLogPath Method
//
// Retrieves path to migration log. First tries user specified path and then default path.
_bstr_t __stdcall GetMigrationLogPath()
{
// retrieve user specified path
_bstr_t strPath = GetPath(REGKEY_ADMT, REGVAL_DIRECTORY_MIGRATIONLOG, NULL, FNAME_MIGRATION, EXT_LOG);
// if user path not specified...
if (strPath.length() == 0)
{
// then retrieve default path
strPath = GetPath(REGKEY_ADMT, REGVAL_DIRECTORY, DIR_LOGS, FNAME_MIGRATION, EXT_LOG);
}
return strPath;
}
// GetDispatchLogPath Method
//
// Retrieves default path to dispatch log.
_bstr_t __stdcall GetDispatchLogPath()
{
return GetPath(REGKEY_ADMT, REGVAL_DIRECTORY, DIR_LOGS, FNAME_DISPATCH, EXT_LOG);
}
namespace nsFolders
{
// GetPath Function
//
// This function attempts to generate a complete path to a folder or file. The function first retrieves
// a folder path from the specified registry value. If a sub-folder is specified then the sub-folder is
// concatenated onto the path. If file name and/or file name extension is specified then they are also
// concatenated onto the path. The function returns an empty string if unable to query the specified
// registry value.
_bstr_t __stdcall GetPath(LPCTSTR pszRegKey, LPCTSTR pszRegVal, LPCTSTR pszDir, LPCTSTR pszFName, LPCTSTR pszExt)
{
_TCHAR szPath[_MAX_PATH];
_TCHAR szDrive[_MAX_DRIVE];
_TCHAR szDir[_MAX_DIR];
memset(szPath, 0, sizeof(szPath));
HKEY hKey;
DWORD dwError = RegOpenKey(HKEY_LOCAL_MACHINE, pszRegKey, &hKey);
if (dwError == ERROR_SUCCESS)
{
DWORD cbPath = sizeof(szPath);
dwError = RegQueryValueEx(hKey, pszRegVal, NULL, NULL, (LPBYTE)szPath, &cbPath);
if (dwError == ERROR_SUCCESS)
{
// if the path does not contain a trailing backslash character the
// splitpath function assumes the last component of the path is a file name
// this function assumes that only folder paths are specified in the registry
if (szPath[_tcslen(szPath) - 1] != _T('\\'))
{
_tcscat(szPath, _T("\\"));
}
_tsplitpath(szPath, szDrive, szDir, NULL, NULL);
// if sub-folder specified then add to path
if (pszDir)
{
_tcscat(szDir, pszDir);
}
_tmakepath(szPath, szDrive, szDir, pszFName, pszExt);
}
RegCloseKey(hKey);
}
return szPath;
}
}