1213 lines
36 KiB
C++
1213 lines
36 KiB
C++
#include "stdafx.h"
|
|
#include <loadperf.h>
|
|
#include <aclapi.h>
|
|
#include "setupapi.h"
|
|
#include "log.h"
|
|
#include "iiscnfg.h"
|
|
#include "iadmw.h"
|
|
#include "mdkey.h"
|
|
|
|
#define DBL_UNDEFINED ((DWORD)-1)
|
|
DWORD gDebugLevel = DBL_UNDEFINED;
|
|
extern MyLogFile g_MyLogFile;
|
|
|
|
// Forward references
|
|
DWORD SetAdminACL_wrap(LPCTSTR szKeyPath, DWORD dwAccessForEveryoneAccount, BOOL bDisplayMsgOnErrFlag);
|
|
DWORD WriteSDtoMetaBase(PSECURITY_DESCRIPTOR outpSD, LPCTSTR szKeyPath);
|
|
DWORD GetPrincipalSID (LPTSTR Principal, PSID *Sid, BOOL *pbWellKnownSID);
|
|
DWORD SetAdminACL(LPCTSTR szKeyPath, DWORD dwAccessForEveryoneAccount);
|
|
|
|
void DebugOutputFile(TCHAR* pszTemp)
|
|
{
|
|
//
|
|
// NT5 doesn't want us to put all the debug string
|
|
// in debugger. So we skip them based on a regkey.
|
|
// See GetDebugLevel().
|
|
// Todo: Log strings to a logfile!!!
|
|
// See IIS log.h, log.cpp for examples!
|
|
//
|
|
g_MyLogFile.LogFileWrite(pszTemp);
|
|
if (gDebugLevel == DBL_UNDEFINED) {gDebugLevel = GetDebugLevel();}
|
|
if (gDebugLevel)
|
|
{
|
|
OutputDebugString(pszTemp);
|
|
}
|
|
|
|
}
|
|
|
|
void DebugOutput(LPCTSTR szFormat, ...)
|
|
{
|
|
va_list marker;
|
|
TCHAR szTemp[1024];
|
|
|
|
// Encompass this whole iisdebugout deal in a try-catch.
|
|
// not too good to have this one access violating.
|
|
// when trying to produce a debugoutput!
|
|
__try
|
|
{
|
|
va_start( marker, szFormat );
|
|
vswprintf(szTemp, szFormat, marker );
|
|
lstrcat(szTemp, _T("\n"));
|
|
va_end( marker );
|
|
}
|
|
__except(EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
TCHAR szErrorString[100];
|
|
_stprintf(szErrorString, _T("\r\n\r\nException Caught in DebugOutput(). GetExceptionCode()=0x%x.\r\n\r\n"), GetExceptionCode());
|
|
OutputDebugString(szErrorString);
|
|
g_MyLogFile.LogFileWrite(szErrorString);
|
|
}
|
|
|
|
// output to log file and the screen.
|
|
DebugOutputFile(szTemp);
|
|
|
|
return;
|
|
}
|
|
|
|
// This function requires inputs like this:
|
|
// iisDebugOutSafeParams2("this %1!s! is %2!s! and has %3!d! args", "function", "kool", 3);
|
|
// you must specify the %1 deals. this is so that
|
|
// if something like this is passed in "this %SYSTEMROOT% %1!s!", it will put the string into %1 not %s!
|
|
void DebugOutputSafe(TCHAR *pszfmt, ...)
|
|
{
|
|
// The count of parameters do not match
|
|
va_list va;
|
|
TCHAR *pszFullErrMsg = NULL;
|
|
|
|
va_start(va, pszfmt);
|
|
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_STRING,
|
|
(LPCVOID) pszfmt,
|
|
0,
|
|
0,
|
|
(LPTSTR) &pszFullErrMsg,
|
|
0,
|
|
&va);
|
|
if (pszFullErrMsg)
|
|
{
|
|
// output to log file and the screen.
|
|
DebugOutputFile(pszFullErrMsg);
|
|
}
|
|
va_end(va);
|
|
|
|
if (pszFullErrMsg) {LocalFree(pszFullErrMsg);pszFullErrMsg=NULL;}
|
|
return;
|
|
}
|
|
|
|
|
|
BOOL IsFileExist(LPCTSTR szFile)
|
|
{
|
|
return (GetFileAttributes(szFile) != 0xFFFFFFFF);
|
|
}
|
|
|
|
BOOL InetDeleteFile(LPCTSTR szFileName)
|
|
{
|
|
// if file exists but DeleteFile() fails
|
|
if (IsFileExist(szFileName) && !(::DeleteFile(szFileName)))
|
|
{
|
|
// if we cannot delete it, then move delay until reboot
|
|
// move it to top level dir on the same drive, and mark it as hidden
|
|
// Note: MoveFileEx() works only on the same drive if dealing with file-in-use
|
|
TCHAR TmpName[_MAX_PATH];
|
|
TCHAR csTmpPath[5] = _T("C:\\.");
|
|
csTmpPath[0] = *szFileName;
|
|
if ( GetTempFileName( (LPCTSTR)csTmpPath, _T("INT"), 0, TmpName ) == 0 ||
|
|
!MoveFileEx( szFileName, TmpName, MOVEFILE_REPLACE_EXISTING|MOVEFILE_COPY_ALLOWED|MOVEFILE_WRITE_THROUGH ) ) {
|
|
return FALSE;
|
|
}
|
|
MoveFileEx( TmpName, NULL, MOVEFILE_DELAY_UNTIL_REBOOT );
|
|
SetFileAttributes(TmpName, FILE_ATTRIBUTE_HIDDEN);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// Given a fullpathname of a directory, remove any empty dirs under it including itself
|
|
|
|
BOOL RecRemoveEmptyDir(LPCTSTR szName)
|
|
{
|
|
DWORD retCode;
|
|
BOOL fRemoveDir = TRUE;
|
|
WIN32_FIND_DATA FindFileData;
|
|
HANDLE hFile = INVALID_HANDLE_VALUE;
|
|
TCHAR szSubDir[_MAX_PATH] = _T("");
|
|
TCHAR szDirName[_MAX_PATH] = _T("");
|
|
|
|
retCode = GetFileAttributes(szName);
|
|
|
|
if (retCode == 0xFFFFFFFF || !(retCode & FILE_ATTRIBUTE_DIRECTORY))
|
|
return FALSE;
|
|
|
|
_stprintf(szDirName, _T("%s\\*"), szName);
|
|
hFile = FindFirstFile(szDirName, &FindFileData);
|
|
|
|
if (hFile != INVALID_HANDLE_VALUE)
|
|
{
|
|
do
|
|
{
|
|
if (_tcsicmp(FindFileData.cFileName, _T(".")) != 0 &&
|
|
_tcsicmp(FindFileData.cFileName, _T("..")) != 0 )
|
|
{
|
|
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
|
|
_stprintf(szSubDir, _T("%s\\%s"), szName, FindFileData.cFileName);
|
|
fRemoveDir = RecRemoveEmptyDir(szSubDir) && fRemoveDir;
|
|
}
|
|
else
|
|
{
|
|
CString csFileName = FindFileData.cFileName;
|
|
CString csPrefix = csFileName.Left(3);
|
|
CString csSuffix = csFileName.Right(4);
|
|
if (_tcsicmp(csPrefix, _T("INT")) == 0 &&
|
|
_tcsicmp(csSuffix, _T(".tmp")) == 0 )
|
|
{
|
|
// this is an INT*.tmp created by IIS
|
|
_stprintf(szSubDir, _T("%s\\%s"), szName, FindFileData.cFileName);
|
|
if (!::DeleteFile(szSubDir))
|
|
fRemoveDir = FALSE; // this dir is not empty
|
|
} else
|
|
fRemoveDir = FALSE; // it is a file, this Dir is not empty
|
|
}
|
|
}
|
|
|
|
if (!FindNextFile(hFile, &FindFileData))
|
|
{
|
|
FindClose(hFile);
|
|
break;
|
|
}
|
|
} while (TRUE);
|
|
}
|
|
|
|
if (fRemoveDir)
|
|
return( ::RemoveDirectory(szName) );
|
|
else
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
// Given a fullpathname of a directory, remove the directory node
|
|
|
|
BOOL RecRemoveDir(LPCTSTR szName)
|
|
{
|
|
DWORD retCode;
|
|
WIN32_FIND_DATA FindFileData;
|
|
HANDLE hFile = INVALID_HANDLE_VALUE;
|
|
TCHAR szSubDir[_MAX_PATH] = _T("");
|
|
TCHAR szDirName[_MAX_PATH] = _T("");
|
|
|
|
retCode = GetFileAttributes(szName);
|
|
|
|
if (retCode == 0xFFFFFFFF)
|
|
return FALSE;
|
|
|
|
if (!(retCode & FILE_ATTRIBUTE_DIRECTORY)) {
|
|
InetDeleteFile(szName);
|
|
return TRUE;
|
|
}
|
|
|
|
_stprintf(szDirName, _T("%s\\*"), szName);
|
|
hFile = FindFirstFile(szDirName, &FindFileData);
|
|
|
|
if (hFile != INVALID_HANDLE_VALUE) {
|
|
do {
|
|
if ( _tcsicmp(FindFileData.cFileName, _T(".")) != 0 &&
|
|
_tcsicmp(FindFileData.cFileName, _T("..")) != 0 ) {
|
|
_stprintf(szSubDir, _T("%s\\%s"), szName, FindFileData.cFileName);
|
|
RecRemoveDir(szSubDir);
|
|
}
|
|
|
|
if ( !FindNextFile(hFile, &FindFileData) ) {
|
|
FindClose(hFile);
|
|
break;
|
|
}
|
|
} while (TRUE);
|
|
}
|
|
|
|
return( ::RemoveDirectory(szName) );
|
|
}
|
|
|
|
INT InstallPerformance(
|
|
CString nlsRegPerf,
|
|
CString nlsDll,
|
|
CString nlsOpen,
|
|
CString nlsClose,
|
|
CString nlsCollect )
|
|
{
|
|
INT err = NERR_Success;
|
|
|
|
if (theApp.m_eOS != OS_W95) {
|
|
CRegKey regPerf( nlsRegPerf, HKEY_LOCAL_MACHINE );
|
|
if (regPerf)
|
|
{
|
|
regPerf.SetValue(_T("Library"), nlsDll );
|
|
regPerf.SetValue(_T("Open"), nlsOpen );
|
|
regPerf.SetValue(_T("Close"), nlsClose );
|
|
regPerf.SetValue(_T("Collect"), nlsCollect );
|
|
}
|
|
}
|
|
|
|
return(err);
|
|
}
|
|
//
|
|
// Add eventlog to the registry
|
|
//
|
|
|
|
INT AddEventLog(CString nlsService, CString nlsMsgFile, DWORD dwType)
|
|
{
|
|
INT err = NERR_Success;
|
|
CString nlsLog = REG_EVENTLOG;
|
|
nlsLog += _T("\\");
|
|
nlsLog += nlsService;
|
|
|
|
CRegKey regService( nlsLog, HKEY_LOCAL_MACHINE );
|
|
if ( regService ) {
|
|
regService.SetValue( _T("EventMessageFile"), nlsMsgFile, TRUE );
|
|
regService.SetValue( _T("TypesSupported"), dwType );
|
|
}
|
|
return(err);
|
|
}
|
|
|
|
//
|
|
// Remove eventlog from the registry
|
|
//
|
|
|
|
INT RemoveEventLog( CString nlsService )
|
|
{
|
|
INT err = NERR_Success;
|
|
CString nlsLog = REG_EVENTLOG;
|
|
|
|
CRegKey regService( HKEY_LOCAL_MACHINE, nlsLog );
|
|
if ( regService )
|
|
regService.DeleteTree( nlsService );
|
|
return(err);
|
|
}
|
|
|
|
//
|
|
// Install SNMP agent to the registry
|
|
//
|
|
|
|
INT InstallAgent( CString nlsName, CString nlsPath )
|
|
{
|
|
INT err = NERR_Success;
|
|
do
|
|
{
|
|
CString nlsSnmpParam = REG_SNMPPARAMETERS;
|
|
CRegKey regSnmpParam( HKEY_LOCAL_MACHINE, nlsSnmpParam );
|
|
if ( regSnmpParam == (HKEY)NULL )
|
|
break;
|
|
|
|
CString nlsSoftwareMSFT = REG_SOFTWAREMSFT;
|
|
CRegKey regSoftwareMSFT( HKEY_LOCAL_MACHINE, nlsSoftwareMSFT );
|
|
if ( (HKEY) NULL == regSoftwareMSFT )
|
|
break;
|
|
|
|
// add agent key
|
|
CRegKey regAgent( nlsName, regSoftwareMSFT );
|
|
if ( (HKEY) NULL == regAgent )
|
|
break;
|
|
|
|
CString nlsCurVersion = REG_CURVERSION;
|
|
CRegKey regAgentCurVersion( nlsCurVersion, regAgent );
|
|
if ((HKEY) NULL == regAgentCurVersion )
|
|
break;
|
|
|
|
regAgentCurVersion.SetValue(_T("Pathname"), nlsPath );
|
|
|
|
CRegKey regAgentParam( nlsName, regSnmpParam );
|
|
if ((HKEY) NULL == regAgentParam )
|
|
break;
|
|
|
|
CString nlsSnmpExt = REG_SNMPEXTAGENT;
|
|
CRegKey regSnmpExt( nlsSnmpExt, HKEY_LOCAL_MACHINE );
|
|
if ((HKEY) NULL == regSnmpExt )
|
|
break;
|
|
|
|
// find the first available number slot
|
|
for ( INT i=0; ;i++ )
|
|
{
|
|
CString nlsPos;
|
|
nlsPos.Format( _T("%d"),i);
|
|
CString nlsValue;
|
|
|
|
if ( regSnmpExt.QueryValue( nlsPos, nlsValue ) != NERR_Success )
|
|
{
|
|
// okay, an empty spot
|
|
nlsValue.Format(_T("%s\\%s\\%s"),
|
|
REG_SOFTWAREMSFT,
|
|
(LPCTSTR)nlsName,
|
|
REG_CURVERSION );
|
|
|
|
regSnmpExt.SetValue( nlsPos, nlsValue );
|
|
break;
|
|
} else
|
|
{
|
|
if ( nlsValue.Find( nlsName) != (-1))
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
} while (FALSE);
|
|
return(err);
|
|
}
|
|
|
|
//
|
|
// Remove an SNMP agent from the registry
|
|
//
|
|
|
|
INT RemoveAgent( CString nlsServiceName )
|
|
{
|
|
INT err = NERR_Success;
|
|
do
|
|
{
|
|
CString nlsSoftwareAgent = REG_SOFTWAREMSFT;
|
|
|
|
CRegKey regSoftwareAgent( HKEY_LOCAL_MACHINE, nlsSoftwareAgent );
|
|
if ((HKEY)NULL == regSoftwareAgent )
|
|
break;
|
|
regSoftwareAgent.DeleteTree( nlsServiceName );
|
|
|
|
CString nlsSnmpParam = REG_SNMPPARAMETERS;
|
|
|
|
CRegKey regSnmpParam( HKEY_LOCAL_MACHINE, nlsSnmpParam );
|
|
if ((HKEY) NULL == regSnmpParam )
|
|
break;
|
|
regSnmpParam.DeleteTree( nlsServiceName );
|
|
|
|
CString nlsSnmpExt = REG_SNMPEXTAGENT;
|
|
CRegKey regSnmpExt( HKEY_LOCAL_MACHINE, nlsSnmpExt );
|
|
if ((HKEY) NULL == regSnmpExt )
|
|
break;
|
|
|
|
CRegValueIter enumSnmpExt( regSnmpExt );
|
|
|
|
CString strName;
|
|
DWORD dwType;
|
|
CString csServiceName;
|
|
|
|
csServiceName = _T("\\") + nlsServiceName;
|
|
csServiceName += _T("\\");
|
|
|
|
while ( enumSnmpExt.Next( &strName, &dwType ) == NERR_Success )
|
|
{
|
|
CString nlsValue;
|
|
|
|
regSnmpExt.QueryValue( strName, nlsValue );
|
|
|
|
if ( nlsValue.Find( csServiceName ) != (-1))
|
|
{
|
|
// found it
|
|
regSnmpExt.DeleteValue( (LPCTSTR)strName );
|
|
break;
|
|
}
|
|
}
|
|
} while (FALSE);
|
|
return(err);
|
|
}
|
|
|
|
LONG lodctr(LPCTSTR lpszIniFile)
|
|
{
|
|
CString csCmdLine = _T("lodctr ");
|
|
csCmdLine += theApp.m_csSysDir;
|
|
csCmdLine += _T("\\");
|
|
csCmdLine += lpszIniFile;
|
|
|
|
return (LONG)(LoadPerfCounterTextStrings((LPTSTR)(LPCTSTR)csCmdLine, TRUE));
|
|
}
|
|
|
|
LONG unlodctr(LPCTSTR lpszDriver)
|
|
{
|
|
CString csCmdLine = _T("unlodctr ");
|
|
csCmdLine += lpszDriver;
|
|
|
|
return (LONG)(UnloadPerfCounterTextStrings((LPTSTR)(LPCTSTR)csCmdLine, TRUE));
|
|
}
|
|
|
|
//
|
|
// Given a directory path, set everyone full control security
|
|
//
|
|
|
|
BOOL SetEveryoneACL (CString &str, BOOL fAddAnonymousLogon)
|
|
{
|
|
DWORD dwRes, dwDisposition;
|
|
PSID pEveryoneSID = NULL;
|
|
PSID pAnonymousLogonSID = NULL;
|
|
PACL pACL = NULL;
|
|
PSECURITY_DESCRIPTOR pSD = NULL;
|
|
const int cMaxExplicitAccess = 4;
|
|
EXPLICIT_ACCESS ea[cMaxExplicitAccess];
|
|
int cExplicitAccess = 0;
|
|
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
|
|
SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
|
|
SECURITY_ATTRIBUTES sa;
|
|
LONG lRes;
|
|
BOOL fRet = FALSE;
|
|
|
|
// Create a security descriptor for the files
|
|
|
|
// Create a well-known SID for the Everyone group.
|
|
|
|
if(! AllocateAndInitializeSid( &SIDAuthWorld, 1,
|
|
SECURITY_WORLD_RID,
|
|
0, 0, 0, 0, 0, 0, 0,
|
|
&pEveryoneSID) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Initialize an EXPLICIT_ACCESS structure for an ACE.
|
|
// The ACE will allow Everyone read access to the key.
|
|
|
|
ZeroMemory(&ea, sizeof(ea));
|
|
ea[0].grfAccessPermissions = WRITE_DAC | WRITE_OWNER;
|
|
ea[0].grfAccessMode = DENY_ACCESS;
|
|
ea[0].grfInheritance= SUB_CONTAINERS_AND_OBJECTS_INHERIT;
|
|
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
|
|
ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
|
|
ea[0].Trustee.ptstrName = (LPTSTR) pEveryoneSID;
|
|
|
|
ea[1].grfAccessPermissions = GENERIC_ALL;
|
|
ea[1].grfAccessMode = SET_ACCESS;
|
|
ea[1].grfInheritance= SUB_CONTAINERS_AND_OBJECTS_INHERIT;
|
|
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID;
|
|
ea[1].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
|
|
ea[1].Trustee.ptstrName = (LPTSTR) pEveryoneSID;
|
|
|
|
cExplicitAccess = 2;
|
|
|
|
if (fAddAnonymousLogon) {
|
|
|
|
if(! AllocateAndInitializeSid( &SIDAuthNT, 1,
|
|
SECURITY_ANONYMOUS_LOGON_RID,
|
|
0, 0, 0, 0, 0, 0, 0,
|
|
&pAnonymousLogonSID) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
ea[2].grfAccessPermissions = WRITE_DAC | WRITE_OWNER;
|
|
ea[2].grfAccessMode = DENY_ACCESS;
|
|
ea[2].grfInheritance= SUB_CONTAINERS_AND_OBJECTS_INHERIT;
|
|
ea[2].Trustee.TrusteeForm = TRUSTEE_IS_SID;
|
|
ea[2].Trustee.TrusteeType = TRUSTEE_IS_USER;
|
|
ea[2].Trustee.ptstrName = (LPTSTR) pAnonymousLogonSID;
|
|
|
|
ea[3].grfAccessPermissions = GENERIC_ALL;
|
|
ea[3].grfAccessMode = SET_ACCESS;
|
|
ea[3].grfInheritance= SUB_CONTAINERS_AND_OBJECTS_INHERIT;
|
|
ea[3].Trustee.TrusteeForm = TRUSTEE_IS_SID;
|
|
ea[3].Trustee.TrusteeType = TRUSTEE_IS_USER;
|
|
ea[3].Trustee.ptstrName = (LPTSTR) pAnonymousLogonSID;
|
|
cExplicitAccess = 4;
|
|
}
|
|
|
|
|
|
// Create a new ACL that contains the new ACEs.
|
|
|
|
dwRes = SetEntriesInAcl(cExplicitAccess, ea, NULL, &pACL);
|
|
if (ERROR_SUCCESS != dwRes)
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Initialize a security descriptor.
|
|
|
|
pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR,
|
|
SECURITY_DESCRIPTOR_MIN_LENGTH);
|
|
if (pSD == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Add the ACL to the security descriptor.
|
|
|
|
if (!SetSecurityDescriptorDacl(pSD,
|
|
TRUE, // fDaclPresent flag
|
|
pACL,
|
|
FALSE)) // not a default DACL
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Initialize a security attributes structure.
|
|
|
|
sa.nLength = sizeof (SECURITY_ATTRIBUTES);
|
|
sa.lpSecurityDescriptor = pSD;
|
|
sa.bInheritHandle = FALSE;
|
|
|
|
fRet = SetFileSecurity (str, DACL_SECURITY_INFORMATION, pSD);
|
|
|
|
Exit:
|
|
if (pEveryoneSID)
|
|
FreeSid(pEveryoneSID);
|
|
if (pAnonymousLogonSID)
|
|
FreeSid(pAnonymousLogonSID);
|
|
if (pACL)
|
|
LocalFree(pACL);
|
|
if (pSD)
|
|
LocalFree(pSD);
|
|
return fRet;
|
|
|
|
}
|
|
|
|
//
|
|
// Given a directory path, this subroutine will create the direct layer by layer
|
|
//
|
|
|
|
BOOL CreateLayerDirectory( CString &str )
|
|
{
|
|
BOOL fReturn = TRUE;
|
|
|
|
do
|
|
{
|
|
INT index=0;
|
|
INT iLength = str.GetLength();
|
|
|
|
// first find the index for the first directory
|
|
if ( iLength > 2 )
|
|
{
|
|
if ( str[1] == _T(':'))
|
|
{
|
|
// assume the first character is driver letter
|
|
if ( str[2] == _T('\\'))
|
|
{
|
|
index = 2;
|
|
} else
|
|
{
|
|
index = 1;
|
|
}
|
|
} else if ( str[0] == _T('\\'))
|
|
{
|
|
if ( str[1] == _T('\\'))
|
|
{
|
|
BOOL fFound = FALSE;
|
|
INT i;
|
|
INT nNum = 0;
|
|
// unc name
|
|
for (i = 2; i < iLength; i++ )
|
|
{
|
|
if ( str[i]==_T('\\'))
|
|
{
|
|
// find it
|
|
nNum ++;
|
|
if ( nNum == 2 )
|
|
{
|
|
fFound = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if ( fFound )
|
|
{
|
|
index = i;
|
|
} else
|
|
{
|
|
// bad name
|
|
break;
|
|
}
|
|
} else
|
|
{
|
|
index = 1;
|
|
}
|
|
}
|
|
} else if ( str[0] == _T('\\'))
|
|
{
|
|
index = 0;
|
|
}
|
|
|
|
// okay ... build directory
|
|
do
|
|
{
|
|
// find next one
|
|
do
|
|
{
|
|
if ( index < ( iLength - 1))
|
|
{
|
|
index ++;
|
|
} else
|
|
{
|
|
break;
|
|
}
|
|
} while ( str[index] != _T('\\'));
|
|
|
|
|
|
TCHAR szCurrentDir[MAX_PATH+1];
|
|
|
|
GetCurrentDirectory( MAX_PATH+1, szCurrentDir );
|
|
|
|
if ( !SetCurrentDirectory( str.Left( index + 1 )))
|
|
{
|
|
if (( fReturn = CreateDirectory( str.Left( index + 1 ), NULL )) != TRUE )
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
SetCurrentDirectory( szCurrentDir );
|
|
|
|
if ( index >= ( iLength - 1 ))
|
|
{
|
|
fReturn = TRUE;
|
|
break;
|
|
}
|
|
} while ( TRUE );
|
|
} while (FALSE);
|
|
|
|
return(fReturn);
|
|
}
|
|
|
|
//
|
|
// Used when the strings are passed in.
|
|
//
|
|
int MyMessageBox(HWND hWnd, LPCTSTR lpszTheMessage, LPCTSTR lpszTheTitle, UINT style)
|
|
{
|
|
int iReturn = IDOK;
|
|
|
|
// make sure it goes to DebugOutput
|
|
DebugOutput(_T("MyMessageBox: Title:%s, Msg:%s"), lpszTheTitle, lpszTheMessage);
|
|
|
|
if (style & MB_ABORTRETRYIGNORE)
|
|
{
|
|
iReturn = IDIGNORE;
|
|
}
|
|
|
|
// Check global variable to see if we can even display the popup!
|
|
if (theApp.m_bAllowMessageBoxPopups)
|
|
{
|
|
// Suppress the message if unattened or remove all
|
|
// Who cares the user can't do anything about it anyway?
|
|
// no use upsetting them, we do log to the OCM though
|
|
//
|
|
//if (! theApp.m_fUnattended || theApp.m_dwSetupMode != SETUPMODE_REMOVEALL)
|
|
{
|
|
iReturn = ::MessageBox(hWnd, lpszTheMessage, lpszTheTitle, style | MB_SETFOREGROUND);
|
|
}
|
|
}
|
|
return iReturn;
|
|
}
|
|
|
|
void GetErrorMsg(int errCode, LPCTSTR szExtraMsg)
|
|
{
|
|
TCHAR pMsg[_MAX_PATH];
|
|
|
|
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM,
|
|
NULL, errCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
|
|
pMsg, _MAX_PATH, NULL);
|
|
lstrcat(pMsg, szExtraMsg);
|
|
MyMessageBox(NULL, pMsg, _T(""), MB_OK | MB_SETFOREGROUND);
|
|
return;
|
|
}
|
|
|
|
DWORD GetDebugLevel(void)
|
|
{
|
|
DWORD rc;
|
|
DWORD err;
|
|
DWORD size;
|
|
DWORD type;
|
|
HKEY hkey;
|
|
err = RegOpenKey(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\microsoft\\windows\\currentversion\\setup"), &hkey);
|
|
if (err != ERROR_SUCCESS) {return 0;}
|
|
size = sizeof(DWORD);
|
|
err = RegQueryValueEx(hkey,_T("OC Manager Debug Level"),0,&type,(LPBYTE)&rc,&size);
|
|
if (err != ERROR_SUCCESS || type != REG_DWORD) {rc = 0;}
|
|
RegCloseKey(hkey);
|
|
return rc;
|
|
}
|
|
|
|
void MyLoadString(int nID, CString &csResult)
|
|
{
|
|
TCHAR buf[MAX_STR_LEN];
|
|
|
|
if (LoadString(theApp.m_hDllHandle, nID, buf, MAX_STR_LEN))
|
|
csResult = buf;
|
|
|
|
return;
|
|
}
|
|
|
|
static TCHAR six2pr[64] =
|
|
{
|
|
_T('A'), _T('B'), _T('C'), _T('D'), _T('E'), _T('F'), _T('G'), _T('H'), _T('I'), _T('J'), _T('K'), _T('L'), _T('M'),
|
|
_T('N'), _T('O'), _T('P'), _T('Q'), _T('R'), _T('S'), _T('T'), _T('U'), _T('V'), _T('W'), _T('X'), _T('Y'), _T('Z'),
|
|
_T('a'), _T('b'), _T('c'), _T('d'), _T('e'), _T('f'), _T('g'), _T('h'), _T('i'), _T('j'), _T('k'), _T('l'), _T('m'),
|
|
_T('n'), _T('o'), _T('p'), _T('q'), _T('r'), _T('s'), _T('t'), _T('u'), _T('v'), _T('w'), _T('x'), _T('y'), _T('z'),
|
|
_T('0'), _T('1'), _T('2'), _T('3'), _T('4'), _T('5'), _T('6'), _T('7'), _T('8'), _T('9'), _T('%'), _T('_')
|
|
};
|
|
typedef void (*P_SslGenerateRandomBits)( PUCHAR pRandomData, LONG size );
|
|
P_SslGenerateRandomBits ProcSslGenerateRandomBits = NULL;
|
|
|
|
int GetRandomNum()
|
|
{
|
|
int RandomNum;
|
|
UCHAR cRandomByte;
|
|
|
|
if ( ProcSslGenerateRandomBits != NULL )
|
|
{
|
|
(*ProcSslGenerateRandomBits)( &cRandomByte, 1 );
|
|
RandomNum = cRandomByte;
|
|
} else
|
|
{
|
|
RandomNum = rand();
|
|
}
|
|
|
|
return(RandomNum);
|
|
}
|
|
|
|
void MakePath(LPTSTR lpPath)
|
|
{
|
|
LPTSTR lpTmp;
|
|
lpTmp = CharPrev( lpPath, lpPath + _tcslen(lpPath));
|
|
|
|
// chop filename off
|
|
while ( (lpTmp > lpPath) && *lpTmp && (*lpTmp != '\\') )
|
|
lpTmp = CharPrev( lpPath, lpTmp );
|
|
|
|
if ( *CharPrev( lpPath, lpTmp ) != ':' )
|
|
*lpTmp = '\0';
|
|
else
|
|
*CharNext(lpTmp) = '\0';
|
|
return;
|
|
}
|
|
|
|
void AddPath(LPTSTR szPath, LPCTSTR szName )
|
|
{
|
|
LPTSTR p = szPath;
|
|
ASSERT(szPath);
|
|
ASSERT(szName);
|
|
|
|
// Find end of the string
|
|
while (*p){p = _tcsinc(p);}
|
|
|
|
// If no trailing backslash then add one
|
|
if (*(_tcsdec(szPath, p)) != _T('\\'))
|
|
{_tcscat(szPath, _T("\\"));}
|
|
|
|
// if there are spaces precluding szName, then skip
|
|
while ( *szName == ' ' ) szName = _tcsinc(szName);;
|
|
|
|
// Add new name to existing path string
|
|
_tcscat(szPath, szName);
|
|
}
|
|
|
|
CString AddPath(CString szPath, LPCTSTR szName )
|
|
{
|
|
TCHAR szPathCopy[MAX_PATH] = _T("");
|
|
_tcscpy(szPathCopy,szPath);
|
|
LPTSTR p = szPathCopy;
|
|
ASSERT(szPathCopy);
|
|
ASSERT(szName);
|
|
|
|
// Find end of the string
|
|
while (*p){p = _tcsinc(p);}
|
|
|
|
// If no trailing backslash then add one
|
|
if (*(_tcsdec(szPathCopy, p)) != _T('\\'))
|
|
{_tcscat(szPathCopy, _T("\\"));}
|
|
|
|
// if there are spaces precluding szName, then skip
|
|
while ( *szName == _T(' ') ) szName = _tcsinc(szName);;
|
|
|
|
// make sure that the szName
|
|
// does not look like this "\filename"
|
|
CString csTempString = szName;
|
|
if (_tcsicmp(csTempString.Left(1), _T("\\")) == 0)
|
|
{
|
|
csTempString = csTempString.Right( csTempString.GetLength() - 1);
|
|
}
|
|
|
|
// Add new name to existing path string
|
|
_tcscat(szPathCopy, csTempString);
|
|
|
|
return szPathCopy;
|
|
//szPath = szPathCopy;
|
|
}
|
|
|
|
// GetPrincipalSID is from \nt\private\inet\iis\ui\setup\osrc\dcomperm.cpp
|
|
|
|
DWORD
|
|
GetPrincipalSID (
|
|
LPTSTR Principal,
|
|
PSID *Sid,
|
|
BOOL *pbWellKnownSID
|
|
)
|
|
{
|
|
DebugOutput(_T("GetPrincipalSID:Principal=%s\n"), Principal);
|
|
|
|
DWORD returnValue=ERROR_SUCCESS;
|
|
CString csPrincipal = Principal;
|
|
SID_IDENTIFIER_AUTHORITY SidIdentifierNTAuthority = SECURITY_NT_AUTHORITY;
|
|
SID_IDENTIFIER_AUTHORITY SidIdentifierWORLDAuthority = SECURITY_WORLD_SID_AUTHORITY;
|
|
PSID_IDENTIFIER_AUTHORITY pSidIdentifierAuthority;
|
|
BYTE Count;
|
|
DWORD dwRID[8];
|
|
|
|
*pbWellKnownSID = TRUE;
|
|
memset(&(dwRID[0]), 0, 8 * sizeof(DWORD));
|
|
csPrincipal.MakeLower();
|
|
if ( csPrincipal.Find(_T("administrators")) != -1 ) {
|
|
// Administrators group
|
|
pSidIdentifierAuthority = &SidIdentifierNTAuthority;
|
|
Count = 2;
|
|
dwRID[0] = SECURITY_BUILTIN_DOMAIN_RID;
|
|
dwRID[1] = DOMAIN_ALIAS_RID_ADMINS;
|
|
} else if (csPrincipal.Find(_T("system")) != -1) {
|
|
// SYSTEM
|
|
pSidIdentifierAuthority = &SidIdentifierNTAuthority;
|
|
Count = 1;
|
|
dwRID[0] = SECURITY_LOCAL_SYSTEM_RID;
|
|
} else if (csPrincipal.Find(_T("interactive")) != -1) {
|
|
// INTERACTIVE
|
|
pSidIdentifierAuthority = &SidIdentifierNTAuthority;
|
|
Count = 1;
|
|
dwRID[0] = SECURITY_INTERACTIVE_RID;
|
|
} else if (csPrincipal.Find(_T("everyone")) != -1) {
|
|
// Everyone
|
|
pSidIdentifierAuthority = &SidIdentifierWORLDAuthority;
|
|
Count = 1;
|
|
dwRID[0] = SECURITY_WORLD_RID;
|
|
} else {
|
|
*pbWellKnownSID = FALSE;
|
|
}
|
|
|
|
if (*pbWellKnownSID) {
|
|
if ( !AllocateAndInitializeSid(pSidIdentifierAuthority,
|
|
(BYTE)Count,
|
|
dwRID[0],
|
|
dwRID[1],
|
|
dwRID[2],
|
|
dwRID[3],
|
|
dwRID[4],
|
|
dwRID[5],
|
|
dwRID[6],
|
|
dwRID[7],
|
|
Sid) ) {
|
|
returnValue = GetLastError();
|
|
}
|
|
} else {
|
|
// get regular account sid
|
|
DWORD sidSize;
|
|
TCHAR refDomain [256];
|
|
DWORD refDomainSize;
|
|
SID_NAME_USE snu;
|
|
|
|
sidSize = 0;
|
|
refDomainSize = 255;
|
|
|
|
LookupAccountName (NULL,
|
|
Principal,
|
|
*Sid,
|
|
&sidSize,
|
|
refDomain,
|
|
&refDomainSize,
|
|
&snu);
|
|
|
|
returnValue = GetLastError();
|
|
|
|
if (returnValue == ERROR_INSUFFICIENT_BUFFER) {
|
|
*Sid = (PSID) malloc (sidSize);
|
|
refDomainSize = 255;
|
|
|
|
if (!LookupAccountName (NULL,
|
|
Principal,
|
|
*Sid,
|
|
&sidSize,
|
|
refDomain,
|
|
&refDomainSize,
|
|
&snu))
|
|
{
|
|
returnValue = GetLastError();
|
|
} else {
|
|
returnValue = ERROR_SUCCESS;
|
|
}
|
|
}
|
|
}
|
|
|
|
return returnValue;
|
|
}
|
|
|
|
|
|
// SetAdminACL taken from \nt\private\inet\iis\ui\setup\osrc\helper.cpp
|
|
|
|
DWORD SetAdminACL(LPCTSTR szKeyPath, DWORD dwAccessForEveryoneAccount)
|
|
{
|
|
DebugOutputSafe(_T("SetAdminACL(%1!s!) Start.\n"), szKeyPath);
|
|
|
|
int iErr=0;
|
|
DWORD dwErr=ERROR_SUCCESS;
|
|
|
|
BOOL b = FALSE;
|
|
DWORD dwLength = 0;
|
|
|
|
PSECURITY_DESCRIPTOR pSD = NULL;
|
|
PSECURITY_DESCRIPTOR outpSD = NULL;
|
|
DWORD cboutpSD = 0;
|
|
PACL pACLNew = NULL;
|
|
DWORD cbACL = 0;
|
|
PSID pAdminsSID = NULL, pEveryoneSID = NULL;
|
|
BOOL bWellKnownSID = FALSE;
|
|
|
|
// Initialize a new security descriptor
|
|
pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
|
|
if (NULL == pSD) {
|
|
dwErr = ERROR_NOT_ENOUGH_MEMORY;
|
|
DebugOutput(_T("LocalAlloc failed"));
|
|
goto Cleanup;
|
|
}
|
|
|
|
iErr = InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION);
|
|
if (iErr == 0)
|
|
{
|
|
dwErr=GetLastError();
|
|
DebugOutput(_T("SetAdminACL:InitializeSecurityDescriptor FAILED. GetLastError()= 0x%x\n"), dwErr);
|
|
goto Cleanup;
|
|
}
|
|
|
|
// Get Local Admins Sid
|
|
dwErr = GetPrincipalSID (_T("Administrators"), &pAdminsSID, &bWellKnownSID);
|
|
if (dwErr != ERROR_SUCCESS)
|
|
{
|
|
DebugOutput(_T("SetAdminACL:GetPrincipalSID(Administrators) FAILED. GetLastError()= 0x%x\n"), dwErr);
|
|
goto Cleanup;
|
|
}
|
|
|
|
// Get everyone Sid
|
|
dwErr = GetPrincipalSID (_T("Everyone"), &pEveryoneSID, &bWellKnownSID);
|
|
if (dwErr != ERROR_SUCCESS)
|
|
{
|
|
DebugOutput(_T("SetAdminACL:GetPrincipalSID(Everyone) FAILED. GetLastError()= 0x%x\n"), dwErr);
|
|
goto Cleanup;
|
|
}
|
|
|
|
// Initialize a new ACL, which only contains 2 aaace
|
|
cbACL = sizeof(ACL) +
|
|
(sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(pAdminsSID) - sizeof(DWORD)) +
|
|
(sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(pEveryoneSID) - sizeof(DWORD)) ;
|
|
pACLNew = (PACL) LocalAlloc(LPTR, cbACL);
|
|
if ( !pACLNew )
|
|
{
|
|
dwErr=ERROR_NOT_ENOUGH_MEMORY;
|
|
DebugOutput(_T("SetAdminACL:pACLNew LocalAlloc(LPTR, FAILED. size = %u GetLastError()= 0x%x\n"), cbACL, dwErr);
|
|
goto Cleanup;
|
|
}
|
|
|
|
if (!InitializeAcl(pACLNew, cbACL, ACL_REVISION))
|
|
{
|
|
dwErr=GetLastError();
|
|
DebugOutput(_T("SetAdminACL:InitializeAcl FAILED. GetLastError()= 0x%x\n"), dwErr);
|
|
goto Cleanup;
|
|
}
|
|
|
|
if (!AddAccessAllowedAce(pACLNew,ACL_REVISION,(MD_ACR_READ |MD_ACR_WRITE |MD_ACR_RESTRICTED_WRITE |MD_ACR_UNSECURE_PROPS_READ |MD_ACR_ENUM_KEYS |MD_ACR_WRITE_DAC),pAdminsSID))
|
|
{
|
|
dwErr=GetLastError();
|
|
DebugOutput(_T("SetAdminACL:AddAccessAllowedAce(pAdminsSID) FAILED. GetLastError()= 0x%x\n"), dwErr);
|
|
goto Cleanup;
|
|
}
|
|
if (!AddAccessAllowedAce(pACLNew,ACL_REVISION,dwAccessForEveryoneAccount,pEveryoneSID))
|
|
{
|
|
dwErr=GetLastError();
|
|
DebugOutput(_T("SetAdminACL:AddAccessAllowedAce(pEveryoneSID) FAILED. GetLastError()= 0x%x\n"), dwErr);
|
|
goto Cleanup;
|
|
}
|
|
|
|
// Add the ACL to the security descriptor
|
|
b = SetSecurityDescriptorDacl(pSD, TRUE, pACLNew, FALSE);
|
|
if (!b)
|
|
{
|
|
dwErr=GetLastError();
|
|
DebugOutput(_T("SetAdminACL:SetSecurityDescriptorDacl(pACLNew) FAILED. GetLastError()= 0x%x\n"), dwErr);
|
|
goto Cleanup;
|
|
}
|
|
b = SetSecurityDescriptorOwner(pSD, pAdminsSID, TRUE);
|
|
if (!b)
|
|
{
|
|
dwErr=GetLastError();
|
|
DebugOutput(_T("SetAdminACL:SetSecurityDescriptorOwner(pAdminsSID) FAILED. GetLastError()= 0x%x\n"), dwErr);
|
|
goto Cleanup;
|
|
}
|
|
b = SetSecurityDescriptorGroup(pSD, pAdminsSID, TRUE);
|
|
if (!b)
|
|
{
|
|
dwErr=GetLastError();
|
|
DebugOutput(_T("SetAdminACL:SetSecurityDescriptorGroup(pAdminsSID) FAILED. GetLastError()= 0x%x\n"), dwErr);
|
|
goto Cleanup;
|
|
}
|
|
|
|
// Security descriptor blob must be self relative
|
|
b = MakeSelfRelativeSD(pSD, outpSD, &cboutpSD);
|
|
if (!b && (GetLastError() != ERROR_INSUFFICIENT_BUFFER))
|
|
{
|
|
dwErr=GetLastError();
|
|
DebugOutput(_T("SetAdminACL:MakeSelfRelativeSD FAILED. GetLastError()= 0x%x\n"), dwErr);
|
|
goto Cleanup;
|
|
}
|
|
|
|
outpSD = (PSECURITY_DESCRIPTOR)GlobalAlloc(GPTR, cboutpSD);
|
|
if ( !outpSD )
|
|
{
|
|
dwErr=GetLastError();
|
|
DebugOutput(_T("SetAdminACL:GlobalAlloc FAILED. cboutpSD = %u GetLastError()= 0x%x\n"), cboutpSD, dwErr);
|
|
goto Cleanup;
|
|
}
|
|
|
|
b = MakeSelfRelativeSD( pSD, outpSD, &cboutpSD );
|
|
if (!b)
|
|
{
|
|
dwErr=GetLastError();
|
|
DebugOutput(_T("SetAdminACL:MakeSelfRelativeSD() FAILED. cboutpSD = %u GetLastError()= 0x%x\n"),cboutpSD, dwErr);
|
|
goto Cleanup;
|
|
}
|
|
|
|
// Apply the new security descriptor to the metabase
|
|
DebugOutput(_T("SetAdminACL:Write the new security descriptor to the Metabase. Start."));
|
|
DebugOutput(_T("SetAdminACL: At this point we have already been able to write basic entries to the metabase, so..."));
|
|
DebugOutput(_T("SetAdminACL: If this fails then there is a problem with setting up encryption for the metabase (RsaBase.dll)."));
|
|
dwErr = WriteSDtoMetaBase(outpSD, szKeyPath);
|
|
DebugOutput(_T("SetAdminACL:Write the new security descriptor to the Metabase. End."));
|
|
|
|
Cleanup:
|
|
// both of Administrators and Everyone are well-known SIDs, use FreeSid() to free them.
|
|
if (outpSD){GlobalFree(outpSD);}
|
|
if (pAdminsSID){FreeSid(pAdminsSID);}
|
|
if (pEveryoneSID){FreeSid(pEveryoneSID);}
|
|
if (pSD){LocalFree((HLOCAL) pSD);}
|
|
if (pACLNew){LocalFree((HLOCAL) pACLNew);}
|
|
DebugOutputSafe(_T("SetAdminACL(%1!s!) End.\n"), szKeyPath);
|
|
return (dwErr);
|
|
}
|
|
|
|
|
|
DWORD SetAdminACL_wrap(LPCTSTR szKeyPath, DWORD dwAccessForEveryoneAccount, BOOL bDisplayMsgOnErrFlag)
|
|
{
|
|
int bFinishedFlag = FALSE;
|
|
UINT iMsg = NULL;
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
|
|
// LogHeapState(FALSE, __FILE__, __LINE__);
|
|
|
|
do
|
|
{
|
|
dwReturn = SetAdminACL(szKeyPath, dwAccessForEveryoneAccount);
|
|
// LogHeapState(FALSE, __FILE__, __LINE__);
|
|
if (FAILED(dwReturn))
|
|
{
|
|
// SetErrorFlag(__FILE__, __LINE__);
|
|
if (bDisplayMsgOnErrFlag == TRUE)
|
|
{
|
|
CString msg;
|
|
MyLoadString(IDS_RETRY, msg);
|
|
iMsg = MyMessageBox( NULL, msg, _T(""), MB_ABORTRETRYIGNORE | MB_SETFOREGROUND );
|
|
switch ( iMsg )
|
|
{
|
|
case IDIGNORE:
|
|
dwReturn = ERROR_SUCCESS;
|
|
goto SetAdminACL_wrap_Exit;
|
|
case IDABORT:
|
|
dwReturn = ERROR_OPERATION_ABORTED;
|
|
goto SetAdminACL_wrap_Exit;
|
|
case IDRETRY:
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// return whatever err happened
|
|
goto SetAdminACL_wrap_Exit;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
} while ( FAILED(dwReturn) );
|
|
|
|
SetAdminACL_wrap_Exit:
|
|
return dwReturn;
|
|
}
|
|
DWORD WriteSDtoMetaBase(PSECURITY_DESCRIPTOR outpSD, LPCTSTR szKeyPath)
|
|
{
|
|
DebugOutput(_T("WriteSDtoMetaBase: Start"));
|
|
DWORD dwReturn = E_FAIL;
|
|
DWORD dwLength = 0;
|
|
CMDKey cmdKey;
|
|
|
|
if (!outpSD)
|
|
{
|
|
dwReturn = ERROR_INVALID_SECURITY_DESCR;
|
|
goto WriteSDtoMetaBase_Exit;
|
|
}
|
|
|
|
// Apply the new security descriptor to the metabase
|
|
dwLength = GetSecurityDescriptorLength(outpSD);
|
|
|
|
// open the metabase
|
|
// stick it into the metabase. warning those hoses a lot because
|
|
// it uses encryption. rsabase.dll
|
|
cmdKey.CreateNode(METADATA_MASTER_ROOT_HANDLE, szKeyPath);
|
|
if ( (METADATA_HANDLE)cmdKey )
|
|
{
|
|
DebugOutput(_T("WriteSDtoMetaBase:cmdKey():SetData(MD_ADMIN_ACL), dwdata = %u; outpSD = %p, Start\n"), dwLength, outpSD );
|
|
|
|
dwReturn = cmdKey.SetData(MD_ADMIN_ACL,METADATA_INHERIT | METADATA_REFERENCE | METADATA_SECURE,IIS_MD_UT_SERVER,BINARY_METADATA,dwLength,(LPBYTE)outpSD);
|
|
if (FAILED(dwReturn))
|
|
{
|
|
// SetErrorFlag(__FILE__, __LINE__);
|
|
DebugOutput(_T("WriteSDtoMetaBase:cmdKey():SetData(MD_ADMIN_ACL), FAILED. Code=0x%x. End.\n"), dwReturn);
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
DebugOutput(_T("WriteSDtoMetaBase:cmdKey():SetData(MD_ADMIN_ACL), Success. End.\n"));
|
|
}
|
|
cmdKey.Close();
|
|
}
|
|
else
|
|
{
|
|
dwReturn = E_FAIL;
|
|
}
|
|
|
|
WriteSDtoMetaBase_Exit:
|
|
DebugOutput(_T("WriteSDtoMetaBase: End. Return=0x%x"), dwReturn);
|
|
return dwReturn;
|
|
}
|
|
|
|
void SetupSetStringId_Wrapper(HINF hInf)
|
|
{
|
|
// Note, we only care about the intel variants since they're the only ones
|
|
// special cased in the .INFs
|
|
// Not anymore, we handles the [SourceDisksName] section as well
|
|
SYSTEM_INFO SystemInfo;
|
|
GetSystemInfo( &SystemInfo );
|
|
TCHAR szSourceCatOSName[20];
|
|
|
|
_tcscpy(szSourceCatOSName, _T("\\i386"));
|
|
switch(SystemInfo.wProcessorArchitecture) {
|
|
case PROCESSOR_ARCHITECTURE_AMD64:
|
|
_tcscpy(szSourceCatOSName, _T("\\AMD64"));
|
|
break;
|
|
|
|
case PROCESSOR_ARCHITECTURE_IA64:
|
|
_tcscpy(szSourceCatOSName, _T("\\IA64"));
|
|
break;
|
|
|
|
case PROCESSOR_ARCHITECTURE_INTEL:
|
|
if (IsNEC_98) {
|
|
_tcscpy(szSourceCatOSName, _T("\\Nec98"));
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
// 34000 is no longer used
|
|
//SetupSetDirectoryIdEx(hInf, 34000, szSourceCatOSName, SETDIRID_NOT_FULL_PATH, 0, 0);
|
|
SetupSetDirectoryIdEx(hInf, 34001, szSourceCatOSName, SETDIRID_NOT_FULL_PATH, 0, 0);
|
|
|
|
}
|