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.
11475 lines
431 KiB
11475 lines
431 KiB
#include "stdafx.h"
|
|
#include "lzexpand.h"
|
|
#include <loadperf.h>
|
|
#include <ole2.h>
|
|
#include <iis64.h>
|
|
#include "iadmw.h"
|
|
#include "iiscnfg.h"
|
|
#include "mdkey.h"
|
|
#include "mdentry.h"
|
|
#include "mdacl.h"
|
|
#include "dcomperm.h"
|
|
#include "log.h"
|
|
#include "other.h"
|
|
#include "kill.h"
|
|
#include "strfn.h"
|
|
#include "shellutl.h"
|
|
#include "svc.h"
|
|
#include "setuser.h"
|
|
#include "wolfpack.h"
|
|
#include <wbemcli.h>
|
|
#include <direct.h>
|
|
#include <aclapi.h>
|
|
#include <wincrypt.h>
|
|
#include <Dsgetdc.h>
|
|
#include "parse.hxx"
|
|
|
|
// for backward compat
|
|
#define PWS_TRAY_WINDOW_CLASS _T("PWS_TRAY_WINDOW")
|
|
|
|
GUID g_FTPGuid = { 0x91604620, 0x6305, 0x11ce, 0xae, 0x00, 0x00, 0xaa, 0x00, 0x4a, 0x38, 0xb9 };
|
|
GUID g_HTTPGuid = { 0x585908c0, 0x6305, 0x11ce, 0xae, 0x00, 0x00, 0xaa, 0x00, 0x4a, 0x38, 0xb9 };
|
|
GUID g_InetInfoGuid = { 0xa5569b20, 0xabe5, 0x11ce, 0x9c, 0xa4, 0x00, 0x00, 0x4c, 0x75, 0x27, 0x31 };
|
|
GUID g_GopherGuid = { 0x62388f10, 0x58a2, 0x11ce, 0xbe, 0xc8, 0x00, 0xaa, 0x00, 0x47, 0xae, 0x4e };
|
|
|
|
// guid stuff
|
|
#define MY_DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) extern "C" const GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
|
|
#define MY_DEFINE_OLEGUID(name, l, w1, w2) MY_DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46)
|
|
MY_DEFINE_OLEGUID(IID_IPersistFile, 0x0000010b, 0, 0);
|
|
// must be defined after the guid stuff
|
|
#include "shlobj.h"
|
|
|
|
extern int g_GlobalGuiOverRide;
|
|
extern int g_GlobalTickValue;
|
|
extern int g_CheckIfMetabaseValueWasWritten;
|
|
extern HSPFILEQ g_GlobalFileQueueHandle;
|
|
extern int g_GlobalFileQueueHandle_ReturnError;
|
|
|
|
const TCHAR PARSE_ERROR_ENTRY_TO_BIG[] = _T("ProcessEntry_Entry:ParseError:%1!s!:%2!s! -- entry to big. FAIL.\n");
|
|
const TCHAR csz101_NOT_SPECIFIED[] = _T("%s():101 Required for this 100 type and not specified, fail. entry=%s. Section=%s.\n");
|
|
const TCHAR csz102_NOT_SPECIFIED[] = _T("%s():102 Required for this 100 type and not specified, fail. entry=%s. Section=%s.\n");
|
|
const TCHAR csz103_NOT_SPECIFIED[] = _T("%s():103 Required for this 100 type and not specified, fail. entry=%s. Section=%s.\n");
|
|
const TCHAR csz104_NOT_SPECIFIED[] = _T("%s():104 Required for this 100 type and not specified, fail. entry=%s. Section=%s.\n");
|
|
const TCHAR csz105_NOT_SPECIFIED[] = _T("%s():105 Required for this 100 type and not specified, fail. entry=%s. Section=%s.\n");
|
|
const TCHAR csz805_NOT_SPECIFIED[] = _T("%s():805 Required for this 100 type and not specified, fail. entry=%s. Section=%s.\n");
|
|
|
|
typedef struct _MTS_ERROR_CODE_STRUCT
|
|
{
|
|
int iMtsThingWeWereDoing;
|
|
DWORD dwErrorCode;
|
|
} MTS_ERROR_CODE_STRUCT;
|
|
|
|
MTS_ERROR_CODE_STRUCT gTempMTSError;
|
|
|
|
|
|
const TCHAR ThingToDoNumType_100[] = _T("100=");
|
|
const TCHAR ThingToDoNumType_101[] = _T("101=");
|
|
const TCHAR ThingToDoNumType_102[] = _T("102=");
|
|
const TCHAR ThingToDoNumType_103[] = _T("103=");
|
|
const TCHAR ThingToDoNumType_104[] = _T("104=");
|
|
const TCHAR ThingToDoNumType_105[] = _T("105=");
|
|
const TCHAR ThingToDoNumType_106[] = _T("106=");
|
|
|
|
const TCHAR ThingToDoNumType_200[] = _T("200=");
|
|
const TCHAR ThingToDoNumType_701[] = _T("701=");
|
|
const TCHAR ThingToDoNumType_702[] = _T("702=");
|
|
const TCHAR ThingToDoNumType_703[] = _T("703=");
|
|
const TCHAR ThingToDoNumType_801[] = _T("801=");
|
|
const TCHAR ThingToDoNumType_802[] = _T("802=");
|
|
const TCHAR ThingToDoNumType_803[] = _T("803=");
|
|
const TCHAR ThingToDoNumType_804[] = _T("804=");
|
|
const TCHAR ThingToDoNumType_805[] = _T("805=");
|
|
|
|
typedef struct _ThingToDo {
|
|
TCHAR szType[20];
|
|
TCHAR szFileName[_MAX_PATH];
|
|
TCHAR szData1[_MAX_PATH + _MAX_PATH];
|
|
TCHAR szData2[_MAX_PATH];
|
|
TCHAR szData3[_MAX_PATH];
|
|
TCHAR szData4[_MAX_PATH];
|
|
TCHAR szChangeDir[_MAX_PATH];
|
|
|
|
TCHAR szOS[10];
|
|
TCHAR szPlatformArchitecture[10];
|
|
TCHAR szEnterprise[10];
|
|
TCHAR szErrIfFileNotFound[10];
|
|
TCHAR szMsgBoxBefore[10];
|
|
TCHAR szMsgBoxAfter[10];
|
|
TCHAR szDoNotDisplayErrIfFunctionFailed[10];
|
|
TCHAR szProgressTitle[100];
|
|
} ThingToDo;
|
|
|
|
|
|
extern OCMANAGER_ROUTINES gHelperRoutines;
|
|
|
|
extern int g_GlobalDebugLevelFlag;
|
|
extern int g_GlobalDebugLevelFlag_WasSetByUnattendFile;
|
|
extern int g_GlobalDebugCallValidateHeap;
|
|
extern int g_GlobalDebugCrypto;
|
|
extern int g_GlobalFastLoad;
|
|
|
|
|
|
// Our Global List of Warnings to display after setup is completed.
|
|
CStringList gcstrListOfWarnings;
|
|
CStringList gcstrProgressBarTextStack;
|
|
|
|
CStringList gcstrListOfOleInits;
|
|
|
|
#define FUNCTION_PARAMS_NONE 0
|
|
#define FUNCTION_PARAMS_HMODULE 1
|
|
|
|
|
|
#define MAX_FAKE_METABASE_STRING_LEN 500
|
|
|
|
|
|
|
|
LCID g_MyTrueThreadLocale;
|
|
|
|
DWORD WINAPI GetNewlyCreatedThreadLocale(LPVOID lpParameter)
|
|
{
|
|
g_MyTrueThreadLocale = GetThreadLocale ();
|
|
return 0;
|
|
}
|
|
|
|
int CheckForWriteAccess(LPCTSTR szFile)
|
|
{
|
|
int iReturn = FALSE;
|
|
|
|
// check if the file exists
|
|
// if it doesn't then return true!
|
|
if (IsFileExist(szFile) != TRUE)
|
|
{
|
|
// we've got write access!
|
|
return TRUE;
|
|
}
|
|
|
|
// try to open the file for write; if we can't, the file is read-only
|
|
HANDLE hFile = CreateFile(szFile, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
if (hFile != INVALID_HANDLE_VALUE)
|
|
{
|
|
// we've got write access!
|
|
iReturn = TRUE;
|
|
CloseHandle (hFile);
|
|
}
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
// Return Value:
|
|
// TRUE - the operating system is NTS Enterprise
|
|
// FALSE - the operating system is not correct.
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
int iReturnTrueIfEnterprise(void)
|
|
{
|
|
BOOL fReturnValue;
|
|
OSVERSIONINFOEX osiv;
|
|
ZeroMemory( &osiv, sizeof( OSVERSIONINFOEX ) );
|
|
|
|
osiv.dwOSVersionInfoSize = sizeof( OSVERSIONINFOEX );
|
|
osiv.dwMajorVersion = 5;
|
|
osiv.dwMinorVersion = 0;
|
|
osiv.wServicePackMajor = 0;
|
|
osiv.wSuiteMask = VER_SUITE_ENTERPRISE;
|
|
|
|
DWORDLONG dwlConditionMask;
|
|
dwlConditionMask = (DWORDLONG) 0L;
|
|
|
|
VER_SET_CONDITION( dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL );
|
|
VER_SET_CONDITION( dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL );
|
|
VER_SET_CONDITION( dwlConditionMask, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL );
|
|
VER_SET_CONDITION( dwlConditionMask, VER_SUITENAME, VER_AND );
|
|
|
|
fReturnValue = VerifyVersionInfo( &osiv,VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SUITENAME,dwlConditionMask );
|
|
if ( fReturnValue != (BOOL) TRUE )
|
|
{
|
|
DWORD dwErrorCode = GetLastError();
|
|
}
|
|
|
|
return ( fReturnValue );
|
|
}
|
|
|
|
|
|
void GlobalOleInitList_Push(int iTrueOrFalse)
|
|
{
|
|
if (FALSE == iTrueOrFalse)
|
|
{
|
|
gcstrListOfOleInits.AddTail(_T("TRUE"));
|
|
}
|
|
else
|
|
{
|
|
gcstrListOfOleInits.AddTail(_T("FALSE"));
|
|
}
|
|
return;
|
|
}
|
|
|
|
int GlobalOleInitList_Find(void)
|
|
{
|
|
if (gcstrListOfOleInits.IsEmpty() == TRUE)
|
|
{
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
int GlobalOleInitList_Pop(void)
|
|
{
|
|
CString csText;
|
|
if (gcstrListOfOleInits.IsEmpty() == FALSE)
|
|
{
|
|
csText = gcstrListOfWarnings.RemoveTail();
|
|
if (_tcsicmp(csText, _T("TRUE")) == 0)
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
void ProgressBarTextStack_Push(CString csText)
|
|
{
|
|
gcstrListOfWarnings.AddTail(csText);
|
|
if (gHelperRoutines.OcManagerContext)
|
|
{
|
|
gHelperRoutines.SetProgressText(gHelperRoutines.OcManagerContext,csText);
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("SetProgressText = %s\n"),csText));
|
|
}
|
|
return;
|
|
}
|
|
|
|
void ProgressBarTextStack_Push(LPTSTR szText)
|
|
{
|
|
CString csText = szText;
|
|
|
|
ProgressBarTextStack_Push( csText );
|
|
}
|
|
|
|
|
|
void ProgressBarTextStack_Pop(void)
|
|
{
|
|
int iFoundLastEntry = FALSE;
|
|
CString csText;
|
|
// Get the last entry off of the stack and display it.
|
|
if (gcstrListOfWarnings.IsEmpty() == FALSE)
|
|
{
|
|
csText = gcstrListOfWarnings.RemoveTail();
|
|
if (gcstrListOfWarnings.IsEmpty() == FALSE)
|
|
{
|
|
csText = gcstrListOfWarnings.GetTail();
|
|
if (csText)
|
|
{
|
|
iFoundLastEntry = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (iFoundLastEntry)
|
|
{
|
|
if (gHelperRoutines.OcManagerContext)
|
|
{
|
|
gHelperRoutines.SetProgressText(gHelperRoutines.OcManagerContext,csText);
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("SetProgressText = %s\n"),csText));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (gHelperRoutines.OcManagerContext)
|
|
{
|
|
gHelperRoutines.SetProgressText(gHelperRoutines.OcManagerContext,_T(" "));
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("SetProgressText = ' '\n")));
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
void ListOfWarnings_Add(TCHAR * szEntry)
|
|
{
|
|
//Add entry to the list of warnings if not already there
|
|
if (_tcsicmp(szEntry, _T("")) != 0)
|
|
{
|
|
// Add it if it is not already there.
|
|
if (TRUE != IsThisStringInThisCStringList(gcstrListOfWarnings, szEntry))
|
|
{
|
|
gcstrListOfWarnings.AddTail(szEntry);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
void ListOfWarnings_Display(void)
|
|
{
|
|
if (gcstrListOfWarnings.IsEmpty() == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("************** WARNINGS START **************")));
|
|
POSITION pos = NULL;
|
|
CString csEntry;
|
|
pos = gcstrListOfWarnings.GetHeadPosition();
|
|
while (pos)
|
|
{
|
|
csEntry = gcstrListOfWarnings.GetAt(pos);
|
|
iisDebugOutSafeParams((LOG_TYPE_WARN, _T("%1!s!\n"), csEntry));
|
|
gcstrListOfWarnings.GetNext(pos);
|
|
}
|
|
iisDebugOut((LOG_TYPE_WARN, _T("************** WARNINGS END **************")));
|
|
}
|
|
return;
|
|
}
|
|
|
|
int DebugLevelRegistryOveride(TCHAR * szSectionName, TCHAR * ValueName, int * iValueToSet)
|
|
{
|
|
int iReturn = FALSE;
|
|
|
|
CRegKey regKey(HKEY_LOCAL_MACHINE, REG_INETSTP, KEY_READ);
|
|
if ((HKEY)regKey)
|
|
{
|
|
// create the key to lookup
|
|
// iis5_SectionName_ValueName
|
|
// iis5_SetupInfo_
|
|
if (szSectionName && ValueName)
|
|
{
|
|
TCHAR szTempRegString[255];
|
|
DWORD dwValue = 0x0;
|
|
_stprintf(szTempRegString, _T("IIS5:%s:%s"), szSectionName, ValueName);
|
|
regKey.m_iDisplayWarnings = FALSE;
|
|
if (regKey.QueryValue(szTempRegString, dwValue) == ERROR_SUCCESS)
|
|
{
|
|
if (dwValue <= 32000)
|
|
{
|
|
*iValueToSet = (int) dwValue;
|
|
iReturn = TRUE;
|
|
}
|
|
iisDebugOut((LOG_TYPE_PROGRAM_FLOW, _T("RegistryINFValuesOveride:%s=%d."),szTempRegString, *iValueToSet));
|
|
}
|
|
}
|
|
}
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
void GetDebugLevelFromInf(IN HINF hInfFileHandle)
|
|
{
|
|
int iTempDisplayLogging = FALSE;
|
|
INFCONTEXT Context;
|
|
TCHAR szTempString[10] = _T("");
|
|
|
|
//
|
|
// DebugLevel
|
|
//
|
|
if (!g_GlobalDebugLevelFlag_WasSetByUnattendFile)
|
|
{
|
|
iTempDisplayLogging = FALSE;
|
|
g_GlobalDebugLevelFlag = LOG_TYPE_ERROR;
|
|
if (SetupFindFirstLine_Wrapped(hInfFileHandle, _T("SetupInfo"), _T("DebugLevel"), &Context) )
|
|
{
|
|
SetupGetStringField(&Context, 1, szTempString, 10, NULL);
|
|
|
|
if (IsValidNumber((LPCTSTR)szTempString))
|
|
{
|
|
g_GlobalDebugLevelFlag = _ttoi((LPCTSTR) szTempString);
|
|
iTempDisplayLogging = TRUE;
|
|
}
|
|
|
|
if (g_GlobalDebugLevelFlag >= LOG_TYPE_TRACE_WIN32_API )
|
|
{
|
|
g_CheckIfMetabaseValueWasWritten = TRUE;
|
|
}
|
|
}
|
|
if (DebugLevelRegistryOveride(_T("SetupInfo"), _T("DebugLevel"), &g_GlobalDebugLevelFlag))
|
|
{iTempDisplayLogging = TRUE;}
|
|
if (iTempDisplayLogging)
|
|
{iisDebugOut((LOG_TYPE_TRACE, _T("DebugLevel=%d."),g_GlobalDebugLevelFlag));}
|
|
}
|
|
else
|
|
{
|
|
if (DebugLevelRegistryOveride(_T("SetupInfo"), _T("DebugLevel"), &g_GlobalDebugLevelFlag))
|
|
{iTempDisplayLogging = TRUE;}
|
|
if (iTempDisplayLogging)
|
|
{iisDebugOut((LOG_TYPE_TRACE, _T("DebugLevel=%d."),g_GlobalDebugLevelFlag));}
|
|
}
|
|
|
|
//
|
|
// DebugValidateHeap
|
|
//
|
|
iTempDisplayLogging = FALSE;
|
|
g_GlobalDebugCallValidateHeap = TRUE;
|
|
if (SetupFindFirstLine_Wrapped(hInfFileHandle, _T("SetupInfo"), _T("DebugValidateHeap"), &Context) )
|
|
{
|
|
SetupGetStringField(&Context, 1, szTempString, 10, NULL);
|
|
if (IsValidNumber((LPCTSTR)szTempString))
|
|
{
|
|
g_GlobalDebugCallValidateHeap = _ttoi((LPCTSTR) szTempString);
|
|
iTempDisplayLogging = TRUE;
|
|
}
|
|
}
|
|
if (DebugLevelRegistryOveride(_T("SetupInfo"), _T("DebugValidateHeap"), &g_GlobalDebugCallValidateHeap))
|
|
{iTempDisplayLogging = TRUE;}
|
|
if (iTempDisplayLogging)
|
|
{iisDebugOut((LOG_TYPE_TRACE, _T("DebugValidateHeap=%d."),g_GlobalDebugCallValidateHeap));}
|
|
|
|
//
|
|
// DebugCrypto
|
|
//
|
|
iTempDisplayLogging = FALSE;
|
|
g_GlobalDebugCrypto = 0;
|
|
if (SetupFindFirstLine_Wrapped(hInfFileHandle, _T("SetupInfo"), _T("DebugCrypto"), &Context) )
|
|
{
|
|
SetupGetStringField(&Context, 1, szTempString, 10, NULL);
|
|
if (IsValidNumber((LPCTSTR)szTempString))
|
|
{
|
|
g_GlobalDebugCrypto = _ttoi((LPCTSTR) szTempString);
|
|
iTempDisplayLogging = TRUE;
|
|
}
|
|
}
|
|
if (DebugLevelRegistryOveride(_T("SetupInfo"), _T("DebugCrypto"), &g_GlobalDebugCrypto))
|
|
{iTempDisplayLogging = TRUE;}
|
|
if (iTempDisplayLogging)
|
|
{iisDebugOut((LOG_TYPE_TRACE, _T("DebugCrypto=%d."),g_GlobalDebugCrypto));}
|
|
|
|
|
|
//
|
|
// FastDllInit
|
|
//
|
|
iTempDisplayLogging = FALSE;
|
|
g_GlobalFastLoad = FALSE;
|
|
if (SetupFindFirstLine_Wrapped(hInfFileHandle, _T("SetupInfo"), _T("FastDllInit"), &Context) )
|
|
{
|
|
SetupGetStringField(&Context, 1, szTempString, 10, NULL);
|
|
if (IsValidNumber((LPCTSTR)szTempString))
|
|
{
|
|
g_GlobalFastLoad = _ttoi((LPCTSTR) szTempString);
|
|
iTempDisplayLogging = TRUE;
|
|
}
|
|
}
|
|
if (DebugLevelRegistryOveride(_T("SetupInfo"), _T("FastDllInit"), &g_GlobalFastLoad))
|
|
{iTempDisplayLogging = TRUE;}
|
|
if (iTempDisplayLogging)
|
|
{iisDebugOut((LOG_TYPE_TRACE, _T("GlobalFastLoad=%d."),g_GlobalFastLoad));}
|
|
|
|
//
|
|
// Check if we should display messagebox popups
|
|
//
|
|
iTempDisplayLogging = FALSE;
|
|
if (SetupFindFirstLine_Wrapped(hInfFileHandle, _T("SetupInfo"), _T("DisplayMsgbox"), &Context) )
|
|
{
|
|
SetupGetStringField(&Context, 1, szTempString, 10, NULL);
|
|
if (IsValidNumber((LPCTSTR)szTempString))
|
|
{
|
|
int iTempNum = 0;
|
|
iTempNum = _ttoi((LPCTSTR) szTempString);
|
|
if (iTempNum > 0)
|
|
{
|
|
g_pTheApp->m_bAllowMessageBoxPopups = TRUE;
|
|
iTempDisplayLogging = TRUE;
|
|
}
|
|
}
|
|
}
|
|
if (DebugLevelRegistryOveride(_T("SetupInfo"), _T("DisplayMsgbox"), &g_pTheApp->m_bAllowMessageBoxPopups))
|
|
{iTempDisplayLogging = TRUE;}
|
|
if (iTempDisplayLogging)
|
|
{iisDebugOut((LOG_TYPE_TRACE, _T("DisplayMsgbox=%d."),g_pTheApp->m_bAllowMessageBoxPopups));}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
//****************************************************************************
|
|
//*
|
|
//* This routine will center a dialog in the active windows.
|
|
//*
|
|
//* ENTRY:
|
|
//* hwndDlg - Dialog window.
|
|
//*
|
|
//****************************************************************************
|
|
void uiCenterDialog( HWND hwndDlg )
|
|
{
|
|
RECT rc;
|
|
RECT rcScreen;
|
|
int x, y;
|
|
int cxDlg, cyDlg;
|
|
int cxScreen;
|
|
int cyScreen;
|
|
|
|
SystemParametersInfo(SPI_GETWORKAREA, 0, &rcScreen, 0);
|
|
|
|
cxScreen = rcScreen.right - rcScreen.left;
|
|
cyScreen = rcScreen.bottom - rcScreen.top;
|
|
|
|
GetWindowRect(hwndDlg,&rc);
|
|
|
|
x = rc.left; // Default is to leave the dialog where the template
|
|
y = rc.top; // was going to place it.
|
|
|
|
cxDlg = rc.right - rc.left;
|
|
cyDlg = rc.bottom - rc.top;
|
|
|
|
y = rcScreen.top + ((cyScreen - cyDlg) / 2);
|
|
x = rcScreen.left + ((cxScreen - cxDlg) / 2);
|
|
|
|
// Position the dialog.
|
|
SetWindowPos(hwndDlg, NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
//***************************************************************************
|
|
//* *
|
|
//* SYNOPSIS: Checks if a specific key in the given section and given file*
|
|
//* is defined. IF so, get the value. OW return -1 *
|
|
//* *
|
|
//***************************************************************************
|
|
DWORD IsMyKeyExists( LPCTSTR lpSec, LPCTSTR lpKey, LPTSTR lpBuf, UINT uSize, LPCTSTR lpFile )
|
|
{
|
|
DWORD dwRet;
|
|
|
|
dwRet = GetPrivateProfileString( lpSec, lpKey, "ZZZZZZ", lpBuf, uSize, lpFile );
|
|
|
|
if ( !lstrcmp( lpBuf, "ZZZZZZ" ) )
|
|
{
|
|
// no key defined
|
|
dwRet = (DWORD)(-1);
|
|
}
|
|
return dwRet;
|
|
}
|
|
|
|
|
|
//***************************************************************************
|
|
//
|
|
// FormStrWithoutPlaceHolders( LPTSTR szDst, LPCTSTR szSrc, LPCTSTR lpFile );
|
|
//
|
|
// This function can be easily described by giving examples of what it
|
|
// does:
|
|
// Input: GenFormStrWithoutPlaceHolders(dest,"desc=%MS_XYZ%", hinf) ;
|
|
// INF file has MS_VGA="Microsoft XYZ" in its [Strings] section!
|
|
//
|
|
// Output: "desc=Microsoft XYZ" in buffer dest when done.
|
|
//
|
|
//
|
|
// ENTRY:
|
|
// szDst - the destination where the string after the substitutions
|
|
// for the place holders (the ones enclosed in "%' chars!)
|
|
// is placed. This buffer should be big enough (LINE_LEN)
|
|
// szSrc - the string with the place holders.
|
|
//
|
|
// EXIT:
|
|
//
|
|
// NOTES:
|
|
// To use a '%' as such in the string, one would use %% in szSrc!
|
|
// For the sake of simplicity, we have placed a restriction that the place
|
|
// holder name string cannot have a '%' as part of it! If this is a problem
|
|
// for internationalization, we can revisit this and support it too! Also,
|
|
// the way it is implemented, if there is only one % in the string, it is
|
|
// also used as such! Another point to note is that if the key is not
|
|
// found in the [Strings] section, we just use the %strkey% as such in the
|
|
// destination. This should really help in debugging.
|
|
//
|
|
// Get/modified it from setupx: gen1.c
|
|
//***************************************************************************
|
|
DWORD FormStrWithoutPlaceHolders( LPTSTR szDst, LPCTSTR szSrc, LPCTSTR lpFile)
|
|
{
|
|
int uCnt ;
|
|
DWORD dwRet;
|
|
TCHAR *pszTmp;
|
|
LPTSTR pszSaveDst;
|
|
|
|
pszSaveDst = szDst;
|
|
// Do until we reach the end of source (null char)
|
|
while( (*szDst++ = *szSrc) )
|
|
{
|
|
// Increment source as we have only incremented destination above
|
|
if(*szSrc++ == '%')
|
|
{
|
|
if (*szSrc == '%')
|
|
{
|
|
// One can use %% to get a single percentage char in message
|
|
szSrc++ ;
|
|
continue ;
|
|
}
|
|
|
|
// see if it is well formed -- there should be a '%' delimiter
|
|
if ( (pszTmp = strchr( szSrc, '%')) != NULL )
|
|
{
|
|
szDst--; // get back to the '%' char to replace
|
|
|
|
// yes, there is a STR_KEY to be looked for in [Strings] sect.
|
|
*pszTmp = '\0' ; // replace '%' with a NULL char
|
|
|
|
dwRet = IsMyKeyExists( _T("Strings"), szSrc, szDst, _MAX_PATH, lpFile );
|
|
if ( dwRet == -1 )
|
|
{
|
|
*pszTmp = '%'; // put back original character
|
|
szSrc-- ; // get back to first '%' in Src
|
|
uCnt = DIFF(pszTmp - szSrc) + 1; // include 2nd '%'
|
|
|
|
// UGHHH... It copies 1 less byte from szSrc so that it can put
|
|
// in a NULL character, that I don't care about!!!
|
|
// Different from the normal API I am used to...
|
|
lstrcpyn( szDst, szSrc, uCnt + 1 ) ;
|
|
return (DWORD)-1;
|
|
}
|
|
else
|
|
{
|
|
// all was well, Dst filled right, but unfortunately count not passed
|
|
// back, like it used too... :-( quick fix is a lstrlen()...
|
|
uCnt = lstrlen( szDst ) ;
|
|
}
|
|
|
|
*pszTmp = '%' ; // put back original character
|
|
szSrc = pszTmp + 1 ; // set Src after the second '%'
|
|
szDst += uCnt ; // set Dst also right.
|
|
}
|
|
// else it is ill-formed -- we use the '%' as such!
|
|
else
|
|
{
|
|
return (DWORD)-1;
|
|
}
|
|
}
|
|
|
|
} // while
|
|
return (DWORD)lstrlen(pszSaveDst);
|
|
}
|
|
*/
|
|
|
|
|
|
void LogImportantFiles(void)
|
|
{
|
|
TCHAR buf[_MAX_PATH];
|
|
if (g_pTheApp->m_hInfHandle)
|
|
{
|
|
LogFileVersionsForGroupOfSections(g_pTheApp->m_hInfHandle);
|
|
}
|
|
|
|
// display current files in inetsrv date/version.
|
|
CString csTempPath = g_pTheApp->m_csPathInetsrv;
|
|
LogFilesInThisDir(csTempPath);
|
|
|
|
// display the setup iis.dll file
|
|
GetSystemDirectory( buf, _MAX_PATH);
|
|
csTempPath = buf;
|
|
csTempPath = AddPath(csTempPath, _T("iis.dll"));
|
|
LogFileVersion(csTempPath, TRUE);
|
|
|
|
return;
|
|
}
|
|
|
|
#ifndef _CHICAGO_
|
|
int CreateIUSRAccount(CString csUsername, CString csPassword, INT* piNewlyCreatedUser)
|
|
{
|
|
int err;
|
|
CString csComment, csFullName;
|
|
INT iUserWasDeleted = 0;
|
|
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("CreateIUSRAccount(): %1!s!\n"), csUsername));
|
|
|
|
// delete the old user first
|
|
//DeleteGuestUser((LPTSTR)(LPCTSTR)csUsername,&iUserWasDeleted);
|
|
|
|
// create the new user
|
|
MyLoadString(IDS_USER_COMMENT, csComment);
|
|
MyLoadString(IDS_USER_FULLNAME, csFullName);
|
|
|
|
// Create user either returns NERR_Success or err code
|
|
err = CreateUser(csUsername, csPassword, csComment, csFullName, FALSE, piNewlyCreatedUser);
|
|
if (err == NERR_Success)
|
|
{iisDebugOut((LOG_TYPE_TRACE, _T("CreateIUSRAccount(): Return 0x%x Suceess\n"), err));}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, _T("CreateIUSRAccount(): Return Err=0x%x FAILURE. deleting and retrying.\n"), err));
|
|
|
|
// try to delete it first then create it.
|
|
DeleteGuestUser((LPTSTR)(LPCTSTR)csUsername,&iUserWasDeleted);
|
|
err = CreateUser(csUsername, csPassword, csComment, csFullName, FALSE, piNewlyCreatedUser);
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("CreateIUSRAccount(): Return 0x%x\n"), err));
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
int CreateIWAMAccount(CString csUsername, CString csPassword,INT* piNewlyCreatedUser)
|
|
{
|
|
int err;
|
|
CString csComment, csFullName;
|
|
INT iUserWasDeleted = 0;
|
|
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("CreateIWAMAccount(): %1!s!\n"), csUsername));
|
|
//iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("CreateIWAMAccount(): %1!s!\n"), csPassword));
|
|
|
|
// delete the old user first
|
|
//DeleteGuestUser((LPTSTR)(LPCTSTR)csUsername,&iUserWasDeleted);
|
|
|
|
// create the new user
|
|
MyLoadString(IDS_WAMUSER_COMMENT, csComment);
|
|
MyLoadString(IDS_WAMUSER_FULLNAME, csFullName);
|
|
|
|
// Create user either returns NERR_Success or err code
|
|
err = CreateUser(csUsername, csPassword, csComment, csFullName, TRUE, piNewlyCreatedUser);
|
|
if (err == NERR_Success)
|
|
{iisDebugOut((LOG_TYPE_TRACE, _T("CreateIWAMAccount(): Return 0x%x Suceess\n"), err));}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, _T("CreateIWAMAccount(): Return Err=0x%x FAILURE. deleting and retrying.\n"), err));
|
|
|
|
// try to delete it first then create it.
|
|
DeleteGuestUser((LPTSTR)(LPCTSTR)csUsername,&iUserWasDeleted);
|
|
err = CreateUser(csUsername, csPassword, csComment, csFullName, TRUE, piNewlyCreatedUser);
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("CreateIWAMAccount(): Return 0x%x\n"), err));
|
|
}
|
|
|
|
return err;
|
|
}
|
|
#endif //_CHICAGO_
|
|
|
|
|
|
INT InstallPerformance(CString nlsRegPerf,CString nlsDll,CString nlsOpen,CString nlsClose,CString nlsCollect )
|
|
{
|
|
iisDebugOut_Start1(_T("InstallPerformance"),nlsDll);
|
|
INT err = NERR_Success;
|
|
|
|
if (g_pTheApp->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 );
|
|
}
|
|
}
|
|
|
|
iisDebugOut_End1(_T("InstallPerformance"),nlsDll);
|
|
return(err);
|
|
}
|
|
//
|
|
// Add eventlog to the registry
|
|
//
|
|
INT AddEventLog(BOOL fSystem, CString nlsService, CString nlsMsgFile, DWORD dwType)
|
|
{
|
|
iisDebugOut_Start1(_T("AddEventLog"),nlsMsgFile);
|
|
INT err = NERR_Success;
|
|
CString nlsLog = (fSystem)? REG_EVENTLOG_SYSTEM : REG_EVENTLOG_APPLICATION;
|
|
nlsLog += _T("\\");
|
|
nlsLog += nlsService;
|
|
|
|
CRegKey regService( nlsLog, HKEY_LOCAL_MACHINE );
|
|
if ( regService )
|
|
{
|
|
regService.SetValue( _T("EventMessageFile"), nlsMsgFile, TRUE );
|
|
regService.SetValue( _T("TypesSupported"), dwType );
|
|
}
|
|
iisDebugOut_End1(_T("AddEventLog"),nlsMsgFile);
|
|
return(err);
|
|
}
|
|
|
|
//
|
|
// Remove eventlog from the registry
|
|
//
|
|
|
|
INT RemoveEventLog( BOOL fSystem, CString nlsService )
|
|
{
|
|
iisDebugOut_Start1(_T("RemoveEventLog"),nlsService);
|
|
INT err = NERR_Success;
|
|
CString nlsLog = (fSystem)? REG_EVENTLOG_SYSTEM : REG_EVENTLOG_APPLICATION;
|
|
|
|
CRegKey regService( HKEY_LOCAL_MACHINE, nlsLog );
|
|
if ( regService )
|
|
{
|
|
regService.DeleteTree( nlsService );
|
|
}
|
|
iisDebugOut_End1(_T("RemoveEventLog"),nlsService);
|
|
return(err);
|
|
}
|
|
|
|
//
|
|
// Install SNMP agent to the registry
|
|
//
|
|
INT InstallAgent( CString nlsName, CString nlsPath )
|
|
{
|
|
iisDebugOut_Start1(_T("InstallAgent"),nlsPath);
|
|
INT err = NERR_Success;
|
|
do
|
|
{
|
|
CString nlsSnmpParam = REG_SNMPPARAMETERS;
|
|
CRegKey regSnmpParam( HKEY_LOCAL_MACHINE, nlsSnmpParam );
|
|
if ( regSnmpParam == (HKEY)NULL )
|
|
break;
|
|
|
|
CString nlsSoftwareMSFT = _T("Software\\Microsoft");
|
|
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 = _T("CurrentVersion");
|
|
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"),_T("Software\\Microsoft"),(LPCTSTR)nlsName,_T("CurrentVersion") );
|
|
|
|
regSnmpExt.SetValue( nlsPos, nlsValue );
|
|
break;
|
|
} else
|
|
{
|
|
if ( nlsValue.Find( nlsName) != (-1))
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
} while (FALSE);
|
|
|
|
iisDebugOut_End1(_T("InstallAgent"),nlsPath);
|
|
return(err);
|
|
}
|
|
|
|
//
|
|
// Remove an SNMP agent from the registry
|
|
//
|
|
|
|
INT RemoveAgent( CString nlsServiceName )
|
|
{
|
|
iisDebugOut_Start1(_T("RemoveAgent"),nlsServiceName);
|
|
INT err = NERR_Success;
|
|
do
|
|
{
|
|
CString nlsSoftwareAgent = _T("Software\\Microsoft");
|
|
|
|
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);
|
|
|
|
iisDebugOut_End1(_T("RemoveAgent"),nlsServiceName);
|
|
return(err);
|
|
}
|
|
|
|
void lodctr(LPCTSTR lpszIniFile)
|
|
{
|
|
#ifndef _CHICAGO_
|
|
iisDebugOut_Start1(_T("lodctr"),lpszIniFile);
|
|
CString csCmdLine = _T("lodctr ");
|
|
csCmdLine += g_pTheApp->m_csSysDir;
|
|
csCmdLine += _T("\\");
|
|
csCmdLine += lpszIniFile;
|
|
|
|
iisDebugOut_Start((_T("loadperf.dll:LoadPerfCounterTextStrings")));
|
|
LoadPerfCounterTextStrings((LPTSTR)(LPCTSTR)csCmdLine, TRUE);
|
|
iisDebugOut_End((_T("loadperf.dll:LoadPerfCounterTextStrings")));
|
|
iisDebugOut_End1(_T("lodctr"),lpszIniFile);
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
void unlodctr(LPCTSTR lpszDriver)
|
|
{
|
|
#ifndef _CHICAGO_
|
|
iisDebugOut_Start1(_T("unlodctr"),lpszDriver);
|
|
CString csCmdLine = _T("unlodctr ");
|
|
csCmdLine += lpszDriver;
|
|
iisDebugOut_Start(_T("loadperf.dll:UnloadPerfCounterTextStrings"));
|
|
UnloadPerfCounterTextStrings((LPTSTR)(LPCTSTR)csCmdLine, TRUE);
|
|
iisDebugOut_End((_T("loadperf.dll:UnloadPerfCounterTextStrings")));
|
|
iisDebugOut_End1(_T("unlodctr"),lpszDriver);
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
|
|
typedef void (*P_SslGenerateRandomBits)( PUCHAR pRandomData, LONG size );
|
|
P_SslGenerateRandomBits ProcSslGenerateRandomBits = NULL;
|
|
|
|
BOOL GenRandom(int *lpGoop, DWORD cbGoop)
|
|
{
|
|
BOOL fRet = FALSE;
|
|
HCRYPTPROV hProv = 0;
|
|
|
|
if (::CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT))
|
|
if (::CryptGenRandom(hProv,cbGoop,(BYTE *) lpGoop))
|
|
{
|
|
fRet = TRUE;
|
|
}
|
|
|
|
if (hProv) ::CryptReleaseContext(hProv,0);
|
|
|
|
return fRet;
|
|
}
|
|
|
|
|
|
int GetRandomNum(void)
|
|
{
|
|
int RandomNum;
|
|
UCHAR cRandomByte;
|
|
|
|
RandomNum = rand();
|
|
|
|
__try
|
|
{
|
|
|
|
// call the random number function
|
|
if (!GenRandom(& RandomNum,1))
|
|
{
|
|
// if that fails then try this one...
|
|
if ( ProcSslGenerateRandomBits != NULL )
|
|
{
|
|
(*ProcSslGenerateRandomBits)( &cRandomByte, 1 );
|
|
RandomNum = cRandomByte;
|
|
}
|
|
}
|
|
}
|
|
__except(EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("nException Caught in SCHANNEL.dll:ProcSslGenerateRandomBits()=0x%x.."),GetExceptionCode()));
|
|
}
|
|
|
|
return(RandomNum);
|
|
}
|
|
|
|
void ShuffleCharArray(int iSizeOfTheArray, TCHAR * lptsTheArray)
|
|
{
|
|
int i;
|
|
int iTotal;
|
|
int RandomNum;
|
|
|
|
iTotal = iSizeOfTheArray / sizeof(_TCHAR);
|
|
for (i=0; i<iTotal;i++ )
|
|
{
|
|
// shuffle the array
|
|
RandomNum=GetRandomNum();
|
|
TCHAR c = lptsTheArray[i];
|
|
lptsTheArray[i]=lptsTheArray[RandomNum%iTotal];
|
|
lptsTheArray[RandomNum%iTotal]=c;
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
// password categories
|
|
enum {STRONG_PWD_UPPER=0,
|
|
STRONG_PWD_LOWER,
|
|
STRONG_PWD_NUM,
|
|
STRONG_PWD_PUNC};
|
|
|
|
#define STRONG_PWD_CATS (STRONG_PWD_PUNC + 1)
|
|
#define NUM_LETTERS 26
|
|
#define NUM_NUMBERS 10
|
|
#define MIN_PWD_LEN 8
|
|
|
|
// password must contain at least one each of:
|
|
// uppercase, lowercase, punctuation and numbers
|
|
DWORD CreateGoodPassword(BYTE *szPwd, DWORD dwLen) {
|
|
|
|
if (dwLen-1 < MIN_PWD_LEN)
|
|
return ERROR_PASSWORD_RESTRICTION;
|
|
|
|
HCRYPTPROV hProv;
|
|
DWORD dwErr = 0;
|
|
|
|
if (CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT) == FALSE)
|
|
return GetLastError();
|
|
|
|
// zero it out and decrement the size to allow for trailing '\0'
|
|
ZeroMemory(szPwd,dwLen);
|
|
dwLen--;
|
|
|
|
// generate a pwd pattern, each byte is in the range
|
|
// (0..255) mod STRONG_PWD_CATS
|
|
// this indicates which character pool to take a char from
|
|
BYTE *pPwdPattern = new BYTE[dwLen];
|
|
BOOL fFound[STRONG_PWD_CATS];
|
|
do {
|
|
// bug!bug! does CGR() ever fail?
|
|
CryptGenRandom(hProv,dwLen,pPwdPattern);
|
|
|
|
fFound[STRONG_PWD_UPPER] =
|
|
fFound[STRONG_PWD_LOWER] =
|
|
fFound[STRONG_PWD_PUNC] =
|
|
fFound[STRONG_PWD_NUM] = FALSE;
|
|
|
|
for (DWORD i=0; i < dwLen; i++)
|
|
fFound[pPwdPattern[i] % STRONG_PWD_CATS] = TRUE;
|
|
|
|
#ifdef _DEBUG
|
|
if (!fFound[STRONG_PWD_UPPER] ||
|
|
!fFound[STRONG_PWD_LOWER] ||
|
|
!fFound[STRONG_PWD_PUNC] ||
|
|
!fFound[STRONG_PWD_NUM]) {
|
|
iisDebugOut((LOG_TYPE_TRACE,_T("Oops! Regen pattern required [%d, %d, %d, %d]\n"),
|
|
fFound[STRONG_PWD_UPPER],
|
|
fFound[STRONG_PWD_LOWER],
|
|
fFound[STRONG_PWD_PUNC],
|
|
fFound[STRONG_PWD_NUM]));
|
|
}
|
|
#endif
|
|
|
|
// check that each character category is in the pattern
|
|
} while (!fFound[STRONG_PWD_UPPER] ||
|
|
!fFound[STRONG_PWD_LOWER] ||
|
|
!fFound[STRONG_PWD_PUNC] ||
|
|
!fFound[STRONG_PWD_NUM]);
|
|
|
|
// populate password with random data
|
|
// this, in conjunction with pPwdPattern, is
|
|
// used to determine the actual data
|
|
CryptGenRandom(hProv,dwLen,szPwd);
|
|
|
|
for (DWORD i=0; i < dwLen; i++) {
|
|
BYTE bChar = 0;
|
|
|
|
// there is a bias in each character pool because of the % function
|
|
switch (pPwdPattern[i] % STRONG_PWD_CATS) {
|
|
|
|
case STRONG_PWD_UPPER : bChar = 'A' + szPwd[i] % NUM_LETTERS;
|
|
break;
|
|
|
|
case STRONG_PWD_LOWER : bChar = 'a' + szPwd[i] % NUM_LETTERS;
|
|
break;
|
|
|
|
case STRONG_PWD_NUM : bChar = '0' + szPwd[i] % NUM_NUMBERS;
|
|
break;
|
|
|
|
case STRONG_PWD_PUNC :
|
|
default: char *szPunc="!@#$%^&*()_-+=[{]};:\'\"<>,./?\\|~`";
|
|
DWORD dwLenPunc = lstrlenA(szPunc);
|
|
bChar = szPunc[szPwd[i] % dwLenPunc];
|
|
break;
|
|
}
|
|
|
|
szPwd[i] = bChar;
|
|
|
|
#ifdef _DEBUG
|
|
iisDebugOut((LOG_TYPE_TRACE,_T("[%03d] Pattern is %d, index is %d, char is '%c'\n"),i,pPwdPattern[i] % STRONG_PWD_CATS,szPwd[i],bChar));
|
|
#endif
|
|
|
|
}
|
|
|
|
delete pPwdPattern;
|
|
|
|
if (hProv != NULL)
|
|
CryptReleaseContext(hProv,0);
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
|
|
//
|
|
// Create a random password
|
|
//
|
|
void CreatePasswordOld(TCHAR *pszPassword, int iSize)
|
|
{
|
|
//
|
|
// Use Maximum available password length, as
|
|
// setting any other length might run afoul
|
|
// of the minimum password length setting
|
|
//
|
|
int nLength = (iSize - 1);
|
|
int iTotal = 0;
|
|
int RandomNum = 0;
|
|
int i;
|
|
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('_')
|
|
};
|
|
|
|
// create a random password
|
|
ProcSslGenerateRandomBits = NULL;
|
|
|
|
HINSTANCE hSslDll = LoadLibraryEx(_T("schannel.dll"), NULL, 0 );
|
|
if ( hSslDll )
|
|
{
|
|
ProcSslGenerateRandomBits = (P_SslGenerateRandomBits)GetProcAddress( hSslDll, "SslGenerateRandomBits");
|
|
}
|
|
else
|
|
{
|
|
// check if this file has missing file it's supposed to be linked with.
|
|
// or if the file has mismatched import\export dependencies with linked files.
|
|
#ifdef _WIN64
|
|
// don't call cause it's broken
|
|
#else
|
|
//Check_File_Dependencies(_T("schannel.dll"));
|
|
#endif
|
|
}
|
|
|
|
// See the random number generation for rand() call in GetRandomNum()
|
|
time_t timer;
|
|
time( &timer );
|
|
srand( (unsigned int) timer );
|
|
|
|
// shuffle around the global six2pr[] array
|
|
ShuffleCharArray(sizeof(six2pr), (TCHAR*) &six2pr);
|
|
// assign each character of the password array
|
|
iTotal = sizeof(six2pr) / sizeof(_TCHAR);
|
|
for ( i=0;i<nLength;i++ )
|
|
{
|
|
RandomNum=GetRandomNum();
|
|
pszPassword[i]=six2pr[RandomNum%iTotal];
|
|
}
|
|
|
|
//
|
|
// in order to meet a possible
|
|
// policy set upon passwords..
|
|
//
|
|
// replace the last 4 chars with these:
|
|
//
|
|
// 1) something from !@#$%^&*()-+=
|
|
// 2) something from 1234567890
|
|
// 3) an uppercase letter
|
|
// 4) a lowercase letter
|
|
//
|
|
TCHAR something1[12] = {_T('!'), _T('@'), _T('#'), _T('$'), _T('^'), _T('&'), _T('*'), _T('('), _T(')'), _T('-'), _T('+'), _T('=')};
|
|
ShuffleCharArray(sizeof(something1), (TCHAR*) &something1);
|
|
TCHAR something2[10] = {_T('0'), _T('1'), _T('2'), _T('3'), _T('4'), _T('5'), _T('6'), _T('7'), _T('8'), _T('9')};
|
|
ShuffleCharArray(sizeof(something2),(TCHAR*) &something2);
|
|
TCHAR something3[26] = {_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')};
|
|
ShuffleCharArray(sizeof(something3),(TCHAR*) &something3);
|
|
TCHAR something4[26] = {_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')};
|
|
ShuffleCharArray(sizeof(something4),(TCHAR*)&something4);
|
|
|
|
RandomNum=GetRandomNum();
|
|
iTotal = sizeof(something1) / sizeof(_TCHAR);
|
|
pszPassword[nLength-4]=something1[RandomNum%iTotal];
|
|
|
|
RandomNum=GetRandomNum();
|
|
iTotal = sizeof(something2) / sizeof(_TCHAR);
|
|
pszPassword[nLength-3]=something2[RandomNum%iTotal];
|
|
|
|
RandomNum=GetRandomNum();
|
|
iTotal = sizeof(something3) / sizeof(_TCHAR);
|
|
pszPassword[nLength-2]=something3[RandomNum%iTotal];
|
|
|
|
RandomNum=GetRandomNum();
|
|
iTotal = sizeof(something4) / sizeof(_TCHAR);
|
|
pszPassword[nLength-1]=something4[RandomNum%iTotal];
|
|
|
|
pszPassword[nLength]=_T('\0');
|
|
|
|
if (hSslDll)
|
|
{FreeLibrary( hSslDll );}
|
|
}
|
|
|
|
|
|
// Creates a secure password
|
|
// caller must GlobalFree Return pointer
|
|
// iSize = size of password to create
|
|
LPTSTR CreatePassword(int iSize)
|
|
{
|
|
LPTSTR pszPassword = NULL;
|
|
BYTE *szPwd = new BYTE[iSize];
|
|
DWORD dwPwdLen = iSize;
|
|
int i = 0;
|
|
|
|
// use the new secure password generator
|
|
// unfortunately this baby doesn't use unicode.
|
|
// so we'll call it and then convert it to unicode afterwards.
|
|
if (0 == CreateGoodPassword(szPwd,dwPwdLen))
|
|
{
|
|
#if defined(UNICODE) || defined(_UNICODE)
|
|
// convert it to unicode and copy it back into our unicode buffer.
|
|
// compute the length
|
|
i = MultiByteToWideChar(CP_ACP, 0, (LPSTR) szPwd, -1, NULL, 0);
|
|
if (i <= 0)
|
|
{goto CreatePassword_Exit;}
|
|
pszPassword = (LPTSTR) GlobalAlloc(GPTR, i * sizeof(TCHAR));
|
|
if (!pszPassword)
|
|
{goto CreatePassword_Exit;}
|
|
i = MultiByteToWideChar(CP_ACP, 0, (LPSTR) szPwd, -1, pszPassword, i);
|
|
if (i <= 0)
|
|
{
|
|
GlobalFree(pszPassword);
|
|
pszPassword = NULL;
|
|
goto CreatePassword_Exit;
|
|
}
|
|
// make sure ends with null
|
|
pszPassword[i - 1] = 0;
|
|
#else
|
|
pszPassword = (LPSTR) GlobalAlloc(GPTR, _tcslen((LPTSTR) szPwd) * sizeof(TCHAR));
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN,_T("CreateGoodPassword FAILED, using other password generator\n")));
|
|
// CreateGoodPassword failed...
|
|
// lets go with one that we know works...
|
|
pszPassword = (LPTSTR) GlobalAlloc(GPTR, iSize * sizeof(TCHAR));
|
|
if (!pszPassword)
|
|
{goto CreatePassword_Exit;}
|
|
CreatePasswordOld(pszPassword,iSize);
|
|
}
|
|
|
|
CreatePassword_Exit:
|
|
if (szPwd){delete szPwd;szPwd=NULL;}
|
|
return pszPassword;
|
|
}
|
|
|
|
|
|
BOOL RunProgram( LPCTSTR pszProgram, LPTSTR CmdLine, BOOL fMinimized , DWORD dwWaitTimeInSeconds, BOOL fCreateNewConsole)
|
|
{
|
|
DWORD dwProcessType = NORMAL_PRIORITY_CLASS;
|
|
STARTUPINFO si;
|
|
ZeroMemory(&si, sizeof(STARTUPINFO));
|
|
si.cb = sizeof( STARTUPINFO );
|
|
if (fMinimized)
|
|
{
|
|
GetStartupInfo(&si);
|
|
si.dwFlags |= STARTF_USESHOWWINDOW;
|
|
si.wShowWindow = SW_HIDE;
|
|
|
|
// Per bug #321409
|
|
// if you don't specify sw_hide, then this
|
|
// "accessibility magnifier" app will get funky focus events during setup
|
|
// from this CreateProcess.
|
|
//si.wShowWindow = SW_SHOWMINIMIZED;
|
|
}
|
|
PROCESS_INFORMATION pi;
|
|
|
|
if (fCreateNewConsole)
|
|
{
|
|
dwProcessType = CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS;
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("RunProgram:Start:Exe=%1!s!,Parm=%2!s!,NewConsole"),pszProgram, CmdLine)); }
|
|
else
|
|
{
|
|
// for some reason, a cmd window pops up during setup when we call "iisreset.exe /scm"
|
|
// only way to prevent this is specify DETACHED_PROCESS
|
|
dwProcessType = DETACHED_PROCESS | NORMAL_PRIORITY_CLASS;
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("RunProgram:Start:Exe=%1!s!,Parm=%2!s!"),pszProgram, CmdLine));
|
|
}
|
|
|
|
if (!CreateProcess( pszProgram, CmdLine, NULL, NULL, FALSE, dwProcessType, NULL, NULL, &si, &pi ))
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_ERROR, _T("RunProgram:Failed:Exe=%1!s!\n, Parm=%2!s!"),pszProgram, CmdLine));
|
|
return FALSE;
|
|
}
|
|
|
|
if ( pi.hProcess != NULL )
|
|
{
|
|
DWORD dwSecondsToWait;
|
|
|
|
if (dwWaitTimeInSeconds == INFINITE)
|
|
{
|
|
dwSecondsToWait = INFINITE;
|
|
}
|
|
else
|
|
{
|
|
dwSecondsToWait = dwWaitTimeInSeconds * 1000;
|
|
}
|
|
DWORD dwEvent = WaitForSingleObject( pi.hProcess, dwSecondsToWait);
|
|
if ( dwEvent != ERROR_SUCCESS )
|
|
{
|
|
// check if wait failed
|
|
if ( dwEvent == WAIT_FAILED )
|
|
{iisDebugOutSafeParams((LOG_TYPE_ERROR, _T("RunProgram:WaitForSingleObject() ERROR.WAIT_FAILED.Err=0x%1!x!."),GetLastError()));}
|
|
else if ( dwEvent == WAIT_ABANDONED )
|
|
{iisDebugOutSafeParams((LOG_TYPE_WARN, _T("RunProgram:WaitForSingleObject() WARNING.WAIT_ABANDONED.Err=0x%1!x!."),dwEvent));}
|
|
else if ( dwEvent == WAIT_OBJECT_0 )
|
|
{iisDebugOutSafeParams((LOG_TYPE_WARN, _T("RunProgram:WaitForSingleObject() WARNING.WAIT_OBJECT_0.Err=0x%1!x!."),dwEvent));}
|
|
else if ( dwEvent == WAIT_TIMEOUT )
|
|
{iisDebugOutSafeParams((LOG_TYPE_WARN, _T("RunProgram:WaitForSingleObject() WARNING.WAIT_TIMEOUT.Err=0x%1!x!."),dwEvent));}
|
|
else
|
|
{iisDebugOutSafeParams((LOG_TYPE_ERROR, _T("RunProgram:WaitForSingleObject() FAILED.Err=0x%1!x!."),dwEvent));}
|
|
|
|
TerminateProcess( pi.hProcess, 1 );
|
|
CloseHandle( pi.hThread );
|
|
}
|
|
CloseHandle( pi.hProcess );
|
|
}
|
|
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("RunProgram:End:Exe=%1!s!,Parm=%2!s!"),pszProgram, CmdLine));
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void SetAppFriendlyName(LPCTSTR szKeyPath)
|
|
{
|
|
CString csKeyPath, csPath, csDesc;
|
|
CStringArray aPath, aDesc;
|
|
int nArray = 0, i = 0;
|
|
CMDKey cmdKey;
|
|
|
|
// szKeyPath is in the form of LM/W3SVC/i
|
|
csKeyPath = szKeyPath;
|
|
|
|
csPath = csKeyPath + _T("/Root");
|
|
aPath.Add(csPath);
|
|
MyLoadString(IDS_APP_FRIENDLY_ROOT, csDesc);
|
|
aDesc.Add(csDesc);
|
|
csPath = csKeyPath + _T("/Root/IISADMIN");
|
|
aPath.Add(csPath);
|
|
MyLoadString(IDS_APP_FRIENDLY_IISADMIN, csDesc);
|
|
aDesc.Add(csDesc);
|
|
csPath = csKeyPath + _T("/Root/WEBPUB");
|
|
aPath.Add(csPath);
|
|
MyLoadString(IDS_APP_FRIENDLY_WEBPUB, csDesc);
|
|
aDesc.Add(csDesc);
|
|
csPath = csKeyPath + _T("/Root/IISSAMPLES");
|
|
aPath.Add(csPath);
|
|
MyLoadString(IDS_APP_FRIENDLY_IISSAMPLES, csDesc);
|
|
aDesc.Add(csDesc);
|
|
csPath = csKeyPath + _T("/Root/IISHELP");
|
|
aPath.Add(csPath);
|
|
MyLoadString(IDS_APP_FRIENDLY_IISHELP, csDesc);
|
|
aDesc.Add(csDesc);
|
|
|
|
nArray = (int)aPath.GetSize();
|
|
for (i=0; i<nArray; i++)
|
|
{
|
|
cmdKey.OpenNode(aPath[i]);
|
|
if ( (METADATA_HANDLE)cmdKey )
|
|
{
|
|
CString csName;
|
|
TCHAR szName[_MAX_PATH];
|
|
DWORD attr, uType, dType, cbLen;
|
|
BOOL b;
|
|
b = cmdKey.GetData(MD_APP_FRIENDLY_NAME, &attr, &uType, &dType, &cbLen, (PBYTE)szName, _MAX_PATH);
|
|
if (!b || !(*szName))
|
|
{
|
|
csName = aDesc[i];
|
|
cmdKey.SetData(MD_APP_FRIENDLY_NAME,METADATA_INHERIT,IIS_MD_UT_WAM,STRING_METADATA,(csName.GetLength() + 1) * sizeof(TCHAR),(LPBYTE)(LPCTSTR)csName);
|
|
}
|
|
cmdKey.Close();
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
void SetInProc( LPCTSTR szKeyPath)
|
|
{
|
|
CString csKeyPath, csPath;
|
|
CStringArray aPath;
|
|
int nArray = 0, i = 0;
|
|
CMDKey cmdKey;
|
|
|
|
// szKeyPath is in the form of LM/W3SVC/i
|
|
csKeyPath = szKeyPath;
|
|
|
|
csPath = csKeyPath + _T("/Root/IISSAMPLES");
|
|
aPath.Add(csPath);
|
|
csPath = csKeyPath + _T("/Root/IISHELP");
|
|
aPath.Add(csPath);
|
|
csPath = csKeyPath + _T("/Root/WEBPUB");
|
|
aPath.Add(csPath);
|
|
|
|
nArray = (int)aPath.GetSize();
|
|
for (i=0; i<nArray; i++) {
|
|
cmdKey.OpenNode(aPath[i]);
|
|
if ( (METADATA_HANDLE)cmdKey )
|
|
{
|
|
CString csName;
|
|
TCHAR szName[_MAX_PATH];
|
|
DWORD attr, uType, dType, cbLen;
|
|
BOOL b;
|
|
|
|
b = cmdKey.GetData(MD_APP_ROOT, &attr, &uType, &dType, &cbLen, (PBYTE)szName, _MAX_PATH);
|
|
cmdKey.Close();
|
|
|
|
if (!b || !(*szName))
|
|
{
|
|
CreateInProc_Wrap(aPath[i], TRUE);
|
|
}
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Add a custom error string to the existing custom errors. We are only adding FILE type
|
|
// error so that is assumed.
|
|
// dwCustErr is the ID of the error
|
|
// intSubCode is the sub code of the error. Pass in -1 to get a * for all subcodes
|
|
// szFilePath is the file to link to the custom error
|
|
// szKeyPath is the path in the metabase to write to
|
|
//#define SZ_CUSTOM_ERROR _T("404,*,FILE,%s\\help\\iishelp\\common\\404.htm|")
|
|
void AddCustomError(IN DWORD dwCustErr, IN INT intSubCode, IN LPCTSTR szErrorString, IN LPCTSTR szKeyPath, IN BOOL fOverwriteExisting )
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("AddCustomError().Start.%d:%d:%s:%s:%d\n"),dwCustErr,intSubCode,szErrorString,szKeyPath,fOverwriteExisting ));
|
|
CMDKey cmdKey;
|
|
PVOID pData = NULL;
|
|
BOOL fFoundExisting = FALSE;
|
|
|
|
CString csCustomErrorString;
|
|
|
|
// start by building our new error string
|
|
// if intSubCode is < 1 use a * instead of a numerical value
|
|
if ( intSubCode < 0 )
|
|
csCustomErrorString.Format( _T("%d,*,%s"), dwCustErr, szErrorString );
|
|
else
|
|
csCustomErrorString.Format( _T("%d,%d,%s"), dwCustErr, intSubCode, szErrorString );
|
|
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("AddCustomError().part1:%s\n"),csCustomErrorString));
|
|
|
|
cmdKey.OpenNode(szKeyPath);
|
|
if ( (METADATA_HANDLE)cmdKey )
|
|
{
|
|
DWORD dwAttr = METADATA_INHERIT;
|
|
DWORD dwUType = IIS_MD_UT_FILE;
|
|
DWORD dwDType = MULTISZ_METADATA;
|
|
DWORD dwLength = 0;
|
|
|
|
// we need to start this process by getting the existing multisz data from the metabase
|
|
// first, figure out how much memory we will need to do this
|
|
if (_tcsicmp(szKeyPath,_T("LM/W3SVC/Info")) == 0)
|
|
{
|
|
dwAttr = METADATA_NO_ATTRIBUTES;
|
|
dwUType = IIS_MD_UT_SERVER;
|
|
cmdKey.GetData( MD_CUSTOM_ERROR_DESC,&dwAttr,&dwUType,&dwDType,&dwLength,NULL,0,METADATA_NO_ATTRIBUTES,IIS_MD_UT_SERVER,MULTISZ_METADATA);
|
|
}
|
|
else
|
|
{
|
|
cmdKey.GetData( MD_CUSTOM_ERROR,&dwAttr,&dwUType,&dwDType,&dwLength,NULL,0,METADATA_INHERIT,IIS_MD_UT_FILE,MULTISZ_METADATA);
|
|
}
|
|
|
|
// unfortunatly, the above routine only returns TRUE or FALSE. And since we are purposefully
|
|
// passing in a null ponter of 0 size in order to get the length of the data, it will always
|
|
// return 0 whether it was because the metabase is inacessable, or there pointer was NULL,
|
|
// which it is. So - I guess we assume it worked, allocate the buffer and attempt to read it
|
|
// in again.
|
|
|
|
TCHAR* pErrors;
|
|
DWORD cbBuffer = dwLength;
|
|
|
|
// add enough space to the allocated space that we can just append the string
|
|
cbBuffer += (csCustomErrorString.GetLength() + 4) * sizeof(WCHAR);
|
|
dwLength = cbBuffer;
|
|
|
|
// allocate the space, if it fails, we fail
|
|
// note that GPTR causes it to be initialized to zero
|
|
pData = GlobalAlloc( GPTR, cbBuffer );
|
|
if ( !pData )
|
|
{
|
|
cmdKey.Close();
|
|
return;
|
|
}
|
|
pErrors = (TCHAR*)pData;
|
|
|
|
// now get the data from the metabase
|
|
BOOL f;
|
|
if (_tcsicmp(szKeyPath,_T("LM/W3SVC/Info")) == 0)
|
|
{
|
|
f = cmdKey.GetData( MD_CUSTOM_ERROR_DESC,&dwAttr,&dwUType,&dwDType,&dwLength,(PUCHAR)pData,cbBuffer,METADATA_NO_ATTRIBUTES,IIS_MD_UT_SERVER,MULTISZ_METADATA );
|
|
}
|
|
else
|
|
{
|
|
f = cmdKey.GetData( MD_CUSTOM_ERROR,&dwAttr,&dwUType,&dwDType,&dwLength,(PUCHAR)pData,cbBuffer,METADATA_INHERIT,IIS_MD_UT_FILE,MULTISZ_METADATA );
|
|
}
|
|
|
|
// if we have successfully retrieved the existing custom errors, then we need to scan them
|
|
// and remove or find any duplicates. Then we can add our new custom error. Then we can write it
|
|
// out. If we didn't retrieve it, then we should just try to write out what we have.
|
|
if ( f )
|
|
{
|
|
// got the existing errors, scan them now - pErrors will be pointing at the second end \0
|
|
// when it is time to exit the loop.
|
|
while ( *pErrors )
|
|
{
|
|
CString csError = pErrors;
|
|
CString cs;
|
|
DWORD dwTestErrorID;
|
|
INT intTestSubCode;
|
|
|
|
// get the first error ID code
|
|
cs = csError.Left( csError.Find(_T(',')) );
|
|
csError = csError.Right( csError.GetLength() - (cs.GetLength() +1) );
|
|
_stscanf( cs, _T("%d"), &dwTestErrorID );
|
|
|
|
// get the second code
|
|
cs = csError.Left( csError.Find(_T(',')) );
|
|
if ( cs == _T('*') )
|
|
intTestSubCode = -1;
|
|
else
|
|
_stscanf( cs, _T("%d"), &intTestSubCode );
|
|
|
|
// if it is the same, then chop off this custom error string and do NOT increment pErrors
|
|
if ( (dwTestErrorID == dwCustErr) && (intTestSubCode == intSubCode) )
|
|
{
|
|
fFoundExisting = TRUE;
|
|
// NOTE: if we are not overwriting existing, then just break because we
|
|
// won't be doing anything after all - we found an existing one
|
|
if ( !fOverwriteExisting )
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("AddCustomError().Do not overwritexisting\n")));
|
|
break;
|
|
}
|
|
|
|
// get the location of the next string in the multisz
|
|
TCHAR* pNext = _tcsninc( pErrors, _tcslen(pErrors))+1;
|
|
|
|
// Get the length of the data to copy
|
|
DWORD cbCopyLength = cbBuffer - DIFF((PBYTE)pNext - (PBYTE)pData);
|
|
|
|
// copy the memory down.
|
|
MoveMemory( pErrors, pNext, cbCopyLength );
|
|
|
|
// do not increment the string
|
|
continue;
|
|
}
|
|
|
|
// increment pErrors to the next string
|
|
pErrors = _tcsninc( pErrors, _tcslen(pErrors))+1;
|
|
}
|
|
}
|
|
|
|
// check if we need to finish this or not
|
|
if ( fOverwriteExisting || !fFoundExisting )
|
|
{
|
|
// append our new error to the end of the list. The value pErrors should be pointing
|
|
// to the correct location to copy it in to
|
|
_tcscpy( pErrors, csCustomErrorString );
|
|
|
|
// calculate the correct data length for this thing
|
|
// get the location of the end of the multisz
|
|
TCHAR* pNext = _tcsninc( pErrors, _tcslen(pErrors))+2;
|
|
// Get the length of the data to copy
|
|
cbBuffer = DIFF((PBYTE)pNext - (PBYTE)pData);
|
|
|
|
// write the new errors list back out to the metabase
|
|
if (_tcsicmp(szKeyPath,_T("LM/W3SVC/Info")) == 0)
|
|
{
|
|
cmdKey.SetData(MD_CUSTOM_ERROR_DESC,METADATA_NO_ATTRIBUTES,IIS_MD_UT_SERVER,MULTISZ_METADATA,cbBuffer,(PUCHAR)pData);
|
|
}
|
|
else
|
|
{
|
|
cmdKey.SetData(MD_CUSTOM_ERROR,METADATA_INHERIT,IIS_MD_UT_FILE,MULTISZ_METADATA,cbBuffer,(PUCHAR)pData);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//
|
|
//
|
|
//
|
|
}
|
|
|
|
// always close the metabase key
|
|
cmdKey.Close();
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("AddCustomError().OpenNode failed:%s\n"),szKeyPath));
|
|
}
|
|
|
|
// clean up
|
|
if ( pData ){GlobalFree(pData);pData=NULL;}
|
|
iisDebugOut_End((_T("AddCustomError")));
|
|
return;
|
|
}
|
|
|
|
|
|
ScriptMapNode *AllocNewScriptMapNode(LPTSTR szExt, LPTSTR szProcessor, DWORD dwFlags, LPTSTR szMethods)
|
|
{
|
|
ScriptMapNode *pNew = NULL;
|
|
|
|
pNew = (ScriptMapNode *)calloc(1, sizeof(ScriptMapNode));
|
|
if (pNew)
|
|
{
|
|
_tcscpy(pNew->szExt, szExt);
|
|
_tcscpy(pNew->szProcessor, szProcessor);
|
|
pNew->dwFlags = dwFlags;
|
|
_tcscpy(pNew->szMethods, szMethods);
|
|
pNew->prev = NULL;
|
|
pNew->next = NULL;
|
|
}
|
|
|
|
return pNew;
|
|
}
|
|
|
|
//
|
|
// The script map should not be sored because
|
|
// the order is infact important.
|
|
void InsertScriptMapList(ScriptMapNode *pList, ScriptMapNode *p, BOOL fReplace)
|
|
{
|
|
ScriptMapNode *t;
|
|
int i;
|
|
int bFound = FALSE;
|
|
|
|
if (!p) {return;}
|
|
|
|
#ifdef SCRIPTMAP_SORTED
|
|
t = pList->next;
|
|
while (t != pList)
|
|
{
|
|
i = _tcsicmp(t->szExt, p->szExt);
|
|
|
|
// if the next entry in the list is less than what we have.
|
|
// then
|
|
if (i < 0)
|
|
{
|
|
t = t->next;
|
|
// continue
|
|
}
|
|
|
|
if (i == 0)
|
|
{
|
|
if (fReplace)
|
|
{
|
|
// replace t
|
|
p->next = t->next;
|
|
p->prev = t->prev;
|
|
(t->prev)->next = p;
|
|
(t->next)->prev = p;
|
|
free(t);
|
|
}
|
|
else
|
|
{
|
|
// don't replace t
|
|
free(p);
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (i > 0)
|
|
{
|
|
// location found: insert before t
|
|
break;
|
|
}
|
|
}
|
|
|
|
// insert before t
|
|
p->next = t;
|
|
p->prev = t->prev;
|
|
(t->prev)->next = p;
|
|
t->prev = p;
|
|
#else
|
|
// loop thru the whole list and see if we can find our entry.
|
|
// if we cannot find it then add it to the end.
|
|
// if we can find it then replace it if we need to.
|
|
bFound = FALSE;
|
|
t = pList->next;
|
|
while (t != pList)
|
|
{
|
|
i = _tcsicmp(t->szExt, p->szExt);
|
|
|
|
// we found a match, do replace or don't replace
|
|
if (i == 0)
|
|
{
|
|
bFound = TRUE;
|
|
if (fReplace)
|
|
{
|
|
// replace t
|
|
p->next = t->next;
|
|
p->prev = t->prev;
|
|
(t->prev)->next = p;
|
|
(t->next)->prev = p;
|
|
free(t);
|
|
}
|
|
else
|
|
{
|
|
// don't replace t
|
|
free(p);
|
|
}
|
|
return;
|
|
}
|
|
|
|
// Go get the next one
|
|
t = t->next;
|
|
}
|
|
|
|
// see if we found something
|
|
if (FALSE == bFound)
|
|
{
|
|
// insert before t
|
|
p->next = t;
|
|
p->prev = t->prev;
|
|
(t->prev)->next = p;
|
|
t->prev = p;
|
|
}
|
|
#endif
|
|
|
|
return;
|
|
}
|
|
|
|
void FreeScriptMapList(ScriptMapNode *pList)
|
|
{
|
|
ScriptMapNode *t = NULL, *p = NULL;
|
|
|
|
t = pList->next;
|
|
while (t != pList)
|
|
{
|
|
p = t->next;
|
|
free(t);
|
|
t = p;
|
|
}
|
|
|
|
t->prev = t;
|
|
t->next = t;
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
void GetScriptMapListFromRegistry(ScriptMapNode *pList)
|
|
{
|
|
iisDebugOut_Start(_T("GetScriptMapListFromRegistry"), LOG_TYPE_TRACE);
|
|
int iFound = FALSE;
|
|
|
|
GetScriptMapListFromClean(pList, _T("ScriptMaps_CleanList"));
|
|
|
|
CRegKey regScriptMap( HKEY_LOCAL_MACHINE, _T("System\\CurrentControlSet\\Services\\W3svc\\Parameters\\Script Map"));
|
|
if ((HKEY)regScriptMap )
|
|
{
|
|
// delete mappings of .bat and .cmd
|
|
regScriptMap.DeleteValue( _T(".bat") );
|
|
regScriptMap.DeleteValue( _T(".cmd") );
|
|
|
|
CRegValueIter regEnum( regScriptMap );
|
|
CString csExt, csProcessor, csMethods;
|
|
CString csTemp;
|
|
ScriptMapNode *pNode;
|
|
|
|
while ( regEnum.Next( &csExt, &csProcessor ) == ERROR_SUCCESS )
|
|
{
|
|
iFound = FALSE;
|
|
csTemp = csProcessor;
|
|
csTemp.MakeLower();
|
|
csMethods = _T("");
|
|
|
|
if (csTemp.Right(7) == _T("asp.dll"))
|
|
{
|
|
// Make sure it points to the new location...
|
|
csProcessor = g_pTheApp->m_csPathInetsrv + _T("\\asp.dll");
|
|
// asp has special methods.
|
|
|
|
// add PROPFIND,PROPPATCH,MKCOL,COPY,MOVE,LOCK,UNLOCK,MS-SEARCH 6/17 per vanvan for Dav.
|
|
csMethods = _T("PUT,DELETE,OPTIONS,PROPFIND,PROPPATCH,MKCOL,COPY,MOVE,LOCK,UNLOCK,MS-SEARCH");
|
|
}
|
|
|
|
if (csTemp.Right(7) == _T("ism.dll"))
|
|
{
|
|
// Make sure it points to the new location...
|
|
// remap since ism.dll has a security hole
|
|
csProcessor = g_pTheApp->m_csPathInetsrv + _T("\\asp.dll");
|
|
}
|
|
|
|
if (csTemp.Right(12) == _T("httpodbc.dll"))
|
|
{
|
|
// Make sure it points to the new location...
|
|
csProcessor = g_pTheApp->m_csPathInetsrv + _T("\\httpodbc.dll");
|
|
}
|
|
|
|
if (csTemp.Right(9) == _T("ssinc.dll"))
|
|
{
|
|
// Make sure it points to the new location...
|
|
csProcessor = g_pTheApp->m_csPathInetsrv + _T("\\ssinc.dll");
|
|
}
|
|
|
|
// Add it to the script map
|
|
pNode = AllocNewScriptMapNode((LPTSTR)(LPCTSTR)csExt, (LPTSTR)(LPCTSTR)csProcessor, MD_SCRIPTMAPFLAG_SCRIPT, _T(""));
|
|
InsertScriptMapList(pList, pNode, FALSE);
|
|
}
|
|
}
|
|
iisDebugOut_End(_T("GetScriptMapListFromRegistry"),LOG_TYPE_TRACE);
|
|
return;
|
|
}
|
|
|
|
void GetScriptMapListFromMetabase(ScriptMapNode *pList, int iUpgradeType)
|
|
{
|
|
iisDebugOut_Start(_T("GetScriptMapListFromMetabase"), LOG_TYPE_TRACE);
|
|
|
|
//DumpScriptMapList();
|
|
// When upgrading from a metabase we should not add other script maps
|
|
// which the user probably explicitly removed!
|
|
// GetScriptMapListFromClean(pList, _T("ScriptMaps_CleanList"));
|
|
//DumpScriptMapList();
|
|
|
|
BOOL bFound = FALSE;
|
|
DWORD attr, uType, dType, cbLen;
|
|
CMDKey cmdKey;
|
|
BUFFER bufData;
|
|
LPTSTR p, rest;
|
|
CString csName, csValue;
|
|
PBYTE pData;
|
|
int BufSize;
|
|
|
|
CString csBinPath;
|
|
|
|
cmdKey.OpenNode(_T("LM/W3SVC"));
|
|
if ( (METADATA_HANDLE)cmdKey )
|
|
{
|
|
pData = (PBYTE)(bufData.QueryPtr());
|
|
BufSize = bufData.QuerySize();
|
|
cbLen = 0;
|
|
bFound = cmdKey.GetData(MD_SCRIPT_MAPS, &attr, &uType, &dType, &cbLen, pData, BufSize);
|
|
if (!bFound && (cbLen > 0))
|
|
{
|
|
if ( ! (bufData.Resize(cbLen)) )
|
|
{
|
|
cmdKey.Close();
|
|
return; // insufficient memory
|
|
}
|
|
else
|
|
{
|
|
pData = (PBYTE)(bufData.QueryPtr());
|
|
BufSize = cbLen;
|
|
cbLen = 0;
|
|
bFound = cmdKey.GetData(MD_SCRIPT_MAPS, &attr, &uType, &dType, &cbLen, pData, BufSize);
|
|
}
|
|
}
|
|
cmdKey.Close();
|
|
|
|
ScriptMapNode *pNode;
|
|
CString csString;
|
|
TCHAR szExt[32], szProcessor[_MAX_PATH], szMethods[_MAX_PATH];
|
|
DWORD dwFlags;
|
|
int i;
|
|
if (bFound && (dType == MULTISZ_METADATA))
|
|
{
|
|
p = (LPTSTR)pData;
|
|
while (*p)
|
|
{
|
|
rest = p + _tcslen(p) + 1;
|
|
|
|
// szExt,szProcessor,dwFlags[,szMethods]
|
|
|
|
LPTSTR q = p;
|
|
i = 0;
|
|
while ( *q )
|
|
{
|
|
if (*q == _T(','))
|
|
{
|
|
i++;
|
|
*q = _T('\0');
|
|
q = _tcsinc(q);
|
|
if (i == 1)
|
|
_tcscpy(szExt, p);
|
|
if (i == 2)
|
|
_tcscpy(szProcessor, p);
|
|
if (i == 3)
|
|
break;
|
|
p = q;
|
|
}
|
|
else
|
|
{
|
|
q = _tcsinc(q);
|
|
}
|
|
}
|
|
dwFlags = atodw(p);
|
|
_tcscpy(szMethods, q);
|
|
|
|
CString csProcessor = szProcessor;
|
|
csProcessor.MakeLower();
|
|
|
|
//
|
|
// Check if this is the one for asp.dll
|
|
//
|
|
if (csProcessor.Right(7) == _T("asp.dll"))
|
|
{
|
|
// metabase should now have inclusion list and not exclusion list, so
|
|
// don't do this for UT_50. 2/23/99 aaronl.
|
|
|
|
// But UT_40 have a exclusion list.
|
|
// So we have to make sure it have the full exclusion list
|
|
if ( iUpgradeType == UT_40)
|
|
{
|
|
CString csMethods = szMethods;
|
|
csMethods.MakeUpper();
|
|
|
|
// changed 4/21/98 aaronl, added 'Options'
|
|
// add PROPFIND,PROPPATCH,MKCOL,COPY,MOVE,LOCK,UNLOCK,MS-SEARCH 6/17 per vanvan for Dav.
|
|
if (csMethods.Find(_T("PUT,DELETE,OPTIONS,PROPFIND,PROPPATCH,MKCOL,COPY,MOVE,LOCK,UNLOCK,MS-SEARCH")) == -1)
|
|
{
|
|
if (csMethods.IsEmpty())
|
|
{
|
|
// if it's empty, then put to the default.
|
|
csMethods = _T("PUT,DELETE,OPTIONS,PROPFIND,PROPPATCH,MKCOL,COPY,MOVE,LOCK,UNLOCK,MS-SEARCH");
|
|
}
|
|
else
|
|
{
|
|
if (csMethods.Find(_T("GET")) == -1)
|
|
{
|
|
// We didn't find the "GET" verb so we can safely say
|
|
// that we are looking at an exclusion list
|
|
CString csMethodsNew;
|
|
csMethodsNew = _T("");
|
|
|
|
// is put in there? if not add it
|
|
if (csMethods.Find(_T("PUT")) == -1) {csMethodsNew += _T("PUT,");}
|
|
if (csMethods.Find(_T("DELETE")) == -1) {csMethodsNew += _T("DELETE,");}
|
|
if (csMethods.Find(_T("OPTIONS")) == -1) {csMethodsNew += _T("OPTIONS,");}
|
|
if (csMethods.Find(_T("PROPFIND")) == -1) {csMethodsNew += _T("PROPFIND,");}
|
|
if (csMethods.Find(_T("PROPPATCH")) == -1) {csMethodsNew += _T("PROPPATCH,");}
|
|
if (csMethods.Find(_T("MKCOL")) == -1) {csMethodsNew += _T("MKCOL,");}
|
|
if (csMethods.Find(_T("COPY")) == -1) {csMethodsNew += _T("COPY,");}
|
|
if (csMethods.Find(_T("MOVE")) == -1) {csMethodsNew += _T("MOVE,");}
|
|
if (csMethods.Find(_T("LOCK")) == -1) {csMethodsNew += _T("LOCK,");}
|
|
if (csMethods.Find(_T("UNLOCK")) == -1) {csMethodsNew += _T("UNLOCK,");}
|
|
if (csMethods.Find(_T("MS-SEARCH")) == -1) {csMethodsNew += _T("MS-SEARCH,");}
|
|
|
|
// has an extra ',' at the end
|
|
//csMethods = _T("PUT,DELETE,OPTIONS,PROPFIND,PROPPATCH,MKCOL,COPY,MOVE,LOCK,UNLOCK,MS-SEARCH,");
|
|
csMethods = csMethodsNew;
|
|
csMethods += szMethods;
|
|
}
|
|
}
|
|
_tcscpy(szMethods, csMethods);
|
|
}
|
|
}
|
|
|
|
// make sure it points to the new asp.dll location
|
|
csBinPath = g_pTheApp->m_csPathInetsrv + _T("\\asp.dll");
|
|
_tcscpy(szProcessor, csBinPath);
|
|
}
|
|
|
|
//
|
|
// Check if this is the one for ism.dll
|
|
//
|
|
if (csProcessor.Right(7) == _T("ism.dll"))
|
|
{
|
|
// make sure it points to the new location
|
|
// remap since ism.dll has a security hole
|
|
csBinPath = g_pTheApp->m_csPathInetsrv + _T("\\asp.dll");
|
|
_tcscpy(szProcessor, csBinPath);
|
|
}
|
|
|
|
//
|
|
// Check if this is the one for httpodbc.dll
|
|
//
|
|
if (csProcessor.Right(12) == _T("httpodbc.dll"))
|
|
{
|
|
// make sure it points to the new location
|
|
csBinPath = g_pTheApp->m_csPathInetsrv + _T("\\httpodbc.dll");
|
|
_tcscpy(szProcessor, csBinPath);
|
|
}
|
|
|
|
//
|
|
// Check if this is the one for ssinc.dll
|
|
//
|
|
if (csProcessor.Right(9) == _T("ssinc.dll"))
|
|
{
|
|
// make sure it points to the new location
|
|
csBinPath = g_pTheApp->m_csPathInetsrv + _T("\\ssinc.dll");
|
|
_tcscpy(szProcessor, csBinPath);
|
|
}
|
|
|
|
p = rest; // points to the next string
|
|
pNode = AllocNewScriptMapNode(szExt, szProcessor, dwFlags | MD_SCRIPTMAPFLAG_SCRIPT, szMethods);
|
|
//iisDebugOut((LOG_TYPE_TRACE, _T("Calling InsertScriptMapList=%s:%s:%d:%s.\n"),szExt,szProcessor,dwFlags | MD_SCRIPTMAPFLAG_SCRIPT,szMethods));
|
|
InsertScriptMapList(pList, pNode, TRUE);
|
|
}
|
|
}
|
|
}
|
|
|
|
iisDebugOut_End(_T("GetScriptMapListFromMetabase"),LOG_TYPE_TRACE);
|
|
return;
|
|
}
|
|
|
|
void DumpScriptMapList()
|
|
{
|
|
BOOL bFound = FALSE;
|
|
DWORD attr, uType, dType, cbLen;
|
|
CMDKey cmdKey;
|
|
BUFFER bufData;
|
|
LPTSTR p, rest;
|
|
CString csName, csValue;
|
|
PBYTE pData;
|
|
int BufSize;
|
|
|
|
CString csBinPath;
|
|
|
|
cmdKey.OpenNode(_T("LM/W3SVC"));
|
|
if ( (METADATA_HANDLE)cmdKey )
|
|
{
|
|
pData = (PBYTE)(bufData.QueryPtr());
|
|
BufSize = bufData.QuerySize();
|
|
cbLen = 0;
|
|
bFound = cmdKey.GetData(MD_SCRIPT_MAPS, &attr, &uType, &dType, &cbLen, pData, BufSize);
|
|
if (!bFound && (cbLen > 0))
|
|
{
|
|
if ( ! (bufData.Resize(cbLen)) )
|
|
{
|
|
cmdKey.Close();
|
|
return; // insufficient memory
|
|
}
|
|
else
|
|
{
|
|
pData = (PBYTE)(bufData.QueryPtr());
|
|
BufSize = cbLen;
|
|
cbLen = 0;
|
|
bFound = cmdKey.GetData(MD_SCRIPT_MAPS, &attr, &uType, &dType, &cbLen, pData, BufSize);
|
|
}
|
|
}
|
|
cmdKey.Close();
|
|
|
|
CString csString;
|
|
TCHAR szExt[32], szProcessor[_MAX_PATH], szMethods[_MAX_PATH];
|
|
DWORD dwFlags;
|
|
int i;
|
|
if (bFound && (dType == MULTISZ_METADATA))
|
|
{
|
|
p = (LPTSTR)pData;
|
|
while (*p)
|
|
{
|
|
rest = p + _tcslen(p) + 1;
|
|
|
|
// szExt,szProcessor,dwFlags[,szMethods]
|
|
|
|
LPTSTR q = p;
|
|
i = 0;
|
|
while ( *q )
|
|
{
|
|
if (*q == _T(','))
|
|
{
|
|
i++;
|
|
*q = _T('\0');
|
|
q = _tcsinc(q);
|
|
if (i == 1)
|
|
_tcscpy(szExt, p);
|
|
if (i == 2)
|
|
_tcscpy(szProcessor, p);
|
|
if (i == 3)
|
|
break;
|
|
p = q;
|
|
}
|
|
else
|
|
{
|
|
q = _tcsinc(q);
|
|
}
|
|
}
|
|
dwFlags = atodw(p);
|
|
_tcscpy(szMethods, q);
|
|
|
|
CString csProcessor = szProcessor;
|
|
csProcessor.MakeLower();
|
|
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("DumpScriptMapList=%s,%s,%s\n"),szExt, csProcessor,szMethods));
|
|
|
|
p = rest; // points to the next string
|
|
}
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
void WriteScriptMapListToMetabase(ScriptMapNode *pList, LPTSTR szKeyPath, DWORD dwFlags)
|
|
{
|
|
iisDebugOut_Start1(_T("WriteScriptMapListToMetabase"), szKeyPath, LOG_TYPE_TRACE);
|
|
|
|
CString csString, csTemp;
|
|
ScriptMapNode *t = NULL;
|
|
int len = 0;
|
|
|
|
t = pList->next;
|
|
while (t != pList)
|
|
{
|
|
if ( *(t->szMethods) )
|
|
csTemp.Format( _T("%s,%s,%d,%s|"), t->szExt, t->szProcessor, (t->dwFlags | dwFlags), t->szMethods );
|
|
else
|
|
csTemp.Format( _T("%s,%s,%d|"), t->szExt, t->szProcessor, (t->dwFlags | dwFlags) );
|
|
len += csTemp.GetLength();
|
|
|
|
//iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("WriteScriptMapListToMetabase().ADDEntry=%1!s!\n"), csTemp));
|
|
|
|
csString += csTemp;
|
|
t = t->next;
|
|
}
|
|
|
|
if (len > 0)
|
|
{
|
|
HGLOBAL hBlock = NULL;
|
|
|
|
len++;
|
|
hBlock = GlobalAlloc(GPTR, len * sizeof(TCHAR));
|
|
if (hBlock)
|
|
{
|
|
LPTSTR s;
|
|
s = (LPTSTR)hBlock;
|
|
_tcscpy(s, csString);
|
|
while (*s)
|
|
{
|
|
if (*s == _T('|'))
|
|
{*s = _T('\0');}
|
|
s = _tcsinc(s);
|
|
}
|
|
|
|
CMDKey cmdKey;
|
|
cmdKey.CreateNode(METADATA_MASTER_ROOT_HANDLE, szKeyPath);
|
|
if ( (METADATA_HANDLE)cmdKey )
|
|
{
|
|
cmdKey.SetData(MD_SCRIPT_MAPS,METADATA_INHERIT,IIS_MD_UT_FILE,MULTISZ_METADATA,len * sizeof(TCHAR),(LPBYTE)hBlock);
|
|
cmdKey.Close();
|
|
}
|
|
}
|
|
}
|
|
|
|
iisDebugOut_End1(_T("WriteScriptMapListToMetabase"),szKeyPath,LOG_TYPE_TRACE);
|
|
//DumpScriptMapList();
|
|
return;
|
|
}
|
|
|
|
|
|
// this function does not use the va_list stuff because if
|
|
// there ever is this case: iisDebugOut("<SYSTEMROOT>") it will hose
|
|
// because it will try to put something in the %s part when there were no
|
|
// variables passed in.
|
|
void iisDebugOutSafe2(int iLogType, TCHAR * acsString)
|
|
{
|
|
// Check what type of log this should be.
|
|
int iProceed = FALSE;
|
|
|
|
if (iLogType == LOG_TYPE_ERROR)
|
|
{SetErrorFlag(__FILE__, __LINE__);}
|
|
|
|
switch(iLogType)
|
|
{
|
|
case LOG_TYPE_TRACE_WIN32_API:
|
|
if (g_GlobalDebugLevelFlag >= LOG_TYPE_TRACE_WIN32_API)
|
|
{iProceed = TRUE;}
|
|
break;
|
|
case LOG_TYPE_TRACE:
|
|
if (g_GlobalDebugLevelFlag >= LOG_TYPE_TRACE)
|
|
{iProceed = TRUE;}
|
|
break;
|
|
case LOG_TYPE_PROGRAM_FLOW:
|
|
if (g_GlobalDebugLevelFlag >= LOG_TYPE_PROGRAM_FLOW)
|
|
{iProceed = TRUE;}
|
|
break;
|
|
case LOG_TYPE_WARN:
|
|
if (g_GlobalDebugLevelFlag >= LOG_TYPE_WARN)
|
|
{iProceed = TRUE;}
|
|
break;
|
|
case LOG_TYPE_ERROR:
|
|
if (g_GlobalDebugLevelFlag >= LOG_TYPE_ERROR)
|
|
{iProceed = TRUE;}
|
|
break;
|
|
default:
|
|
// this must be an error
|
|
iProceed = TRUE;
|
|
break;
|
|
}
|
|
|
|
if (iProceed)
|
|
{
|
|
if (LOG_TYPE_ERROR == iLogType)
|
|
{
|
|
g_MyLogFile.LogFileWrite(_T("!FAIL! "));
|
|
}
|
|
// always output to the log file
|
|
g_MyLogFile.LogFileWrite(_T("%s"), acsString);
|
|
//#if DBG == 1 || DEBUG == 1 || _DEBUG == 1
|
|
// OK. Here is the deal.
|
|
// nt5 does not want to see any OutputDebugString stuff
|
|
// so, we need to remove it for them.
|
|
// Actually we'll check the registry key
|
|
// to see if it is turned on for the ocmanage component.
|
|
// if it is then, set it on for us.
|
|
if (g_GlobalDebugLevelFlag >= LOG_TYPE_TRACE_WIN32_API)
|
|
{
|
|
if (LOG_TYPE_ERROR == iLogType)
|
|
{OutputDebugString(_T("!FAIL!"));}
|
|
// output to screen
|
|
if (g_MyLogFile.m_szLogPreLineInfo) {OutputDebugString(g_MyLogFile.m_szLogPreLineInfo);}
|
|
OutputDebugString(acsString);
|
|
|
|
// if it does not end if '\r\n' then make one.
|
|
int nLen = _tcslen(acsString);
|
|
if (acsString[nLen-1] != _T('\n'))
|
|
{OutputDebugString(_T("\r\n"));}
|
|
}
|
|
//#endif // DBG
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
void iisDebugOut2(int iLogType, TCHAR *pszfmt, ...)
|
|
{
|
|
// Check what type of log this should be.
|
|
int iProceed = FALSE;
|
|
|
|
switch(iLogType)
|
|
{
|
|
case LOG_TYPE_TRACE_WIN32_API:
|
|
if (g_GlobalDebugLevelFlag >= LOG_TYPE_TRACE_WIN32_API)
|
|
{iProceed = TRUE;}
|
|
break;
|
|
case LOG_TYPE_TRACE:
|
|
if (g_GlobalDebugLevelFlag >= LOG_TYPE_TRACE)
|
|
{iProceed = TRUE;}
|
|
break;
|
|
case LOG_TYPE_PROGRAM_FLOW:
|
|
if (g_GlobalDebugLevelFlag >= LOG_TYPE_PROGRAM_FLOW)
|
|
{iProceed = TRUE;}
|
|
break;
|
|
case LOG_TYPE_WARN:
|
|
if (g_GlobalDebugLevelFlag >= LOG_TYPE_WARN)
|
|
{iProceed = TRUE;}
|
|
break;
|
|
case LOG_TYPE_ERROR:
|
|
if (g_GlobalDebugLevelFlag >= LOG_TYPE_ERROR)
|
|
{iProceed = TRUE;}
|
|
break;
|
|
default:
|
|
// this must be an error
|
|
iProceed = TRUE;
|
|
break;
|
|
}
|
|
|
|
if (iProceed)
|
|
{
|
|
TCHAR acsString[1000];
|
|
// 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_list va;
|
|
va_start(va, pszfmt);
|
|
_vstprintf(acsString, pszfmt, va);
|
|
va_end(va);
|
|
}
|
|
__except(EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
TCHAR szErrorString[100];
|
|
_stprintf(szErrorString, _T("\r\n\r\nException Caught in iisDebugOut2(). GetExceptionCode()=0x%x.\r\n\r\n"), GetExceptionCode());
|
|
OutputDebugString(szErrorString);
|
|
g_MyLogFile.LogFileWrite(szErrorString);
|
|
}
|
|
|
|
// output to log file and the screen.
|
|
iisDebugOutSafe2(iLogType, acsString);
|
|
}
|
|
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 iisDebugOutSafeParams2(int iLogType, TCHAR *pszfmt, ...)
|
|
{
|
|
// Check what type of log this should be.
|
|
int iProceed = FALSE;
|
|
switch(iLogType)
|
|
{
|
|
case LOG_TYPE_TRACE_WIN32_API:
|
|
if (g_GlobalDebugLevelFlag >= LOG_TYPE_TRACE_WIN32_API)
|
|
{iProceed = TRUE;}
|
|
break;
|
|
case LOG_TYPE_TRACE:
|
|
if (g_GlobalDebugLevelFlag >= LOG_TYPE_TRACE)
|
|
{iProceed = TRUE;}
|
|
break;
|
|
case LOG_TYPE_PROGRAM_FLOW:
|
|
if (g_GlobalDebugLevelFlag >= LOG_TYPE_PROGRAM_FLOW)
|
|
{iProceed = TRUE;}
|
|
break;
|
|
case LOG_TYPE_WARN:
|
|
if (g_GlobalDebugLevelFlag >= LOG_TYPE_WARN)
|
|
{iProceed = TRUE;}
|
|
break;
|
|
case LOG_TYPE_ERROR:
|
|
if (g_GlobalDebugLevelFlag >= LOG_TYPE_ERROR)
|
|
{iProceed = TRUE;}
|
|
break;
|
|
default:
|
|
// this must be an error
|
|
iProceed = TRUE;
|
|
break;
|
|
}
|
|
|
|
if (iProceed)
|
|
{
|
|
// The count of parameters do not match
|
|
va_list va;
|
|
TCHAR *pszFullErrMsg = NULL;
|
|
|
|
va_start(va, pszfmt);
|
|
|
|
__try
|
|
{
|
|
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_STRING, (LPCVOID) pszfmt, 0, 0, (LPTSTR) &pszFullErrMsg, 0, &va);
|
|
}
|
|
__except(EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
TCHAR szErrorString[100];
|
|
_stprintf(szErrorString, _T("\r\n\r\nException Caught in iisDebugOutSafeParams2(). GetExceptionCode()=0x%x.\r\n\r\n"), GetExceptionCode());
|
|
OutputDebugString(szErrorString);
|
|
g_MyLogFile.LogFileWrite(szErrorString);
|
|
}
|
|
|
|
if (pszFullErrMsg)
|
|
{
|
|
// output to log file and the screen.
|
|
iisDebugOutSafe2(iLogType, pszFullErrMsg);
|
|
}
|
|
va_end(va);
|
|
|
|
if (pszFullErrMsg) {LocalFree(pszFullErrMsg);pszFullErrMsg=NULL;}
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
void HandleSpecificErrors(DWORD iTheErrorCode, DWORD dwFormatReturn, CString csMsg, TCHAR pMsg[], CString *pcsErrMsg)
|
|
{
|
|
CString csErrMsg;
|
|
CString csExtraMsg;
|
|
|
|
switch(iTheErrorCode)
|
|
{
|
|
case NTE_BAD_SIGNATURE:
|
|
// load extra error message for this error!
|
|
MyLoadString(IDS_BAD_SIGNATURE_RELNOTES, csExtraMsg);
|
|
|
|
if (dwFormatReturn) {csErrMsg.Format(_T("%s\n\n0x%x=%s\n\n%s"), csMsg, iTheErrorCode, pMsg, csExtraMsg);}
|
|
else{csErrMsg.Format(_T("%s\n\nErrorCode=0x%x.\n\n%s"), csMsg, iTheErrorCode, csExtraMsg);}
|
|
break;
|
|
case CO_E_RUNAS_LOGON_FAILURE:
|
|
// we should get the mts runas user from the registry and display it.
|
|
|
|
default:
|
|
// Put everything into csErrMsg
|
|
if (dwFormatReturn) {csErrMsg.Format(_T("%s\n\n0x%x=%s"), csMsg, iTheErrorCode, pMsg);}
|
|
else{csErrMsg.Format(_T("%s\n\nErrorCode=0x%x."), csMsg, iTheErrorCode);}
|
|
break;
|
|
}
|
|
|
|
// copy the error string into the passed in CString
|
|
(*pcsErrMsg) = csErrMsg;
|
|
return;
|
|
}
|
|
|
|
|
|
//***************************************************************************
|
|
//*
|
|
//* purpose:
|
|
//*
|
|
//***************************************************************************
|
|
LPWSTR MakeWideStrFromAnsi(LPSTR psz)
|
|
{
|
|
LPWSTR pwsz;
|
|
int i;
|
|
|
|
// arg checking.
|
|
//
|
|
if (!psz)
|
|
return NULL;
|
|
|
|
// compute the length
|
|
//
|
|
i = MultiByteToWideChar(CP_ACP, 0, psz, -1, NULL, 0);
|
|
if (i <= 0) return NULL;
|
|
|
|
//iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("ole32:CoTaskMemAlloc().Start.")));
|
|
pwsz = (LPWSTR) CoTaskMemAlloc(i * sizeof(WCHAR));
|
|
//iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("ole32:CoTaskMemAlloc().End.")));
|
|
|
|
if (!pwsz) return NULL;
|
|
MultiByteToWideChar(CP_ACP, 0, psz, -1, pwsz, i);
|
|
pwsz[i - 1] = 0;
|
|
return pwsz;
|
|
}
|
|
|
|
|
|
DWORD CallProcedureInDll_wrap(LPCTSTR lpszDLLFile, LPCTSTR lpszProcedureToCall, BOOL bDisplayMsgOnErrFlag, BOOL bInitOleFlag,BOOL iFunctionPrototypeFlag)
|
|
{
|
|
int bFinishedFlag = FALSE;
|
|
UINT iMsg = NULL;
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
TCHAR szExceptionString[50] = _T("");
|
|
LogHeapState(FALSE, __FILE__, __LINE__);
|
|
|
|
do
|
|
{
|
|
__try
|
|
{
|
|
dwReturn = CallProcedureInDll(lpszDLLFile, lpszProcedureToCall, bDisplayMsgOnErrFlag, bInitOleFlag, iFunctionPrototypeFlag);
|
|
LogHeapState(FALSE, __FILE__, __LINE__);
|
|
}
|
|
__except(EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_ERROR, _T("ExceptionCaught!:CallProcedureInDll_wrap(): File:%1!s!, Procedure:%2!s!\n"), lpszDLLFile, lpszProcedureToCall));
|
|
switch (GetExceptionCode())
|
|
{
|
|
case EXCEPTION_ACCESS_VIOLATION:
|
|
_tcscpy(szExceptionString, _T("EXCEPTION_ACCESS_VIOLATION"));
|
|
break;
|
|
case EXCEPTION_BREAKPOINT:
|
|
_tcscpy(szExceptionString, _T("EXCEPTION_BREAKPOINT"));
|
|
break;
|
|
case EXCEPTION_DATATYPE_MISALIGNMENT:
|
|
_tcscpy(szExceptionString, _T("EXCEPTION_DATATYPE_MISALIGNMENT"));
|
|
break;
|
|
case EXCEPTION_SINGLE_STEP:
|
|
_tcscpy(szExceptionString, _T("EXCEPTION_SINGLE_STEP"));
|
|
break;
|
|
case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
|
|
_tcscpy(szExceptionString, _T("EXCEPTION_ARRAY_BOUNDS_EXCEEDED"));
|
|
break;
|
|
case EXCEPTION_FLT_DENORMAL_OPERAND:
|
|
_tcscpy(szExceptionString, _T("EXCEPTION_FLT_DENORMAL_OPERAND"));
|
|
break;
|
|
case EXCEPTION_FLT_DIVIDE_BY_ZERO:
|
|
_tcscpy(szExceptionString, _T("EXCEPTION_FLT_DIVIDE_BY_ZERO"));
|
|
break;
|
|
case EXCEPTION_FLT_INEXACT_RESULT:
|
|
_tcscpy(szExceptionString, _T("EXCEPTION_FLT_INEXACT_RESULT"));
|
|
break;
|
|
case EXCEPTION_FLT_INVALID_OPERATION:
|
|
_tcscpy(szExceptionString, _T("EXCEPTION_FLT_INVALID_OPERATION"));
|
|
break;
|
|
case EXCEPTION_FLT_OVERFLOW:
|
|
_tcscpy(szExceptionString, _T("EXCEPTION_FLT_OVERFLOW"));
|
|
break;
|
|
case EXCEPTION_FLT_STACK_CHECK:
|
|
_tcscpy(szExceptionString, _T("EXCEPTION_FLT_STACK_CHECK"));
|
|
break;
|
|
case EXCEPTION_FLT_UNDERFLOW:
|
|
_tcscpy(szExceptionString, _T("EXCEPTION_FLT_UNDERFLOW"));
|
|
break;
|
|
case EXCEPTION_INT_DIVIDE_BY_ZERO:
|
|
_tcscpy(szExceptionString, _T("EXCEPTION_INT_DIVIDE_BY_ZERO"));
|
|
break;
|
|
case EXCEPTION_INT_OVERFLOW:
|
|
_tcscpy(szExceptionString, _T("EXCEPTION_INT_OVERFLOW"));
|
|
break;
|
|
case EXCEPTION_PRIV_INSTRUCTION:
|
|
_tcscpy(szExceptionString, _T("EXCEPTION_PRIV_INSTRUCTION"));
|
|
break;
|
|
case EXCEPTION_NONCONTINUABLE_EXCEPTION:
|
|
_tcscpy(szExceptionString, _T("EXCEPTION_NONCONTINUABLE_EXCEPTION"));
|
|
break;
|
|
default:
|
|
_tcscpy(szExceptionString, _T("Unknown Exception Type"));
|
|
break;
|
|
}
|
|
//MyMessageBox( NULL, IDS_REGSVR_CAUGHT_EXCEPTION, lpszProcedureToCall, lpszDLLFile, GetExceptionCode(), MB_OK | MB_SETFOREGROUND );
|
|
MyMessageBox( NULL, IDS_REGSVR_CAUGHT_EXCEPTION, szExceptionString, lpszProcedureToCall, lpszDLLFile, GetExceptionCode(), MB_OK | MB_SETFOREGROUND );
|
|
dwReturn = ERROR_PROCESS_ABORTED;
|
|
}
|
|
|
|
if (dwReturn == ERROR_SUCCESS)
|
|
{
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if (bDisplayMsgOnErrFlag == TRUE)
|
|
{
|
|
iMsg = MyMessageBox( NULL, IDS_RETRY, MB_ABORTRETRYIGNORE | MB_SETFOREGROUND );
|
|
switch ( iMsg )
|
|
{
|
|
case IDRETRY:
|
|
break;
|
|
case IDIGNORE:
|
|
case IDABORT:
|
|
default:
|
|
// return whatever err happened
|
|
goto CallProcedureInDll_wrap_Exit;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// return whatever err happened
|
|
goto CallProcedureInDll_wrap_Exit;
|
|
}
|
|
|
|
}
|
|
} while (dwReturn != ERROR_SUCCESS);
|
|
|
|
CallProcedureInDll_wrap_Exit:
|
|
return dwReturn;
|
|
}
|
|
|
|
|
|
void AddOLEAUTRegKey()
|
|
{
|
|
CRegKey regCLSID46(_T("CLSID\\{00020424-0000-0000-C000-000000000046}"),HKEY_CLASSES_ROOT);
|
|
if ((HKEY)regCLSID46)
|
|
{
|
|
#ifdef _CHICAGO_
|
|
regCLSID46.SetValue(_T(""), _T("PSAutomation"));
|
|
#else
|
|
regCLSID46.SetValue(_T(""), _T("PSOAInterface"));
|
|
#endif
|
|
}
|
|
|
|
CRegKey regInProcServer(_T("CLSID\\{00020424-0000-0000-C000-000000000046}\\InprocServer"),HKEY_CLASSES_ROOT);
|
|
if ((HKEY)regInProcServer)
|
|
{
|
|
regInProcServer.SetValue(_T(""), _T("ole2disp.dll"));
|
|
}
|
|
|
|
CRegKey regInProcServer32(_T("CLSID\\{00020424-0000-0000-C000-000000000046}\\InprocServer32"),HKEY_CLASSES_ROOT);
|
|
if ((HKEY)regInProcServer32)
|
|
{
|
|
regInProcServer32.SetValue(_T(""), _T("oleaut32.dll"));
|
|
regInProcServer32.SetValue(_T("ThreadingModel"), _T("Both"));
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
// Returns:
|
|
// ERROR_SUCCESS if successfull.
|
|
// ERROR_OPERATION_ABORTED if the operation failed and the user wants to abort setup!
|
|
DWORD RegisterOLEControl(LPCTSTR lpszOcxFile, BOOL fAction)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("RegisterOLEControl():File=%1!s!, Action=%2!d!\n"), lpszOcxFile, fAction));
|
|
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
if (fAction)
|
|
{
|
|
dwReturn = CallProcedureInDll_wrap(lpszOcxFile, _T("DllRegisterServer"), TRUE, TRUE, FUNCTION_PARAMS_NONE);
|
|
}
|
|
else
|
|
{
|
|
#if DBG == 1 || DEBUG == 1 || _DEBUG == 1
|
|
// Show errors if this is a debug build
|
|
dwReturn = CallProcedureInDll_wrap(lpszOcxFile, _T("DllUnregisterServer"), TRUE, TRUE, FUNCTION_PARAMS_NONE);
|
|
#else
|
|
// Set 3rd parameter to false so that there are no MyMessageBox popups if any errors
|
|
dwReturn = CallProcedureInDll_wrap(lpszOcxFile, _T("DllUnregisterServer"), FALSE, TRUE, FUNCTION_PARAMS_NONE);
|
|
#endif
|
|
}
|
|
return dwReturn;
|
|
}
|
|
|
|
|
|
typedef HRESULT (CALLBACK *HCRET)(void);
|
|
typedef HRESULT (*PFUNCTION2)(HMODULE myDllHandle);
|
|
|
|
DWORD CallProcedureInDll(LPCTSTR lpszDLLFile, LPCTSTR lpszProcedureToCall, BOOL bDisplayMsgOnErrFlag, BOOL bInitOleFlag, BOOL iFunctionPrototypeFlag)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_PROGRAM_FLOW, _T("------------------\n")));
|
|
iisDebugOutSafeParams((LOG_TYPE_PROGRAM_FLOW, _T("CallProcedureInDll(%1!s!): %2!s!\n"), lpszDLLFile, lpszProcedureToCall));
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
HINSTANCE hDll = NULL;
|
|
|
|
// Diferent function prototypes...
|
|
HCRET hProc = NULL;
|
|
PFUNCTION2 hProc2 = NULL;
|
|
int iTempProcGood = FALSE;
|
|
HRESULT hRes = 0;
|
|
|
|
BOOL bBalanceOLE = FALSE;
|
|
HRESULT hInitRes = NULL;
|
|
|
|
int err = NOERROR;
|
|
|
|
// Variables to changing and saving dirs
|
|
TCHAR szDirName[_MAX_PATH], szFilePath[_MAX_PATH];
|
|
// Variable to set error string
|
|
TCHAR szErrString[256];
|
|
|
|
_tcscpy(szDirName, _T(""));
|
|
_tcscpy(szErrString, _T(""));
|
|
|
|
// perform a defensive check
|
|
if ( FAILED(FTestForOutstandingCoInits()) )
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("Outstanding CoInit in %s. WARNING."), lpszDLLFile));
|
|
}
|
|
|
|
|
|
// If we need to initialize the ole library then init it.
|
|
if (bInitOleFlag)
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("ole32(OleInitialize):start.\n")));
|
|
bBalanceOLE = iOleInitialize();
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("ole32(OleInitialize):end.\n")));
|
|
if (FALSE == bBalanceOLE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("ole32(OleInitialize):start.\n")));
|
|
hInitRes = OleInitialize(NULL);
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("ole32(OleInitialize):end.\n")));
|
|
// Ole Failed.
|
|
dwReturn = hInitRes;
|
|
SetLastError(dwReturn);
|
|
if (bDisplayMsgOnErrFlag)
|
|
{
|
|
MyMessageBox(NULL, IDS_OLE_INIT_FAILED, lpszDLLFile, hInitRes, MB_OK | MB_SETFOREGROUND);
|
|
}
|
|
goto CallProcedureInDll_Exit;
|
|
}
|
|
}
|
|
|
|
// Check if the file exists
|
|
if (!IsFileExist(lpszDLLFile))
|
|
{
|
|
dwReturn = ERROR_FILE_NOT_FOUND;
|
|
if (bDisplayMsgOnErrFlag)
|
|
{
|
|
MyMessageBox(NULL, IDS_FILE_DOES_NOT_EXIST, lpszDLLFile, ERROR_FILE_NOT_FOUND, MB_OK | MB_SETFOREGROUND);
|
|
}
|
|
SetLastError(dwReturn);
|
|
goto CallProcedureInDll_Exit;
|
|
}
|
|
|
|
// Change Directory
|
|
GetCurrentDirectory( _MAX_PATH, szDirName );
|
|
InetGetFilePath(lpszDLLFile, szFilePath);
|
|
|
|
// Change to The Drive.
|
|
if (-1 == _chdrive( _totupper(szFilePath[0]) - 'A' + 1 )) {}
|
|
if (SetCurrentDirectory(szFilePath) == 0) {}
|
|
|
|
// Try to load the module,dll,ocx.
|
|
hDll = LoadLibraryEx(lpszDLLFile, NULL, LOAD_WITH_ALTERED_SEARCH_PATH );
|
|
if (!hDll)
|
|
{
|
|
// Failed to load library, Probably because some .dll file is missing.
|
|
// Show the error message.
|
|
iisDebugOutSafeParams((LOG_TYPE_ERROR, _T("CallProcedureInDll():%1!s!:%2!s!:LoadLibraryEx FAILED.\n"), lpszDLLFile, lpszProcedureToCall));
|
|
|
|
if ( GetLastError() != ERROR_SUCCESS )
|
|
{
|
|
dwReturn = GetLastError();
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_FILE_NOT_FOUND;
|
|
}
|
|
|
|
if (bDisplayMsgOnErrFlag)
|
|
{
|
|
MyMessageBox(NULL, IDS_LOADLIBRARY_FAILED, lpszDLLFile, TYPE_E_CANTLOADLIBRARY, MB_OK | MB_SETFOREGROUND);
|
|
}
|
|
SetLastError(dwReturn);
|
|
|
|
// check if this file has missing file it's supposed to be linked with.
|
|
// or if the file has mismatched import\export dependencies with linked files.
|
|
#ifdef _WIN64
|
|
// don't call cause it's broken
|
|
#else
|
|
//Check_File_Dependencies(lpszDLLFile);
|
|
#endif
|
|
|
|
goto CallProcedureInDll_Exit;
|
|
}
|
|
|
|
// Ok module was successfully loaded. now let's try to get the Address of the Procedure
|
|
// Convert the function name to ascii before passing it to GetProcAddress()
|
|
char AsciiProcedureName[255];
|
|
#if defined(UNICODE) || defined(_UNICODE)
|
|
// convert to ascii
|
|
WideCharToMultiByte( CP_ACP, 0, (TCHAR *)lpszProcedureToCall, -1, AsciiProcedureName, 255, NULL, NULL );
|
|
#else
|
|
// the is already ascii so just copy
|
|
strcpy(AsciiProcedureName, lpszProcedureToCall);
|
|
#endif
|
|
|
|
iTempProcGood = TRUE;
|
|
if (iFunctionPrototypeFlag == FUNCTION_PARAMS_HMODULE)
|
|
{
|
|
hProc2 = (PFUNCTION2)GetProcAddress(hDll, AsciiProcedureName);
|
|
if (!hProc2){iTempProcGood = FALSE;}
|
|
}
|
|
else
|
|
{
|
|
hProc = (HCRET)GetProcAddress(hDll, AsciiProcedureName);
|
|
if (!hProc){iTempProcGood = FALSE;}
|
|
}
|
|
if (!iTempProcGood)
|
|
{
|
|
// failed to load,find or whatever this function.
|
|
iisDebugOutSafeParams((LOG_TYPE_ERROR, _T("CallProcedureInDll():%1!s!:%2!s!:() FAILED.\n"), lpszDLLFile, lpszProcedureToCall));
|
|
dwReturn = ERROR_PROC_NOT_FOUND;
|
|
if (bDisplayMsgOnErrFlag)
|
|
{
|
|
MyMessageBox(NULL, IDS_UNABLE_TO_LOCATE_PROCEDURE, lpszProcedureToCall, lpszDLLFile, ERROR_PROC_NOT_FOUND, MB_OK | MB_SETFOREGROUND);
|
|
}
|
|
SetLastError(dwReturn);
|
|
goto CallProcedureInDll_Exit;
|
|
}
|
|
|
|
// Call the function that we got the handle to
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("CallProcedureInDll: Calling '%1!s!'.Start\n"), lpszProcedureToCall));
|
|
__try
|
|
{
|
|
if (iFunctionPrototypeFlag == FUNCTION_PARAMS_HMODULE)
|
|
{
|
|
hRes = (*hProc2)((HMODULE) g_MyModuleHandle);
|
|
}
|
|
else
|
|
{
|
|
hRes = (*hProc)();
|
|
}
|
|
}
|
|
__except(EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
TCHAR szErrorString[100];
|
|
_stprintf(szErrorString, _T("\r\n\r\nException Caught in CallProcedureInDll(). GetExceptionCode()=0x%x.\r\n\r\n"), GetExceptionCode());
|
|
OutputDebugString(szErrorString);
|
|
g_MyLogFile.LogFileWrite(szErrorString);
|
|
}
|
|
|
|
if (FAILED(hRes))
|
|
{
|
|
dwReturn = ERROR_FUNCTION_FAILED;
|
|
if (bDisplayMsgOnErrFlag)
|
|
{
|
|
MyMessageBox(NULL, IDS_ERR_CALLING_DLL_PROCEDURE, lpszProcedureToCall, lpszDLLFile, hRes, MB_OK | MB_SETFOREGROUND);
|
|
}
|
|
iisDebugOutSafeParams((LOG_TYPE_ERROR, _T("CallProcedureInDll: Calling '%1!s!'.End.FAILED. Err=%2!x!.\n"), lpszProcedureToCall, hRes));
|
|
// this function returns E_FAIL but
|
|
// the actual error is in GetLastError()
|
|
// set the last error to whatever was returned from the function call
|
|
SetLastError(hRes);
|
|
}
|
|
else
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_PROGRAM_FLOW, _T("CallProcedureInDll: Calling '%1!s!'.End.SUCCESS.\n"), lpszProcedureToCall));
|
|
}
|
|
|
|
CallProcedureInDll_Exit:
|
|
if (hDll)
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("FreeLibrary.start.\n")));
|
|
FreeLibrary(hDll);
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("FreeLibrary.end.\n")));
|
|
}
|
|
else
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Did not FreeLibrary: %1!s! !!!!!!!!!!!!\n"), lpszDLLFile));
|
|
}
|
|
if (_tcscmp(szDirName, _T("")) != 0){SetCurrentDirectory(szDirName);}
|
|
// To close the library gracefully, each successful call to OleInitialize,
|
|
// including those that return S_FALSE, must be balanced by a corresponding
|
|
// call to the OleUninitialize function.
|
|
iOleUnInitialize(bBalanceOLE);
|
|
|
|
// perform a defensive check
|
|
if ( FAILED(FTestForOutstandingCoInits()) )
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("Outstanding CoInit in %s. WARNING."), lpszDLLFile));
|
|
}
|
|
|
|
iisDebugOutSafeParams((LOG_TYPE_PROGRAM_FLOW, _T("------------------\n")));
|
|
return dwReturn;
|
|
}
|
|
|
|
|
|
int IsThisStringInThisCStringList(CStringList &strList, LPCTSTR szStringToLookFor)
|
|
{
|
|
int iReturn = FALSE;
|
|
|
|
if (strList.IsEmpty() == FALSE)
|
|
{
|
|
POSITION pos = NULL;
|
|
CString csOurString;
|
|
int nLen = 0;
|
|
|
|
pos = strList.GetHeadPosition();
|
|
while (pos)
|
|
{
|
|
csOurString = strList.GetAt(pos);
|
|
nLen += csOurString.GetLength() + 1;
|
|
|
|
// check if we have a match.
|
|
if (0 == _tcsicmp(csOurString, szStringToLookFor))
|
|
{
|
|
// we found a match, return true!
|
|
iReturn = TRUE;
|
|
goto IsThisStringInThisCStringList_Exit;
|
|
}
|
|
strList.GetNext(pos);
|
|
}
|
|
|
|
}
|
|
|
|
IsThisStringInThisCStringList_Exit:
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
|
|
|
|
int KillProcess_Wrap(LPCTSTR lpFullPathOrJustFileName)
|
|
{
|
|
int iReturn = FALSE;
|
|
|
|
TCHAR szJustTheFileName[_MAX_FNAME];
|
|
|
|
// make sure to get only just the filename.
|
|
ReturnFileNameOnly(lpFullPathOrJustFileName, szJustTheFileName);
|
|
|
|
// Convert it to ansi for our "kill" function
|
|
char szFile[_MAX_FNAME];
|
|
#if defined(UNICODE) || defined(_UNICODE)
|
|
WideCharToMultiByte( CP_ACP, 0, (WCHAR*)szJustTheFileName, -1, szFile, _MAX_FNAME, NULL, NULL );
|
|
#else
|
|
_tcscpy(szFile, szJustTheFileName);
|
|
#endif
|
|
|
|
if (KillProcessNameReturn0(szFile) == 0)
|
|
{
|
|
iReturn = TRUE;
|
|
}
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
void ProgressBarTextStack_Set(int iStringID)
|
|
{
|
|
CString csText;
|
|
MyLoadString(iStringID, csText);
|
|
ProgressBarTextStack_Push(csText);
|
|
}
|
|
|
|
|
|
void ProgressBarTextStack_Set(int iStringID, const CString& csFileName)
|
|
{
|
|
CString csText, csPart;
|
|
|
|
// configuring the %s deal....
|
|
MyLoadString(iStringID, csPart);
|
|
|
|
// configuring the "filename" deal....
|
|
csText.Format(csPart,csFileName);
|
|
|
|
ProgressBarTextStack_Push(csText);
|
|
}
|
|
|
|
void ProgressBarTextStack_Set(int iStringID, const CString& csString1, const CString& csString2)
|
|
{
|
|
CString csText, csPart;
|
|
|
|
// configuring the %s deal....
|
|
MyLoadString(iStringID, csPart);
|
|
|
|
// configuring the "filename" deal....
|
|
csText.Format(csPart,csString1, csString2);
|
|
|
|
ProgressBarTextStack_Push(csText);
|
|
}
|
|
|
|
void ProgressBarTextStack_Set(LPCTSTR szProgressTextString)
|
|
{
|
|
ProgressBarTextStack_Push(szProgressTextString);
|
|
}
|
|
|
|
void ProgressBarTextStack_Inst_Set( int ServiceNameID, int iInstanceNum)
|
|
{
|
|
CString csText, csSvcs;
|
|
|
|
// Configuring Web Site %d
|
|
MyLoadString(ServiceNameID, csSvcs);
|
|
// Configuring Web Site 1
|
|
csText.Format(csSvcs, iInstanceNum);
|
|
|
|
ProgressBarTextStack_Push(csText);
|
|
}
|
|
|
|
void ProgressBarTextStack_InstVRoot_Set( int ServiceNameID, int iInstanceNum, CString csVRName)
|
|
{
|
|
CString csText, csSvcs;
|
|
// Configuring Web Site %d, %s
|
|
MyLoadString(ServiceNameID, csSvcs);
|
|
// Configuring Web Site 1, Virtual Dir %s
|
|
csText.Format(csSvcs, iInstanceNum, csVRName);
|
|
|
|
ProgressBarTextStack_Push(csText);
|
|
}
|
|
|
|
void ProgressBarTextStack_InstInProc_Set( int ServiceNameID, int iInstanceNum, CString csVRName)
|
|
{
|
|
CString csText, csSvcs;
|
|
|
|
// Configuring Web Site %d, %s
|
|
MyLoadString(ServiceNameID, csSvcs);
|
|
// Configuring Web Site 1, In process Application %s
|
|
csText.Format(csSvcs, iInstanceNum, csVRName);
|
|
|
|
ProgressBarTextStack_Push(csText);
|
|
}
|
|
|
|
|
|
int ProcessEntry_CheckOS(IN LPCTSTR szOSstring)
|
|
{
|
|
int iTempFlag = TRUE;
|
|
int iOSTypes = 0;
|
|
if (szOSstring)
|
|
{
|
|
// This is workstation, check if we should be installing this on workstation...
|
|
if (g_pTheApp->m_eNTOSType == OT_NTW)
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (IsValidNumber((LPCTSTR)szOSstring))
|
|
{iOSTypes = _ttoi(szOSstring);}
|
|
if (iOSTypes == 0) {iTempFlag = TRUE;}
|
|
if (iOSTypes == 1+2+4) {iTempFlag = TRUE;}
|
|
if (iOSTypes == 1+2) {iTempFlag = TRUE;}
|
|
if (iOSTypes == 2+4) {iTempFlag = TRUE;}
|
|
if (iOSTypes == 2) {iTempFlag = TRUE;}
|
|
}
|
|
|
|
if (g_pTheApp->m_eNTOSType == OT_NTS)
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (IsValidNumber((LPCTSTR)szOSstring))
|
|
{iOSTypes = _ttoi(szOSstring);}
|
|
if (iOSTypes == 0) {iTempFlag = TRUE;}
|
|
if (iOSTypes == 1+2+4) {iTempFlag = TRUE;}
|
|
if (iOSTypes == 1+2) {iTempFlag = TRUE;}
|
|
if (iOSTypes == 1+4) {iTempFlag = TRUE;}
|
|
if (iOSTypes == 1) {iTempFlag = TRUE;}
|
|
}
|
|
|
|
if (g_pTheApp->m_eNTOSType == OT_PDC_OR_BDC)
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (IsValidNumber((LPCTSTR)szOSstring))
|
|
{iOSTypes = _ttoi(szOSstring);}
|
|
if (iOSTypes == 0) {iTempFlag = TRUE;}
|
|
if (iOSTypes == 1+2+4) {iTempFlag = TRUE;}
|
|
if (iOSTypes == 1+2) {iTempFlag = TRUE;}
|
|
if (iOSTypes == 1+4) {iTempFlag = TRUE;}
|
|
if (iOSTypes == 1) {iTempFlag = TRUE;}
|
|
}
|
|
}
|
|
|
|
return iTempFlag;
|
|
}
|
|
|
|
int ProcessEntry_CheckEnterprise(IN LPCTSTR szEnterprise)
|
|
{
|
|
int iTempFlag = TRUE;
|
|
int iEnterpriseFlag = 0;
|
|
if (szEnterprise)
|
|
{
|
|
if (IsValidNumber((LPCTSTR)szEnterprise))
|
|
{iEnterpriseFlag = _ttoi(szEnterprise);}
|
|
|
|
// This entry should only get installed on enterprise.
|
|
// so check if this machine is an enterprise machine...
|
|
if (iEnterpriseFlag != 0)
|
|
{
|
|
// if this is not an enterprise machine.
|
|
// then return false, since it should not be installed.
|
|
if (TRUE == iReturnTrueIfEnterprise())
|
|
{
|
|
iTempFlag = TRUE;
|
|
}
|
|
else
|
|
{
|
|
iTempFlag = FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
return iTempFlag;
|
|
}
|
|
|
|
int ProcessEntry_PlatArch(IN LPCTSTR szPlatArch)
|
|
{
|
|
int iTempFlag = TRUE;
|
|
int iPlatArchTypes = 0;
|
|
if (szPlatArch)
|
|
{
|
|
// This is x86, then check if we should be installing on x86
|
|
if (_tcsicmp(g_pTheApp->m_csPlatform, _T("x86")) == 0)
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (IsValidNumber((LPCTSTR)szPlatArch))
|
|
{iPlatArchTypes = _ttoi(szPlatArch);}
|
|
if (iPlatArchTypes == 0) {iTempFlag = TRUE;}
|
|
if (iPlatArchTypes == 1+2) {iTempFlag = TRUE;}
|
|
if (iPlatArchTypes == 1) {iTempFlag = TRUE;}
|
|
}
|
|
|
|
if (_tcsicmp(g_pTheApp->m_csPlatform, _T("IA64")) == 0)
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (IsValidNumber((LPCTSTR)szPlatArch))
|
|
{iPlatArchTypes = _ttoi(szPlatArch);}
|
|
if (iPlatArchTypes == 0) {iTempFlag = TRUE;}
|
|
if (iPlatArchTypes == 1+2) {iTempFlag = TRUE;}
|
|
if (iPlatArchTypes == 2) {iTempFlag = TRUE;}
|
|
}
|
|
}
|
|
return iTempFlag;
|
|
}
|
|
|
|
|
|
void ProcessEntry_AskLast(ThingToDo ParsedLine, int iWhichOneToUse)
|
|
{
|
|
if (_tcsicmp(ParsedLine.szMsgBoxAfter, _T("1")) == 0)
|
|
{
|
|
// just incase we have don't display user messagebox off.
|
|
int iSaveOld_AllowMessageBoxPopups = g_pTheApp->m_bAllowMessageBoxPopups;
|
|
// Make sure there are MyMessageBox popups!
|
|
// Make sure there are MyMessageBox popups!
|
|
g_pTheApp->m_bAllowMessageBoxPopups = TRUE;
|
|
if (iWhichOneToUse == 2)
|
|
{MyMessageBox( NULL, IDS_COMPLETED_FILE_CALL,ParsedLine.szData1,MB_OK | MB_SETFOREGROUND );}
|
|
else
|
|
{MyMessageBox( NULL, IDS_COMPLETED_FILE_CALL,ParsedLine.szFileName,MB_OK | MB_SETFOREGROUND );}
|
|
g_pTheApp->m_bAllowMessageBoxPopups = iSaveOld_AllowMessageBoxPopups;
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
int ProcessEntry_AskFirst(ThingToDo ParsedLine, int iWhichOneToUse)
|
|
{
|
|
int iReturn = TRUE;
|
|
int iReturnTemp = 0;
|
|
|
|
// check if we need to ask the user if they want to call it for sure.
|
|
if (_tcsicmp(ParsedLine.szMsgBoxBefore, _T("1")) == 0)
|
|
{
|
|
// just incase we have don't display user messagebox off.
|
|
int iSaveOld_AllowMessageBoxPopups = g_pTheApp->m_bAllowMessageBoxPopups;
|
|
// Make sure there are MyMessageBox popups!
|
|
g_pTheApp->m_bAllowMessageBoxPopups = TRUE;
|
|
if (iWhichOneToUse == 2)
|
|
{
|
|
iReturnTemp = MyMessageBox(NULL, IDS_BEFORE_CALLING_FILE, ParsedLine.szData1, MB_YESNO | MB_SETFOREGROUND);
|
|
}
|
|
else
|
|
{
|
|
iReturnTemp = MyMessageBox(NULL, IDS_BEFORE_CALLING_FILE, ParsedLine.szFileName, MB_YESNO | MB_SETFOREGROUND);
|
|
}
|
|
g_pTheApp->m_bAllowMessageBoxPopups = iSaveOld_AllowMessageBoxPopups;
|
|
|
|
// display the messagebox
|
|
if (IDYES != iReturnTemp)
|
|
{
|
|
iReturn = FALSE;
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("ProcessEntry_AskFirst:MyMessageBox Response = IDNO. Exiting.\n")));
|
|
}
|
|
}
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
int ProcessEntry_CheckAll(IN CString csEntry,IN LPCTSTR szTheSection,ThingToDo ParsedLine)
|
|
{
|
|
int iReturn = TRUE;
|
|
|
|
// Check if we pass for os system
|
|
if (!ProcessEntry_CheckOS(ParsedLine.szOS))
|
|
{
|
|
iReturn = FALSE;
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("ProcessEntry_CheckAll():File=%s. Section=%s. Should not be setup on this OS platform (workstation, server, etc...). Skipping.\n"),ParsedLine.szFileName, szTheSection));
|
|
goto ProcessEntry_CheckAll_Exit;
|
|
}
|
|
|
|
// check if we pass for platform arch
|
|
if (!ProcessEntry_PlatArch(ParsedLine.szPlatformArchitecture))
|
|
{
|
|
iReturn = FALSE;
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("ProcessEntry_CheckAll():File=%s. Section=%s. Should not be setup on this plat arch (%s). Skipping.\n"), ParsedLine.szFileName, szTheSection, ParsedLine.szPlatformArchitecture));
|
|
goto ProcessEntry_CheckAll_Exit;
|
|
}
|
|
|
|
// check if we pass for enterprise
|
|
if (!ProcessEntry_CheckEnterprise(ParsedLine.szEnterprise))
|
|
{
|
|
iReturn = FALSE;
|
|
goto ProcessEntry_CheckAll_Exit;
|
|
}
|
|
|
|
ProcessEntry_CheckAll_Exit:
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
|
|
int ProcessEntry_CallDll(IN CString csEntry,IN LPCTSTR szTheSection,ThingToDo ParsedLine)
|
|
{
|
|
int iReturn = FALSE;
|
|
int iTempFlag = FALSE;
|
|
int iProgressBarUpdated = FALSE;
|
|
int iShowErrorsOnFail = TRUE;
|
|
|
|
TCHAR szDirBefore[_MAX_PATH];
|
|
_tcscpy(szDirBefore, _T(""));
|
|
|
|
// Get the type.
|
|
// 100=Type (1=DllFunction,2=DllFunctionInitOle, 2=Executable, 3=RunThisExe, 4=DoSection, 5=DoINFSection)
|
|
if ( _tcsicmp(ParsedLine.szType, _T("1")) != 0 && _tcsicmp(ParsedLine.szType, _T("2")) != 0 )
|
|
{
|
|
goto ProcessEntry_CallDll_Exit;
|
|
}
|
|
|
|
// Check if there is other criteria we need to pass
|
|
if (!ProcessEntry_CheckAll(csEntry, szTheSection, ParsedLine ) )
|
|
{
|
|
goto ProcessEntry_CallDll_Exit;
|
|
}
|
|
|
|
// Make sure we have a value for the entry point..
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_CallDll_Exit;
|
|
}
|
|
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_CallDll_Exit;
|
|
}
|
|
|
|
// make sure the szFileName exists
|
|
if (!IsFileExist(ParsedLine.szFileName))
|
|
{
|
|
// The file does not exists.
|
|
// Check if we need to display an error!
|
|
if (_tcsicmp(ParsedLine.szErrIfFileNotFound, _T("1")) == 0)
|
|
{
|
|
// display the messagebox
|
|
MyMessageBox(NULL, IDS_FILE_DOES_NOT_EXIST, ParsedLine.szFileName, ERROR_FILE_NOT_FOUND, MB_OK | MB_SETFOREGROUND);
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("ProcessEntry_CallDll():FileDoesNotExist=%s.\n"),ParsedLine.szFileName));
|
|
}
|
|
//goto ProcessEntry_CallDll_Exit;
|
|
}
|
|
|
|
// At this point the file exists...
|
|
iShowErrorsOnFail = TRUE;
|
|
if (_tcsicmp(ParsedLine.szDoNotDisplayErrIfFunctionFailed, _T("1")) == 0)
|
|
{iShowErrorsOnFail = FALSE;}
|
|
|
|
// update the progress bar if we need to
|
|
if (_tcsicmp(ParsedLine.szProgressTitle, _T("")) != 0)
|
|
{
|
|
ProgressBarTextStack_Set(ParsedLine.szProgressTitle);
|
|
iProgressBarUpdated = TRUE;
|
|
}
|
|
|
|
// Check if we need to change to a specific dir first...
|
|
if (ParsedLine.szChangeDir)
|
|
{
|
|
if (IsFileExist(ParsedLine.szChangeDir))
|
|
{
|
|
// save the current dir
|
|
GetCurrentDirectory( _MAX_PATH, szDirBefore);
|
|
// change to this dir
|
|
SetCurrentDirectory(ParsedLine.szChangeDir);
|
|
}
|
|
}
|
|
|
|
// check if we need to ask the user if they want to call it for sure.
|
|
if (!ProcessEntry_AskFirst(ParsedLine, 1))
|
|
{
|
|
goto ProcessEntry_CallDll_Exit;
|
|
}
|
|
|
|
// Call the function!!!!!
|
|
if (_tcsicmp(ParsedLine.szType, _T("2")) == 0)
|
|
{
|
|
// Initialize OLE
|
|
|
|
// check if they want us to pass them the hmodule for this module
|
|
// so they can call our exported functions (for logging)
|
|
if (_tcsicmp(ParsedLine.szData2, _T("1")) == 0)
|
|
{
|
|
CallProcedureInDll_wrap(ParsedLine.szFileName, ParsedLine.szData1, iShowErrorsOnFail, TRUE, FUNCTION_PARAMS_HMODULE);
|
|
}
|
|
else
|
|
{
|
|
CallProcedureInDll_wrap(ParsedLine.szFileName, ParsedLine.szData1, iShowErrorsOnFail, TRUE, FUNCTION_PARAMS_NONE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// do not initialize ole!
|
|
|
|
// check if they want us to pass them the hmodule for this module
|
|
// so they can call our exported functions (for logging)
|
|
if (_tcsicmp(ParsedLine.szData2, _T("1")) == 0)
|
|
{
|
|
CallProcedureInDll_wrap(ParsedLine.szFileName, ParsedLine.szData1, iShowErrorsOnFail, FALSE, FUNCTION_PARAMS_HMODULE);
|
|
}
|
|
else
|
|
{
|
|
CallProcedureInDll_wrap(ParsedLine.szFileName, ParsedLine.szData1, iShowErrorsOnFail, FALSE, FUNCTION_PARAMS_NONE);
|
|
}
|
|
}
|
|
|
|
iReturn = TRUE;
|
|
|
|
if (ParsedLine.szChangeDir)
|
|
{
|
|
if (szDirBefore)
|
|
{
|
|
// change back to the original dir
|
|
SetCurrentDirectory(szDirBefore);
|
|
}
|
|
}
|
|
|
|
// display the messagebox that we completed the call...
|
|
ProcessEntry_AskLast(ParsedLine,1);
|
|
|
|
|
|
ProcessEntry_CallDll_Exit:
|
|
if (TRUE == iProgressBarUpdated){ProgressBarTextStack_Pop();}
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
|
|
int ProcessEntry_Call_Exe(IN CString csEntry,IN LPCTSTR szTheSection,ThingToDo ParsedLine)
|
|
{
|
|
int iReturn = FALSE;
|
|
int iTempNotMinimizedFlag = FALSE;
|
|
int iTempFlag = FALSE;
|
|
int iProgressBarUpdated = FALSE;
|
|
int iShowErrorsOnFail = TRUE;
|
|
int iReturnCode = FALSE;
|
|
int iType = 0;
|
|
DWORD dwTimeOut = INFINITE;
|
|
|
|
TCHAR szDirBefore[_MAX_PATH];
|
|
_tcscpy(szDirBefore, _T(""));
|
|
|
|
// Get the type.
|
|
// 100=Type (1=DllFunction,2=DllFunctionInitOle, 2=Executable, 3=RunThisExe, 4=DoSection, 5=DoINFSection)
|
|
if ( _tcsicmp(ParsedLine.szType, _T("3")) != 0)
|
|
{
|
|
goto ProcessEntry_Call_Exe_Exit;
|
|
}
|
|
|
|
// Check if there is other criteria we need to pass
|
|
if (!ProcessEntry_CheckAll(csEntry, szTheSection, ParsedLine) )
|
|
{
|
|
goto ProcessEntry_Call_Exe_Exit;
|
|
}
|
|
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Call_Exe_Exit;
|
|
}
|
|
|
|
iShowErrorsOnFail = TRUE;
|
|
if (_tcsicmp(ParsedLine.szDoNotDisplayErrIfFunctionFailed, _T("1")) == 0)
|
|
{iShowErrorsOnFail = FALSE;}
|
|
|
|
if (_tcsicmp(ParsedLine.szProgressTitle, _T("")) != 0)
|
|
{
|
|
ProgressBarTextStack_Set(ParsedLine.szProgressTitle);
|
|
iProgressBarUpdated = TRUE;
|
|
}
|
|
|
|
// Check if we need to change to a specific dir first...
|
|
if (ParsedLine.szChangeDir)
|
|
{
|
|
if (IsFileExist(ParsedLine.szChangeDir))
|
|
{
|
|
// save the current dir
|
|
GetCurrentDirectory( _MAX_PATH, szDirBefore);
|
|
// change to this dir
|
|
SetCurrentDirectory(ParsedLine.szChangeDir);
|
|
}
|
|
}
|
|
|
|
// check if we need to ask the user if they want to call it for sure.
|
|
if (!ProcessEntry_AskFirst(ParsedLine, 1))
|
|
{
|
|
goto ProcessEntry_Call_Exe_Exit;
|
|
}
|
|
|
|
// make sure the szFileName exists
|
|
if (!IsFileExist(ParsedLine.szFileName))
|
|
{
|
|
// The file does not exists.
|
|
// Check if we need to display an error!
|
|
if (_tcsicmp(ParsedLine.szErrIfFileNotFound, _T("1")) == 0)
|
|
{
|
|
// display the messagebox
|
|
MyMessageBox(NULL, IDS_FILE_DOES_NOT_EXIST, ParsedLine.szFileName, ERROR_FILE_NOT_FOUND, MB_OK | MB_SETFOREGROUND);
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("ProcessEntry_Call_Exe():FileDoesNotExist=%s.\n"),ParsedLine.szFileName));
|
|
}
|
|
//goto ProcessEntry_Call_Exe_Exit;
|
|
}
|
|
|
|
// Run The Executable...
|
|
// iShowErrorsOnFail
|
|
iReturnCode = FALSE;
|
|
iType = 0;
|
|
TCHAR szFullPathString[_MAX_PATH + _MAX_PATH + _MAX_PATH];
|
|
_tcscpy(szFullPathString, ParsedLine.szFileName);
|
|
_tcscat(szFullPathString, _T(" "));
|
|
_tcscat(szFullPathString, ParsedLine.szData1);
|
|
|
|
// Check if they specified timeout in sections.
|
|
dwTimeOut = INFINITE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0)
|
|
{dwTimeOut = atodw(ParsedLine.szData2);}
|
|
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0)
|
|
{iType = _ttoi(ParsedLine.szData3);}
|
|
|
|
if (_tcsicmp(ParsedLine.szData4, _T("")) != 0)
|
|
{iTempNotMinimizedFlag = TRUE;}
|
|
|
|
if (ParsedLine.szData1 && _tcsicmp(ParsedLine.szData1, _T("")) != 0)
|
|
{
|
|
switch (iType)
|
|
{
|
|
case 1:
|
|
iReturnCode = RunProgram(ParsedLine.szFileName, ParsedLine.szData1, !iTempNotMinimizedFlag, dwTimeOut, FALSE);
|
|
break;
|
|
case 2:
|
|
iReturnCode = RunProgram(szFullPathString, NULL, !iTempNotMinimizedFlag, dwTimeOut, FALSE);
|
|
break;
|
|
default:
|
|
iReturnCode = RunProgram(NULL, szFullPathString, !iTempNotMinimizedFlag, dwTimeOut, FALSE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
iReturnCode = RunProgram(ParsedLine.szFileName, NULL, !iTempNotMinimizedFlag, dwTimeOut, FALSE);
|
|
}
|
|
if (iReturnCode != TRUE)
|
|
{
|
|
if (iShowErrorsOnFail){MyMessageBox(NULL, IDS_RUN_PROG_FAILED, ParsedLine.szFileName, GetLastError(), MB_OK | MB_SETFOREGROUND);}
|
|
else{iisDebugOut((LOG_TYPE_TRACE, _T("RunProgram(%s). Failed. Err=0x%x.\n"), ParsedLine.szFileName, GetLastError() ));}
|
|
}
|
|
|
|
|
|
iReturn = TRUE;
|
|
|
|
// change back to the original dir
|
|
if (ParsedLine.szChangeDir)
|
|
{if (szDirBefore){SetCurrentDirectory(szDirBefore);}}
|
|
|
|
// display the messagebox that we completed the call...
|
|
ProcessEntry_AskLast(ParsedLine,1);
|
|
|
|
ProcessEntry_Call_Exe_Exit:
|
|
if (TRUE == iProgressBarUpdated){ProgressBarTextStack_Pop();}
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
// 100=4
|
|
int ProcessEntry_Internal_iisdll(IN CString csEntry,IN LPCTSTR szTheSection,ThingToDo ParsedLine)
|
|
{
|
|
int iReturn = FALSE;
|
|
int iTempFlag = FALSE;
|
|
int iProgressBarUpdated = FALSE;
|
|
int iShowErrorsOnFail = TRUE;
|
|
int iReturnCode = FALSE;
|
|
DWORD dwTimeOut = INFINITE;
|
|
|
|
int iFound = FALSE;
|
|
|
|
TCHAR szDirBefore[_MAX_PATH];
|
|
_tcscpy(szDirBefore, _T(""));
|
|
|
|
// Get the type.
|
|
// 100=Type (1=DllFunction,2=DllFunctionInitOle, 2=Executable, 3=RunThisExe, 4=DoSection, 5=DoINFSection)
|
|
if ( _tcsicmp(ParsedLine.szType, _T("4")) != 0)
|
|
{
|
|
goto ProcessEntry_Internal_iisdll_Exit;
|
|
}
|
|
|
|
// Check if there is other criteria we need to pass
|
|
if (!ProcessEntry_CheckAll(csEntry, szTheSection, ParsedLine) )
|
|
{
|
|
goto ProcessEntry_Internal_iisdll_Exit;
|
|
}
|
|
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Internal_iisdll_Exit;
|
|
}
|
|
|
|
iShowErrorsOnFail = TRUE;
|
|
if (_tcsicmp(ParsedLine.szDoNotDisplayErrIfFunctionFailed, _T("1")) == 0)
|
|
{iShowErrorsOnFail = FALSE;}
|
|
|
|
if (_tcsicmp(ParsedLine.szProgressTitle, _T("")) != 0)
|
|
{
|
|
ProgressBarTextStack_Set(ParsedLine.szProgressTitle);
|
|
iProgressBarUpdated = TRUE;
|
|
}
|
|
|
|
// Check if we need to change to a specific dir first...
|
|
if (ParsedLine.szChangeDir)
|
|
{
|
|
if (IsFileExist(ParsedLine.szChangeDir))
|
|
{
|
|
// save the current dir
|
|
GetCurrentDirectory( _MAX_PATH, szDirBefore);
|
|
// change to this dir
|
|
SetCurrentDirectory(ParsedLine.szChangeDir);
|
|
}
|
|
}
|
|
|
|
// check if we need to ask the user if they want to call it for sure.
|
|
if (!ProcessEntry_AskFirst(ParsedLine, 1))
|
|
{
|
|
goto ProcessEntry_Internal_iisdll_Exit;
|
|
}
|
|
|
|
// Get the internal function to call...
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("Register_iis_common")) == 0)
|
|
{iReturnCode = Register_iis_common();iFound=TRUE;}
|
|
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("Register_iis_core")) == 0)
|
|
{iReturnCode = Register_iis_core();iFound=TRUE;}
|
|
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("Register_iis_inetmgr")) == 0)
|
|
{iReturnCode = Register_iis_inetmgr();iFound=TRUE;}
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("Register_iis_pwmgr")) == 0)
|
|
{iReturnCode = Register_iis_pwmgr();iFound=TRUE;}
|
|
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("Register_iis_doc")) == 0)
|
|
{iReturnCode = Register_iis_doc();iFound=TRUE;}
|
|
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("Register_iis_www")) == 0)
|
|
{iReturnCode = Register_iis_www();iFound=TRUE;}
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("Register_iis_ftp")) == 0)
|
|
{iReturnCode = Register_iis_ftp();iFound=TRUE;}
|
|
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("Unregister_old_asp")) == 0)
|
|
{iReturnCode = Unregister_old_asp();iFound=TRUE;}
|
|
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("Unregister_iis_common")) == 0)
|
|
{iReturnCode = Unregister_iis_common();iFound=TRUE;}
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("Unregister_iis_core")) == 0)
|
|
{iReturnCode = Unregister_iis_core();iFound=TRUE;}
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("Unregister_iis_inetmgr")) == 0)
|
|
{iReturnCode = Unregister_iis_inetmgr();iFound=TRUE;}
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("Unregister_iis_pwmgr")) == 0)
|
|
{iReturnCode = Unregister_iis_pwmgr();iFound=TRUE;}
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("Unregister_iis_www")) == 0)
|
|
{iReturnCode = Unregister_iis_www();iFound=TRUE;}
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("Unregister_iis_ftp")) == 0)
|
|
{iReturnCode = Unregister_iis_ftp();iFound=TRUE;}
|
|
|
|
|
|
if (iFound != TRUE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, _T("%s():FAILURE. Internal Function Does not exist. entry=%s. Section=%s.\n"), _T("ProcessEntry_Internal_iisdll"), csEntry, szTheSection));
|
|
}
|
|
|
|
/*
|
|
if (iReturnCode != TRUE)
|
|
{
|
|
if (iShowErrorsOnFail){MyMessageBox(NULL, IDS_RUN_PROG_FAILED, ParsedLine.szFileName, GetLastError(), MB_OK | MB_SETFOREGROUND);}
|
|
else{iisDebugOut((LOG_TYPE_TRACE, _T("RunProgram(%s). Failed. Err=0x%x.\n"), ParsedLine.szFileName, GetLastError() ));}
|
|
}
|
|
*/
|
|
|
|
|
|
iReturn = TRUE;
|
|
|
|
// change back to the original dir
|
|
if (ParsedLine.szChangeDir)
|
|
{if (szDirBefore){SetCurrentDirectory(szDirBefore);}}
|
|
|
|
// display the messagebox that we completed the call...
|
|
ProcessEntry_AskLast(ParsedLine,1);
|
|
|
|
ProcessEntry_Internal_iisdll_Exit:
|
|
if (TRUE == iProgressBarUpdated){ProgressBarTextStack_Pop();}
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
int ProcessEntry_Call_Section(IN CString csEntry,IN LPCTSTR szTheSection,ThingToDo ParsedLine)
|
|
{
|
|
int iReturn = FALSE;
|
|
int iTempFlag = FALSE;
|
|
int iProgressBarUpdated = FALSE;
|
|
int iShowErrorsOnFail = TRUE;
|
|
|
|
TCHAR szDirBefore[_MAX_PATH];
|
|
_tcscpy(szDirBefore, _T(""));
|
|
|
|
// Get the type.
|
|
// 100=Type (1=DllFunction,2=DllFunctionInitOle, 2=Executable, 3=RunThisExe, 4=DoSection, 5=DoINFSection)
|
|
if ( _tcsicmp(ParsedLine.szType, _T("0")) != 0 && _tcsicmp(ParsedLine.szType, _T("5")) != 0 && _tcsicmp(ParsedLine.szType, _T("6")) != 0 )
|
|
{
|
|
goto ProcessEntry_6_Exit;
|
|
}
|
|
|
|
// make sure we have a INF Section
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_6_Exit;
|
|
}
|
|
|
|
// Check if there is other criteria we need to pass
|
|
if (!ProcessEntry_CheckAll(csEntry, ParsedLine.szData1, ParsedLine) )
|
|
{
|
|
goto ProcessEntry_6_Exit;
|
|
}
|
|
|
|
// set the show erros on fail flag
|
|
iShowErrorsOnFail = TRUE;
|
|
if (_tcsicmp(ParsedLine.szDoNotDisplayErrIfFunctionFailed, _T("1")) == 0)
|
|
{iShowErrorsOnFail = FALSE;}
|
|
|
|
// update the progress bar if we need to
|
|
if (_tcsicmp(ParsedLine.szProgressTitle, _T("")) != 0)
|
|
{
|
|
ProgressBarTextStack_Set(ParsedLine.szProgressTitle);
|
|
iProgressBarUpdated = TRUE;
|
|
}
|
|
|
|
// Check if we need to change to a specific dir first...
|
|
if (ParsedLine.szChangeDir)
|
|
{
|
|
if (IsFileExist(ParsedLine.szChangeDir))
|
|
{
|
|
// save the current dir
|
|
GetCurrentDirectory( _MAX_PATH, szDirBefore);
|
|
// change to this dir
|
|
SetCurrentDirectory(ParsedLine.szChangeDir);
|
|
}
|
|
}
|
|
|
|
// check if we need to ask the user if they want to call it for sure.
|
|
if (!ProcessEntry_AskFirst(ParsedLine, 2))
|
|
{
|
|
goto ProcessEntry_6_Exit;
|
|
}
|
|
|
|
|
|
//
|
|
//
|
|
// Run The INF Section ...
|
|
//
|
|
// ParsedLine.szData1
|
|
//
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("5")) == 0)
|
|
{
|
|
//
|
|
// Do another one of these "special" install sections
|
|
//
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData1));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData1);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData1, iTempFlag));
|
|
|
|
// Check if it failed...
|
|
if (FALSE == iTempFlag)
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("SetupInstallFromInfSection(%s). section missing\n"), ParsedLine.szData1));
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("6")) == 0)
|
|
{
|
|
//
|
|
// Do a regular ole inf section
|
|
//
|
|
TSTR strTempSectionName;
|
|
|
|
if ( strTempSectionName.Copy( ParsedLine.szData1 ) &&
|
|
GetSectionNameToDo(g_pTheApp->m_hInfHandle, &strTempSectionName)
|
|
)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling InstallInfSection:%1!s!:Start.\n"), ParsedLine.szData1));
|
|
iTempFlag = InstallInfSection_NoFiles(g_pTheApp->m_hInfHandle,_T(""),strTempSectionName.QueryStr());
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling InstallInfSection:%1!s!:End.\n"), ParsedLine.szData1));
|
|
|
|
// Check if it failed...
|
|
if (FALSE == iTempFlag)
|
|
{
|
|
// the call failed..
|
|
iisDebugOut((LOG_TYPE_WARN, _T("SetupInstallFromInfSection(%s). Failed. Err=0x%x.\n"), ParsedLine.szData1, GetLastError() ));
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("0")) == 0)
|
|
{
|
|
//
|
|
// Do a special installsection deal which queues files in the ocm manage global file queue.
|
|
//
|
|
if (g_GlobalFileQueueHandle)
|
|
{
|
|
// SP_COPY_NOPRUNE = setupapi has a new deal which will prune files from the copyqueue if they already exist on the system.
|
|
// however, the problem with the new deal is that the pruning code does not check if you have the same file
|
|
// queued in the delete or rename queue. specify SP_COPY_NOPRUNE to make sure that our file never gets
|
|
// pruned (removed) from the copy queue. aaronl 12/4/98
|
|
int iCopyType = SP_COPY_NOPRUNE;
|
|
//int iCopyType = SP_COPY_FORCE_NEWER | SP_COPY_NOPRUNE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0)
|
|
{iCopyType = _ttoi(ParsedLine.szData2);}
|
|
|
|
TSTR strTempSectionName;
|
|
|
|
if ( strTempSectionName.Copy( ParsedLine.szData1 ) &&
|
|
GetSectionNameToDo(g_pTheApp->m_hInfHandle, &strTempSectionName)
|
|
)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("Calling SetupInstallFilesFromInfSection:%1!s!, copytype=%2!d!:Start.\n"), ParsedLine.szData1, iCopyType));
|
|
iTempFlag = SetupInstallFilesFromInfSection(g_pTheApp->m_hInfHandle,NULL,g_GlobalFileQueueHandle,strTempSectionName.QueryStr(),NULL,iCopyType);
|
|
g_GlobalFileQueueHandle_ReturnError = iTempFlag;
|
|
}
|
|
}
|
|
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling SetupInstallFilesFromInfSection:%1!s!:End.\n"), ParsedLine.szData1));
|
|
|
|
// Check if it failed...
|
|
if (FALSE == iTempFlag)
|
|
{
|
|
// the call failed..
|
|
iisDebugOut((LOG_TYPE_WARN, _T("SetupInstallFromInfSection(%s). Failed. Err=0x%x.\n"), ParsedLine.szData1, GetLastError() ));
|
|
}
|
|
}
|
|
|
|
iReturn = TRUE;
|
|
|
|
if (ParsedLine.szChangeDir)
|
|
{
|
|
if (szDirBefore)
|
|
{
|
|
// change back to the original dir
|
|
SetCurrentDirectory(szDirBefore);
|
|
}
|
|
}
|
|
|
|
// display the messagebox that we completed the call...
|
|
ProcessEntry_AskLast(ParsedLine,2);
|
|
|
|
ProcessEntry_6_Exit:
|
|
if (TRUE == iProgressBarUpdated){ProgressBarTextStack_Pop();}
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
int ProcessEntry_Misc1(IN CString csEntry,IN LPCTSTR szTheSection,ThingToDo ParsedLine)
|
|
{
|
|
int iReturn = FALSE;
|
|
int iTempFlag = FALSE;
|
|
int iProgressBarUpdated = FALSE;
|
|
int iShowErrorsOnFail = TRUE;
|
|
|
|
TCHAR szDirBefore[_MAX_PATH];
|
|
_tcscpy(szDirBefore, _T(""));
|
|
|
|
// Get the type.
|
|
if ( _tcsicmp(ParsedLine.szType, _T("7")) != 0 && _tcsicmp(ParsedLine.szType, _T("8")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("9")) != 0 && _tcsicmp(ParsedLine.szType, _T("10")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("11")) != 0 && _tcsicmp(ParsedLine.szType, _T("12")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("12")) != 0 && _tcsicmp(ParsedLine.szType, _T("13")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("14")) != 0 && _tcsicmp(ParsedLine.szType, _T("17")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("18")) != 0
|
|
)
|
|
{
|
|
goto ProcessEntry_Misc1_Exit;
|
|
}
|
|
|
|
// Check if there is other criteria we need to pass
|
|
if (!ProcessEntry_CheckAll(csEntry, szTheSection, ParsedLine) )
|
|
{
|
|
goto ProcessEntry_Misc1_Exit;
|
|
}
|
|
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
// type 10
|
|
// type 12 do not need filename
|
|
if ( _tcsicmp(ParsedLine.szType, _T("10")) != 0 && _tcsicmp(ParsedLine.szType, _T("12")) != 0)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc1_Exit;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Counters.ini files are always in the system dir
|
|
// tack on the extra stuff, and make sure the file exists...
|
|
//
|
|
if ( _tcsicmp(ParsedLine.szType, _T("7")) == 0)
|
|
{
|
|
CString csFullFilePath;
|
|
csFullFilePath = g_pTheApp->m_csSysDir;
|
|
csFullFilePath += _T("\\");
|
|
csFullFilePath += ParsedLine.szFileName;
|
|
// make sure the szFileName exists
|
|
if (!IsFileExist(csFullFilePath))
|
|
{
|
|
// The file does not exists.
|
|
// Check if we need to display an error!
|
|
if (_tcsicmp(ParsedLine.szErrIfFileNotFound, _T("1")) == 0)
|
|
{
|
|
// display the messagebox
|
|
MyMessageBox(NULL, IDS_FILE_DOES_NOT_EXIST, csFullFilePath, ERROR_FILE_NOT_FOUND, MB_OK | MB_SETFOREGROUND);
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("ProcessEntry_Misc1():FileDoesNotExist=%s.\n"),csFullFilePath));
|
|
}
|
|
goto ProcessEntry_Misc1_Exit;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Check if the binary exists for addevent log!
|
|
//
|
|
if ( _tcsicmp(ParsedLine.szType, _T("9")) == 0)
|
|
{
|
|
// make sure the szFileName exists
|
|
if (!IsFileExist(ParsedLine.szFileName))
|
|
{
|
|
// The file does not exists.
|
|
// Check if we need to display an error!
|
|
if (_tcsicmp(ParsedLine.szErrIfFileNotFound, _T("1")) == 0)
|
|
{
|
|
// display the messagebox
|
|
MyMessageBox(NULL, IDS_FILE_DOES_NOT_EXIST, ParsedLine.szFileName, ERROR_FILE_NOT_FOUND, MB_OK | MB_SETFOREGROUND);
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("ProcessEntry_Misc1():FileDoesNotExist=%s.\n"),ParsedLine.szFileName));
|
|
}
|
|
goto ProcessEntry_Misc1_Exit;
|
|
}
|
|
}
|
|
|
|
// if this is for addevent log, then check for the other information...
|
|
// AddEventLog( TRUE, _T("W3SVC"), csBinPath, 0x0 );
|
|
// InstallPerformance(REG_WWWPERFORMANCE, _T("w3ctrs.DLL"), _T("OpenW3PerformanceData"), _T("CloseW3PerformanceData"), _T("CollectW3PerformanceData"));
|
|
if ( _tcsicmp(ParsedLine.szType, _T("9")) == 0 || _tcsicmp(ParsedLine.szType, _T("13")) == 0)
|
|
{
|
|
// make sure we have a szData1 entry (
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc1_Exit;
|
|
}
|
|
|
|
// make sure we have a szData2 entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc1_Exit;
|
|
}
|
|
|
|
// make sure we have a szData3 entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz104_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc1_Exit;
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("13")) == 0)
|
|
{
|
|
// make sure we have a szData4 entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData4, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz105_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc1_Exit;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// if this is for addevent log, then check for the other information...
|
|
//RemoveEventLog( FALSE, _T("W3Ctrs") );
|
|
if ( _tcsicmp(ParsedLine.szType, _T("10")) == 0)
|
|
{
|
|
// make sure we have a szData1 entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc1_Exit;
|
|
}
|
|
|
|
// make sure we have a szData2 entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc1_Exit;
|
|
}
|
|
}
|
|
|
|
// if this is for installAgent, check for other data..
|
|
//
|
|
// INT InstallAgent( CString nlsName, CString nlsPath )
|
|
// INT RemoveAgent( CString nlsServiceName )
|
|
//
|
|
if ( _tcsicmp(ParsedLine.szType, _T("11")) == 0 || _tcsicmp(ParsedLine.szType, _T("12")) == 0)
|
|
{
|
|
// make sure we have a szData1 entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc1_Exit;
|
|
}
|
|
}
|
|
|
|
iShowErrorsOnFail = TRUE;
|
|
if (_tcsicmp(ParsedLine.szDoNotDisplayErrIfFunctionFailed, _T("1")) == 0)
|
|
{iShowErrorsOnFail = FALSE;}
|
|
|
|
if (_tcsicmp(ParsedLine.szProgressTitle, _T("")) != 0)
|
|
{
|
|
ProgressBarTextStack_Set(ParsedLine.szProgressTitle);
|
|
iProgressBarUpdated = TRUE;
|
|
}
|
|
|
|
// Check if we need to change to a specific dir first...
|
|
if (ParsedLine.szChangeDir)
|
|
{
|
|
if (IsFileExist(ParsedLine.szChangeDir))
|
|
{
|
|
// save the current dir
|
|
GetCurrentDirectory( _MAX_PATH, szDirBefore);
|
|
// change to this dir
|
|
SetCurrentDirectory(ParsedLine.szChangeDir);
|
|
}
|
|
}
|
|
|
|
// check if we need to ask the user if they want to call it for sure.
|
|
if (!ProcessEntry_AskFirst(ParsedLine, 1))
|
|
{
|
|
goto ProcessEntry_Misc1_Exit;
|
|
}
|
|
|
|
|
|
//
|
|
// send this to the lodctr function...
|
|
// lodctr(_T("w3ctrs.ini"));
|
|
//
|
|
// see if it's lodctr or unlodctr ....
|
|
//
|
|
if ( _tcsicmp(ParsedLine.szType, _T("7")) == 0)
|
|
{
|
|
lodctr(ParsedLine.szFileName);
|
|
}
|
|
|
|
// if this is a unlodctr, should look like this....
|
|
//
|
|
// unlodctr( _T("W3SVC") );
|
|
//
|
|
if ( _tcsicmp(ParsedLine.szType, _T("8")) == 0)
|
|
{
|
|
unlodctr(ParsedLine.szFileName);
|
|
}
|
|
|
|
// if this is a AddEventLog, should look like this...
|
|
//
|
|
// AddEventLog( TRUE, _T("W3SVC"), csBinPath, 0x0 );
|
|
//
|
|
if ( _tcsicmp(ParsedLine.szType, _T("9")) == 0)
|
|
{
|
|
int iTempSystemFlag = 0;
|
|
int dwTempEventLogtype = 0;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("1")) == 0){iTempSystemFlag = 1;}
|
|
dwTempEventLogtype = atodw(ParsedLine.szData3);
|
|
// Call event log registration function
|
|
AddEventLog( iTempSystemFlag, ParsedLine.szData1, ParsedLine.szFileName, dwTempEventLogtype);
|
|
}
|
|
|
|
// if this is a RemoveEventLog, should look like this...
|
|
//
|
|
// RemoveEventLog( FALSE, _T("W3Ctrs") );
|
|
//
|
|
if ( _tcsicmp(ParsedLine.szType, _T("10")) == 0)
|
|
{
|
|
int iTempSystemFlag = 0;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("1")) == 0){iTempSystemFlag = 1;}
|
|
// Call event log registration function
|
|
RemoveEventLog(iTempSystemFlag, ParsedLine.szData1);
|
|
}
|
|
|
|
// if this is installagent
|
|
//
|
|
// INT InstallAgent( CString nlsName, CString nlsPath )
|
|
// INT RemoveAgent( CString nlsServiceName )
|
|
//
|
|
if ( _tcsicmp(ParsedLine.szType, _T("11")) == 0)
|
|
{
|
|
InstallAgent(ParsedLine.szData1, ParsedLine.szFileName);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("12")) == 0)
|
|
{
|
|
RemoveAgent(ParsedLine.szData1);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("13")) == 0)
|
|
{
|
|
InstallPerformance(ParsedLine.szData1, ParsedLine.szFileName, ParsedLine.szData2, ParsedLine.szData3, ParsedLine.szData4);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("14")) == 0)
|
|
{
|
|
CString csPath = ParsedLine.szFileName;
|
|
CreateLayerDirectory(csPath);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("17")) == 0)
|
|
{
|
|
int iUseWildCards = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("1")) == 0){iUseWildCards = TRUE;}
|
|
|
|
CString csPath = ParsedLine.szFileName;
|
|
if (iUseWildCards)
|
|
{
|
|
TCHAR szTempDir[_MAX_DRIVE + _MAX_PATH];
|
|
TCHAR szTempFileName[_MAX_PATH + _MAX_EXT];
|
|
if (ReturnFilePathOnly(csPath,szTempDir))
|
|
{
|
|
if (TRUE == ReturnFileNameOnly(csPath, szTempFileName))
|
|
{DeleteFilesWildcard(szTempDir,szTempFileName);}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
InetDeleteFile(csPath);
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("18")) == 0)
|
|
{
|
|
int iTempDeleteEvenIfFull = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("1")) == 0){iTempDeleteEvenIfFull = 1;}
|
|
|
|
CString csPath = ParsedLine.szFileName;
|
|
if (iTempDeleteEvenIfFull)
|
|
{
|
|
RecRemoveDir(csPath);
|
|
}
|
|
else
|
|
{
|
|
RecRemoveEmptyDir(csPath);
|
|
}
|
|
}
|
|
|
|
// We called the function, so return true.
|
|
iReturn = TRUE;
|
|
|
|
// change back to the original dir
|
|
if (ParsedLine.szChangeDir){if (szDirBefore){SetCurrentDirectory(szDirBefore);}}
|
|
|
|
ProcessEntry_AskLast(ParsedLine, 1);
|
|
|
|
|
|
ProcessEntry_Misc1_Exit:
|
|
if (TRUE == iProgressBarUpdated){ProgressBarTextStack_Pop();}
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
int ProcessEntry_SVC_Clus(IN CString csEntry,IN LPCTSTR szTheSection,ThingToDo ParsedLine)
|
|
{
|
|
int iReturn = FALSE;
|
|
int iReturnTemp = FALSE;
|
|
int iTempFlag = FALSE;
|
|
int iProgressBarUpdated = FALSE;
|
|
int iShowErrorsOnFail = TRUE;
|
|
DWORD dwFailed = ERROR_SUCCESS;
|
|
|
|
|
|
// Get the type.
|
|
if ( _tcsicmp(ParsedLine.szType, _T("50")) != 0 && _tcsicmp(ParsedLine.szType, _T("51")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("52")) != 0 && _tcsicmp(ParsedLine.szType, _T("53")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("54")) != 0 && _tcsicmp(ParsedLine.szType, _T("55")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("56")) != 0 && _tcsicmp(ParsedLine.szType, _T("57")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("58")) != 0 && _tcsicmp(ParsedLine.szType, _T("59")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("60")) != 0 && _tcsicmp(ParsedLine.szType, _T("61")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("62")) != 0 && _tcsicmp(ParsedLine.szType, _T("63")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("64")) != 0 && _tcsicmp(ParsedLine.szType, _T("65")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("66")) != 0 && _tcsicmp(ParsedLine.szType, _T("67")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("68")) != 0 && _tcsicmp(ParsedLine.szType, _T("69")) != 0
|
|
)
|
|
{
|
|
goto ProcessEntry_SVC_Clus_Exit;
|
|
}
|
|
|
|
// Check if there is other criteria we need to pass
|
|
if (!ProcessEntry_CheckAll(csEntry, szTheSection, ParsedLine) )
|
|
{
|
|
goto ProcessEntry_SVC_Clus_Exit;
|
|
}
|
|
|
|
if (_tcsicmp(ParsedLine.szType, _T("66")) == 0 || _tcsicmp(ParsedLine.szType, _T("67")) == 0)
|
|
{
|
|
// make sure not to require 102 parameter for 66 or 67
|
|
}
|
|
else
|
|
{
|
|
// make sure we have a szData1 entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_SVC_Clus_Exit;
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("50")) == 0 || _tcsicmp(ParsedLine.szType, _T("52")) == 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_SVC_Clus_Exit;
|
|
}
|
|
|
|
CString csFullFilePath;
|
|
// Check if the file exists....
|
|
if ( _tcsicmp(ParsedLine.szType, _T("50")) == 0)
|
|
{
|
|
csFullFilePath = g_pTheApp->m_csSysDir;
|
|
csFullFilePath += _T("\\Drivers\\");
|
|
csFullFilePath += ParsedLine.szFileName;
|
|
}
|
|
else
|
|
{
|
|
csFullFilePath = ParsedLine.szFileName;
|
|
}
|
|
// make sure the szFileName exists
|
|
if (!IsFileExist(csFullFilePath))
|
|
{
|
|
// The file does not exists.
|
|
// Check if we need to display an error!
|
|
if (_tcsicmp(ParsedLine.szErrIfFileNotFound, _T("1")) == 0)
|
|
{
|
|
// display the messagebox
|
|
MyMessageBox(NULL, IDS_FILE_DOES_NOT_EXIST, csFullFilePath, ERROR_FILE_NOT_FOUND, MB_OK | MB_SETFOREGROUND);
|
|
goto ProcessEntry_SVC_Clus_Exit;
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("o ProcessEntry_SVC_Clus():FileDoesNotExist=%s.\n"),csFullFilePath));
|
|
}
|
|
}
|
|
|
|
// make sure we have a szData2 entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_SVC_Clus_Exit;
|
|
}
|
|
}
|
|
|
|
|
|
iShowErrorsOnFail = TRUE;
|
|
if (_tcsicmp(ParsedLine.szDoNotDisplayErrIfFunctionFailed, _T("1")) == 0)
|
|
{iShowErrorsOnFail = FALSE;}
|
|
|
|
if (_tcsicmp(ParsedLine.szProgressTitle, _T("")) != 0)
|
|
{
|
|
ProgressBarTextStack_Set(ParsedLine.szProgressTitle);
|
|
iProgressBarUpdated = TRUE;
|
|
}
|
|
|
|
// check if we need to ask the user if they want to call it for sure.
|
|
if (!ProcessEntry_AskFirst(ParsedLine, 1))
|
|
{
|
|
goto ProcessEntry_SVC_Clus_Exit;
|
|
}
|
|
|
|
// Run The Executable...
|
|
// iShowErrorsOnFail
|
|
dwFailed = ERROR_SUCCESS;
|
|
// Call the function!!!!!
|
|
if (_tcsicmp(ParsedLine.szType, _T("50")) == 0)
|
|
{
|
|
// Create the driver, retry if failed...
|
|
dwFailed = CreateDriver_Wrap(ParsedLine.szData1, ParsedLine.szData2, ParsedLine.szFileName, TRUE);
|
|
if (dwFailed != ERROR_SUCCESS)
|
|
{
|
|
if (iShowErrorsOnFail){MyMessageBox(NULL, IDS_RUN_PROG_FAILED, ParsedLine.szFileName, GetLastError(), MB_OK | MB_SETFOREGROUND);}
|
|
else{iisDebugOut((LOG_TYPE_ERROR, _T("CreateDriver(%s). Failed. Err=0x%x.\n"), ParsedLine.szFileName, GetLastError() ));}
|
|
}
|
|
else
|
|
{
|
|
iReturn = TRUE;
|
|
}
|
|
}
|
|
if (_tcsicmp(ParsedLine.szType, _T("51")) == 0)
|
|
{
|
|
// Remove driver.
|
|
dwFailed = InetDeleteService( ParsedLine.szData1 );
|
|
if (dwFailed != 0)
|
|
{
|
|
if (iShowErrorsOnFail){MyMessageBox(NULL, IDS_RUN_PROG_FAILED, ParsedLine.szData1, GetLastError(), MB_OK | MB_SETFOREGROUND);}
|
|
else{iisDebugOut((LOG_TYPE_ERROR, _T("InetDeleteService(%s). Failed. Err=0x%x.\n"), ParsedLine.szData1, GetLastError() ));}
|
|
}
|
|
else
|
|
{
|
|
iReturn = TRUE;
|
|
}
|
|
// flag the reboot flag.
|
|
SetRebootFlag();
|
|
}
|
|
if (_tcsicmp(ParsedLine.szType, _T("52")) == 0)
|
|
{
|
|
// Create the service, retry if failed...
|
|
dwFailed = CreateService_wrap(ParsedLine.szData1, ParsedLine.szData2, ParsedLine.szFileName, ParsedLine.szData3, ParsedLine.szData4, TRUE);
|
|
if (dwFailed != ERROR_SUCCESS)
|
|
{
|
|
if (iShowErrorsOnFail){MyMessageBox(NULL, IDS_RUN_PROG_FAILED, ParsedLine.szFileName, GetLastError(), MB_OK | MB_SETFOREGROUND);}
|
|
else{iisDebugOut((LOG_TYPE_ERROR, _T("CreateService(%s). Failed. Err=0x%x.\n"), ParsedLine.szFileName, GetLastError() ));}
|
|
}
|
|
else
|
|
{
|
|
iReturn = TRUE;
|
|
}
|
|
|
|
}
|
|
|
|
if (_tcsicmp(ParsedLine.szType, _T("53")) == 0)
|
|
{
|
|
// Remove Service.
|
|
dwFailed = InetDeleteService( ParsedLine.szData1 );
|
|
if (dwFailed != 0 && dwFailed != ERROR_SERVICE_DOES_NOT_EXIST)
|
|
{
|
|
if (iShowErrorsOnFail){MyMessageBox(NULL, IDS_RUN_PROG_FAILED, ParsedLine.szData1, GetLastError(), MB_OK | MB_SETFOREGROUND);}
|
|
else{iisDebugOut((LOG_TYPE_ERROR, _T("InetDeleteService(%s). Failed. Err=0x%x.\n"), ParsedLine.szData1, GetLastError() ));}
|
|
}
|
|
else
|
|
{
|
|
iReturn = TRUE;
|
|
}
|
|
}
|
|
|
|
if (_tcsicmp(ParsedLine.szType, _T("54")) == 0)
|
|
{
|
|
// Start Service
|
|
dwFailed = InetStartService(ParsedLine.szData1);
|
|
if (dwFailed == 0 || dwFailed == ERROR_SERVICE_ALREADY_RUNNING)
|
|
{
|
|
// yeah, the service started.
|
|
iReturn = TRUE;
|
|
}
|
|
else
|
|
{
|
|
if (iShowErrorsOnFail){MyMessageBox(NULL, IDS_RUN_PROG_FAILED, ParsedLine.szData1, GetLastError(), MB_OK | MB_SETFOREGROUND);}
|
|
else{iisDebugOut((LOG_TYPE_WARN, _T("InetStartService(%s). Unable to start. Err=0x%x.\n"), ParsedLine.szData1, GetLastError() ));}
|
|
}
|
|
}
|
|
|
|
if (_tcsicmp(ParsedLine.szType, _T("55")) == 0)
|
|
{
|
|
int iAddToRestartList=FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("1")) == 0) {iAddToRestartList=TRUE;}
|
|
|
|
// Stop Service
|
|
dwFailed = StopServiceAndDependencies(ParsedLine.szData1, iAddToRestartList);
|
|
if (dwFailed == FALSE)
|
|
{
|
|
if (iShowErrorsOnFail){MyMessageBox(NULL, IDS_RUN_PROG_FAILED, ParsedLine.szData1, GetLastError(), MB_OK | MB_SETFOREGROUND);}
|
|
else{iisDebugOut((LOG_TYPE_ERROR, _T("StopServiceAndDependencies(%s). Failed. Err=0x%x.\n"), ParsedLine.szData1, GetLastError() ));}
|
|
}
|
|
else
|
|
{
|
|
// yeah, the service stopped.
|
|
iReturn = TRUE;
|
|
}
|
|
}
|
|
|
|
if (_tcsicmp(ParsedLine.szType, _T("56")) == 0 || _tcsicmp(ParsedLine.szType, _T("57")) == 0)
|
|
{
|
|
int iAdd = FALSE;
|
|
if (_tcsicmp(ParsedLine.szType, _T("56")) == 0) {iAdd = TRUE;}
|
|
// map/unmap to HTTP
|
|
InetRegisterService( g_pTheApp->m_csMachineName, ParsedLine.szData1, &g_HTTPGuid, 0, 80, iAdd);
|
|
iReturn = TRUE;
|
|
}
|
|
|
|
if (_tcsicmp(ParsedLine.szType, _T("58")) == 0 || _tcsicmp(ParsedLine.szType, _T("59")) == 0)
|
|
{
|
|
int iAdd = FALSE;
|
|
if (_tcsicmp(ParsedLine.szType, _T("58")) == 0) {iAdd = TRUE;}
|
|
// map/unmap to FTP
|
|
InetRegisterService( g_pTheApp->m_csMachineName, ParsedLine.szData1, &g_FTPGuid, 0, 21, iAdd);
|
|
iReturn = TRUE;
|
|
}
|
|
|
|
if (_tcsicmp(ParsedLine.szType, _T("60")) == 0 || _tcsicmp(ParsedLine.szType, _T("61")) == 0)
|
|
{
|
|
int iAdd = FALSE;
|
|
if (_tcsicmp(ParsedLine.szType, _T("60")) == 0) {iAdd = TRUE;}
|
|
// map/unmap to Gopher
|
|
InetRegisterService( g_pTheApp->m_csMachineName, ParsedLine.szData1, &g_GopherGuid, 0, 70, iAdd);
|
|
iReturn = TRUE;
|
|
}
|
|
|
|
if (_tcsicmp(ParsedLine.szType, _T("62")) == 0 || _tcsicmp(ParsedLine.szType, _T("63")) == 0)
|
|
{
|
|
int iAdd = FALSE;
|
|
if (_tcsicmp(ParsedLine.szType, _T("62")) == 0) {iAdd = TRUE;}
|
|
// map/unmap to Inetinfo
|
|
InetRegisterService( g_pTheApp->m_csMachineName, ParsedLine.szData1, &g_InetInfoGuid, 0x64e, 0x558, iAdd);
|
|
iReturn = TRUE;
|
|
}
|
|
|
|
if (_tcsicmp(ParsedLine.szType, _T("64")) == 0 || _tcsicmp(ParsedLine.szType, _T("65")) == 0)
|
|
{
|
|
iReturn = TRUE;
|
|
|
|
// make sure we have everything
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_SVC_Clus_Exit;
|
|
}
|
|
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_SVC_Clus_Exit;
|
|
}
|
|
|
|
if (_tcsicmp(ParsedLine.szType, _T("64")) == 0)
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_SVC_Clus_Exit;
|
|
}
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz104_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_SVC_Clus_Exit;
|
|
}
|
|
|
|
// this function only takes wide characters...
|
|
#ifndef _CHICAGO_
|
|
iReturn = RegisterIisServerInstanceResourceType(ParsedLine.szFileName,ParsedLine.szData1,ParsedLine.szData2,ParsedLine.szData3);
|
|
#else
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("RegisterIisServerInstanceResourceType(): not supported under ansi. only unicode.") ));
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("1")) == 0) {iTempFlag = TRUE;}
|
|
|
|
// this function only takes wide characters...
|
|
#ifndef _CHICAGO_
|
|
iReturn = UnregisterIisServerInstanceResourceType(ParsedLine.szFileName,ParsedLine.szData1,iTempFlag,TRUE);
|
|
#else
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("UnregisterIisServerInstanceResourceType(): not supported under ansi. only unicode.") ));
|
|
#endif
|
|
}
|
|
// iReturn = TRUE;
|
|
}
|
|
|
|
if (_tcsicmp(ParsedLine.szType, _T("66")) == 0)
|
|
{
|
|
#ifndef _CHICAGO_
|
|
DWORD dwReturn = 0;
|
|
dwReturn = BringALLIISClusterResourcesOffline();
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("BringALLIISClusterResourcesOffline ret=%d\n"),dwReturn));
|
|
#endif
|
|
iReturn = TRUE;
|
|
}
|
|
|
|
if (_tcsicmp(ParsedLine.szType, _T("67")) == 0)
|
|
{
|
|
#ifndef _CHICAGO_
|
|
DWORD dwReturn = 0;
|
|
dwReturn = BringALLIISClusterResourcesOnline();
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("BringALLIISClusterResourcesOnline ret=%d\n"),dwReturn));
|
|
#endif
|
|
iReturn = TRUE;
|
|
}
|
|
|
|
// Add/remove interactive flag to/from service
|
|
if (_tcsicmp(ParsedLine.szType, _T("68")) == 0 || _tcsicmp(ParsedLine.szType, _T("69")) == 0)
|
|
{
|
|
int iAdd = FALSE;
|
|
if (_tcsicmp(ParsedLine.szType, _T("68")) == 0) {iAdd = TRUE;}
|
|
|
|
InetConfigServiceInteractive(ParsedLine.szData1, iAdd);
|
|
iReturn = TRUE;
|
|
}
|
|
|
|
// display the messagebox that we completed the call...
|
|
ProcessEntry_AskLast(ParsedLine,1);
|
|
|
|
ProcessEntry_SVC_Clus_Exit:
|
|
if (TRUE == iProgressBarUpdated){ProgressBarTextStack_Pop();}
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
|
|
int ProcessEntry_Dcom(IN CString csEntry,IN LPCTSTR szTheSection,ThingToDo ParsedLine)
|
|
{
|
|
int iReturn = FALSE;
|
|
int iTempFlag = FALSE;
|
|
int iProgressBarUpdated = FALSE;
|
|
int iShowErrorsOnFail = TRUE;
|
|
DWORD dwFailed = ERROR_SUCCESS;
|
|
|
|
// Get the type.
|
|
if ( _tcsicmp(ParsedLine.szType, _T("70")) != 0 && _tcsicmp(ParsedLine.szType, _T("71")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("72")) != 0 && _tcsicmp(ParsedLine.szType, _T("73")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("74")) != 0 && _tcsicmp(ParsedLine.szType, _T("75")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("76")) != 0 && _tcsicmp(ParsedLine.szType, _T("77")) != 0
|
|
)
|
|
{
|
|
goto ProcessEntry_Dcom_Exit;
|
|
}
|
|
|
|
// Check if there is other criteria we need to pass
|
|
if (!ProcessEntry_CheckAll(csEntry, szTheSection, ParsedLine) )
|
|
{
|
|
goto ProcessEntry_Dcom_Exit;
|
|
}
|
|
|
|
// make sure we have a szData1 entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Dcom_Exit;
|
|
}
|
|
|
|
if (_tcsicmp(ParsedLine.szType, _T("74")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("75")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("76")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("77")) == 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Dcom_Exit;
|
|
}
|
|
}
|
|
|
|
iShowErrorsOnFail = TRUE;
|
|
if (_tcsicmp(ParsedLine.szDoNotDisplayErrIfFunctionFailed, _T("1")) == 0)
|
|
{iShowErrorsOnFail = FALSE;}
|
|
|
|
if (_tcsicmp(ParsedLine.szProgressTitle, _T("")) != 0)
|
|
{
|
|
ProgressBarTextStack_Set(ParsedLine.szProgressTitle);
|
|
iProgressBarUpdated = TRUE;
|
|
}
|
|
|
|
// check if we need to ask the user if they want to call it for sure.
|
|
if (!ProcessEntry_AskFirst(ParsedLine, 1))
|
|
{
|
|
goto ProcessEntry_Dcom_Exit;
|
|
}
|
|
|
|
// Run The Executable...
|
|
// iShowErrorsOnFail
|
|
dwFailed = ERROR_SUCCESS;
|
|
|
|
// Call the function!!!!!
|
|
|
|
// Set dcom launch and access permissions
|
|
if (_tcsicmp(ParsedLine.szType, _T("70")) == 0 || _tcsicmp(ParsedLine.szType, _T("71")) == 0)
|
|
{
|
|
BOOL bDumbCall = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("1")) == 0)
|
|
{bDumbCall = TRUE;}
|
|
|
|
if (_tcsicmp(ParsedLine.szType, _T("70")) == 0)
|
|
{
|
|
dwFailed = ChangeDCOMLaunchACL((LPTSTR)(LPCTSTR)ParsedLine.szData1, TRUE, TRUE, bDumbCall);
|
|
}
|
|
else
|
|
{
|
|
dwFailed = ChangeDCOMLaunchACL((LPTSTR)(LPCTSTR)ParsedLine.szData1, FALSE, FALSE, bDumbCall);
|
|
}
|
|
if (dwFailed != ERROR_SUCCESS)
|
|
{
|
|
if (iShowErrorsOnFail){MyMessageBox(NULL, IDS_RUN_PROG_FAILED, ParsedLine.szData1, GetLastError(), MB_OK | MB_SETFOREGROUND);}
|
|
else{iisDebugOut((LOG_TYPE_ERROR, _T("ChangeDCOMAccessACL(%s). Failed. Err=0x%x.\n"), ParsedLine.szData1, GetLastError() ));}
|
|
}
|
|
else
|
|
{
|
|
iReturn = TRUE;
|
|
}
|
|
}
|
|
if (_tcsicmp(ParsedLine.szType, _T("72")) == 0 || _tcsicmp(ParsedLine.szType, _T("73")) == 0)
|
|
{
|
|
BOOL bDumbCall = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("1")) == 0)
|
|
{bDumbCall = TRUE;}
|
|
|
|
if (_tcsicmp(ParsedLine.szType, _T("72")) == 0)
|
|
{
|
|
dwFailed = ChangeDCOMAccessACL((LPTSTR)(LPCTSTR)ParsedLine.szData1, TRUE, TRUE, bDumbCall);
|
|
}
|
|
else
|
|
{
|
|
dwFailed = ChangeDCOMAccessACL((LPTSTR)(LPCTSTR)ParsedLine.szData1, FALSE, FALSE, bDumbCall);
|
|
}
|
|
if (dwFailed != ERROR_SUCCESS)
|
|
{
|
|
if (iShowErrorsOnFail){MyMessageBox(NULL, IDS_RUN_PROG_FAILED, ParsedLine.szData1, GetLastError(), MB_OK | MB_SETFOREGROUND);}
|
|
else{iisDebugOut((LOG_TYPE_ERROR, _T("ChangeDCOMAccessACL(%s). Failed. Err=0x%x.\n"), ParsedLine.szData1, GetLastError() ));}
|
|
}
|
|
else
|
|
{
|
|
iReturn = TRUE;
|
|
}
|
|
}
|
|
|
|
// dcom launch and access permissions
|
|
if (_tcsicmp(ParsedLine.szType, _T("74")) == 0 || _tcsicmp(ParsedLine.szType, _T("75")) == 0)
|
|
{
|
|
BOOL bDumbCall = FALSE;
|
|
BOOL bAddInteractivebyDefault = TRUE;
|
|
|
|
if (_tcsicmp(ParsedLine.szData2, _T("1")) == 0)
|
|
{bDumbCall = TRUE;}
|
|
if (_tcsicmp(ParsedLine.szData3, _T("0")) == 0)
|
|
{bAddInteractivebyDefault = FALSE;}
|
|
|
|
if (_tcsicmp(ParsedLine.szType, _T("74")) == 0)
|
|
{
|
|
dwFailed = ChangeAppIDLaunchACL(ParsedLine.szFileName, (LPTSTR)(LPCTSTR) ParsedLine.szData1, TRUE, TRUE, bDumbCall,bAddInteractivebyDefault);
|
|
}
|
|
else
|
|
{
|
|
dwFailed = ChangeAppIDLaunchACL(ParsedLine.szFileName, (LPTSTR)(LPCTSTR) ParsedLine.szData1, FALSE, FALSE, bDumbCall,bAddInteractivebyDefault);
|
|
}
|
|
if (dwFailed != ERROR_SUCCESS)
|
|
{
|
|
if (iShowErrorsOnFail){MyMessageBox(NULL, IDS_RUN_PROG_FAILED, ParsedLine.szData1, GetLastError(), MB_OK | MB_SETFOREGROUND);}
|
|
else{iisDebugOut((LOG_TYPE_ERROR, _T("ChangeAppIDLaunchACL(%s). Failed. Err=0x%x.\n"), ParsedLine.szData1, GetLastError() ));}
|
|
}
|
|
else
|
|
{
|
|
iReturn = TRUE;
|
|
}
|
|
}
|
|
|
|
// dcom launch and access permissions
|
|
if (_tcsicmp(ParsedLine.szType, _T("76")) == 0 || _tcsicmp(ParsedLine.szType, _T("77")) == 0)
|
|
{
|
|
BOOL bDumbCall = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("1")) == 0)
|
|
{bDumbCall = TRUE;}
|
|
|
|
if (_tcsicmp(ParsedLine.szType, _T("76")) == 0)
|
|
{
|
|
dwFailed = ChangeAppIDAccessACL(ParsedLine.szFileName, (LPTSTR)(LPCTSTR) ParsedLine.szData1, TRUE, TRUE, bDumbCall);
|
|
}
|
|
else
|
|
{
|
|
dwFailed = ChangeAppIDAccessACL(ParsedLine.szFileName, (LPTSTR)(LPCTSTR) ParsedLine.szData1, FALSE, FALSE, bDumbCall);
|
|
}
|
|
if (dwFailed != ERROR_SUCCESS)
|
|
{
|
|
if (iShowErrorsOnFail){MyMessageBox(NULL, IDS_RUN_PROG_FAILED, ParsedLine.szData1, GetLastError(), MB_OK | MB_SETFOREGROUND);}
|
|
else{iisDebugOut((LOG_TYPE_ERROR, _T("ChangeAppIDAccessACL(%s). Failed. Err=0x%x.\n"), ParsedLine.szData1, GetLastError() ));}
|
|
}
|
|
else
|
|
{
|
|
iReturn = TRUE;
|
|
}
|
|
}
|
|
|
|
|
|
// display the messagebox that we completed the call...
|
|
ProcessEntry_AskLast(ParsedLine,1);
|
|
|
|
// We called the function, so return true.
|
|
iReturn = TRUE;
|
|
|
|
ProcessEntry_Dcom_Exit:
|
|
return iReturn;
|
|
}
|
|
|
|
// function: IsMachineInDomain
|
|
//
|
|
// Test to see if the machine is in a domain, or if it
|
|
// is in a workstation
|
|
//
|
|
// Return Values:
|
|
// TRUE - In a domain
|
|
// FALSE - Not in a domain
|
|
//
|
|
int IsMachineInDomain()
|
|
{
|
|
DWORD dwRet;
|
|
LPBYTE pDomain = NULL;
|
|
|
|
// Retrieve the domain which this computer trusts.
|
|
// Hence: success->in a domain; error->not in a domain
|
|
dwRet = NetGetAnyDCName(NULL,NULL,&pDomain);
|
|
|
|
if (pDomain)
|
|
{
|
|
NetApiBufferFree(pDomain);
|
|
}
|
|
|
|
if (dwRet == NERR_Success)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
// Default Return Value is FALSE
|
|
return FALSE;
|
|
}
|
|
|
|
// function: RetrieveDomain
|
|
//
|
|
// Retrieve the domain that the current machine is in
|
|
//
|
|
// Parameters:
|
|
// [out] csDomainName - The name of the domain
|
|
//
|
|
// Return:
|
|
// TRUE - It worked
|
|
// FALSE - It Failed
|
|
//
|
|
int RetrieveDomain(CString &csDomainName)
|
|
{
|
|
PDOMAIN_CONTROLLER_INFO pDci;
|
|
|
|
if ( NO_ERROR != DsGetDcName( NULL, // Localhost
|
|
NULL, // No specific domain
|
|
NULL, // No Guid Specified
|
|
NULL, // No Site
|
|
0, // No Flags
|
|
&pDci)
|
|
)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
// Copy string into csDomainName
|
|
csDomainName = pDci->DomainName;
|
|
|
|
NetApiBufferFree(pDci);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
int ProcessEntry_If(IN CString csEntry,IN LPCTSTR szTheSection,ThingToDo ParsedLine)
|
|
{
|
|
int iReturn = FALSE;
|
|
int iTempFlag = FALSE;
|
|
int iTempFlag2 = FALSE;
|
|
|
|
int ifTrueStatementExists = FALSE;
|
|
int ifFalseStatementExists = FALSE;
|
|
|
|
// Get the type.
|
|
if (_tcsicmp(ParsedLine.szType, _T("39")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("40")) != 0 && _tcsicmp(ParsedLine.szType, _T("41")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("42")) != 0 && _tcsicmp(ParsedLine.szType, _T("43")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("44")) != 0 && _tcsicmp(ParsedLine.szType, _T("45")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("46")) != 0 && _tcsicmp(ParsedLine.szType, _T("47")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("48")) != 0 && _tcsicmp(ParsedLine.szType, _T("49")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("100")) != 0 && _tcsicmp(ParsedLine.szType, _T("119")) != 0
|
|
)
|
|
{
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// Check if there is other criteria we need to pass
|
|
if (!ProcessEntry_CheckAll(csEntry, szTheSection, ParsedLine) )
|
|
{
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("40")) == 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// make sure there is a szData3 or a szData4.
|
|
ifTrueStatementExists = FALSE;
|
|
ifFalseStatementExists = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {ifTrueStatementExists = TRUE;}
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0) {ifFalseStatementExists = TRUE;}
|
|
if (ifTrueStatementExists == FALSE && ifFalseStatementExists == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz104_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// okay we have either szData3 or szData4
|
|
|
|
HKEY hRootKeyType = HKEY_LOCAL_MACHINE;
|
|
// check if the registry key exists...
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKLM")) == 0){hRootKeyType = HKEY_LOCAL_MACHINE;}
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKCR")) == 0){hRootKeyType = HKEY_CLASSES_ROOT;}
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKCU")) == 0){hRootKeyType = HKEY_CURRENT_USER;}
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKU")) == 0){hRootKeyType = HKEY_USERS;}
|
|
|
|
iTempFlag = FALSE;
|
|
CRegKey regTheKey(hRootKeyType, ParsedLine.szData1,KEY_READ);
|
|
if ((HKEY) regTheKey) {iTempFlag = TRUE;}
|
|
if (iTempFlag == TRUE)
|
|
{
|
|
// the result was true
|
|
// the key exists, so let's do the section...
|
|
if (ifTrueStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData2));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData2);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData2, iTempFlag));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// the result was false
|
|
if (ifFalseStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData3));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData3);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData3, iTempFlag));
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("41")) == 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// make sure there is a szData3 or a szData4.
|
|
ifTrueStatementExists = FALSE;
|
|
ifFalseStatementExists = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0) {ifTrueStatementExists = TRUE;}
|
|
if (_tcsicmp(ParsedLine.szData4, _T("")) != 0) {ifFalseStatementExists = TRUE;}
|
|
if (ifTrueStatementExists == FALSE && ifFalseStatementExists == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz104_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz105_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// okay we have either szData3 or szData4
|
|
|
|
HKEY hRootKeyType = HKEY_LOCAL_MACHINE;
|
|
// check if the registry key exists...
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKLM")) == 0){hRootKeyType = HKEY_LOCAL_MACHINE;}
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKCR")) == 0){hRootKeyType = HKEY_CLASSES_ROOT;}
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKCU")) == 0){hRootKeyType = HKEY_CURRENT_USER;}
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKU")) == 0){hRootKeyType = HKEY_USERS;}
|
|
|
|
iTempFlag = FALSE;
|
|
CRegKey regTheKey(hRootKeyType, ParsedLine.szData1,KEY_READ);
|
|
CString strReturnQueryValue;
|
|
if ((HKEY) regTheKey)
|
|
{
|
|
if (ERROR_SUCCESS == regTheKey.QueryValue(ParsedLine.szData2, strReturnQueryValue))
|
|
{iTempFlag = TRUE;}
|
|
|
|
// If we failed to read it as a string, try a dword
|
|
if (FALSE == iTempFlag)
|
|
{
|
|
DWORD dwTheReturnDword = 0;
|
|
if (ERROR_SUCCESS == regTheKey.QueryValue(ParsedLine.szData2, dwTheReturnDword))
|
|
{iTempFlag = TRUE;}
|
|
}
|
|
|
|
// If we failed to read it as dword, try a binary
|
|
if (FALSE == iTempFlag)
|
|
{
|
|
CByteArray baData;
|
|
if (ERROR_SUCCESS == regTheKey.QueryValue(ParsedLine.szData2, baData))
|
|
{iTempFlag = TRUE;}
|
|
}
|
|
}
|
|
|
|
if (iTempFlag == TRUE)
|
|
{
|
|
if (ifTrueStatementExists)
|
|
{
|
|
// the key exists, so let's do the section...
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData3));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData3);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData3, iTempFlag));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (ifFalseStatementExists)
|
|
{
|
|
// the key exists, so let's do the section...
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData4));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData4);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData4, iTempFlag));
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("42")) == 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// make sure there is a szData1 or a szData2
|
|
ifTrueStatementExists = FALSE;
|
|
ifFalseStatementExists = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {ifTrueStatementExists = TRUE;}
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {ifFalseStatementExists = TRUE;}
|
|
if (ifTrueStatementExists == FALSE && ifFalseStatementExists == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// okay we have either szData1 or szData2
|
|
|
|
// Check if the filename or dir exists...
|
|
iTempFlag = FALSE;
|
|
if (IsFileExist(ParsedLine.szFileName))
|
|
{iTempFlag = TRUE;}
|
|
if (iTempFlag == TRUE)
|
|
{
|
|
// the result was true
|
|
// the key exists, so let's do the section...
|
|
if (ifTrueStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData1));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData1);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData1, iTempFlag));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// the result was false
|
|
if (ifFalseStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData2));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData2);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData2, iTempFlag));
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("43")) == 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// make sure there is a szData3 or a szData4.
|
|
ifTrueStatementExists = FALSE;
|
|
ifFalseStatementExists = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0) {ifTrueStatementExists = TRUE;}
|
|
if (_tcsicmp(ParsedLine.szData4, _T("")) != 0) {ifFalseStatementExists = TRUE;}
|
|
if (ifTrueStatementExists == FALSE && ifFalseStatementExists == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz104_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz105_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// okay we have either szData3 or szData4
|
|
|
|
HKEY hRootKeyType = HKEY_LOCAL_MACHINE;
|
|
// check if the registry key exists...
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKLM")) == 0){hRootKeyType = HKEY_LOCAL_MACHINE;}
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKCR")) == 0){hRootKeyType = HKEY_CLASSES_ROOT;}
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKCU")) == 0){hRootKeyType = HKEY_CURRENT_USER;}
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKU")) == 0){hRootKeyType = HKEY_USERS;}
|
|
|
|
// ParsedLine.szData1 = Software\Microsoft\etc..\TheValueToCheck
|
|
// so take off the last one and use that as the value to look up.
|
|
TCHAR theRegValuePart[100];
|
|
LPTSTR pszTempPointer = NULL;
|
|
pszTempPointer = _tcsrchr((LPTSTR) ParsedLine.szData1, _T('\\'));
|
|
if (pszTempPointer)
|
|
{
|
|
*pszTempPointer = _T('\0');
|
|
//set the "\" to a null
|
|
// increment to after the pointer
|
|
pszTempPointer = _tcsninc( pszTempPointer, _tcslen(pszTempPointer))+1;
|
|
_tcscpy(theRegValuePart, pszTempPointer );
|
|
}
|
|
//iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Var:Key=%1!s!:Value=%2!s!.\n"), ParsedLine.szData1, theRegValuePart));
|
|
|
|
iTempFlag = FALSE;
|
|
CRegKey regTheKey(hRootKeyType, ParsedLine.szData1,KEY_READ);
|
|
DWORD dwTheReturnDword = 0;
|
|
if ((HKEY) regTheKey)
|
|
{
|
|
if (ERROR_SUCCESS == regTheKey.QueryValue(theRegValuePart, dwTheReturnDword))
|
|
{
|
|
// Check against the value they want to check against.
|
|
DWORD dwCheckDword = atodw(ParsedLine.szData2);
|
|
if (dwTheReturnDword == dwCheckDword)
|
|
{
|
|
iTempFlag = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (iTempFlag == TRUE)
|
|
{
|
|
if (ifTrueStatementExists)
|
|
{
|
|
// the key exists, so let's do the section...
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData3));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData3);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData3, iTempFlag));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (ifFalseStatementExists)
|
|
{
|
|
// the key exists, so let's do the section...
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData4));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData4);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData4, iTempFlag));
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("44")) == 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// make sure there is a szData3 or a szData4.
|
|
ifTrueStatementExists = FALSE;
|
|
ifFalseStatementExists = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0) {ifTrueStatementExists = TRUE;}
|
|
if (_tcsicmp(ParsedLine.szData4, _T("")) != 0) {ifFalseStatementExists = TRUE;}
|
|
if (ifTrueStatementExists == FALSE && ifFalseStatementExists == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz104_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz105_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// okay we have either szData3 or szData4
|
|
|
|
HKEY hRootKeyType = HKEY_LOCAL_MACHINE;
|
|
// check if the registry key exists...
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKLM")) == 0){hRootKeyType = HKEY_LOCAL_MACHINE;}
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKCR")) == 0){hRootKeyType = HKEY_CLASSES_ROOT;}
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKCU")) == 0){hRootKeyType = HKEY_CURRENT_USER;}
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKU")) == 0){hRootKeyType = HKEY_USERS;}
|
|
|
|
// ParsedLine.szData1 = Software\Microsoft\etc..\TheValueToCheck
|
|
// so take off the last one and use that as the value to look up.
|
|
TCHAR theRegValuePart[100];
|
|
LPTSTR pszTempPointer = NULL;
|
|
pszTempPointer = _tcsrchr((LPTSTR) ParsedLine.szData1, _T('\\'));
|
|
if (pszTempPointer)
|
|
{
|
|
*pszTempPointer = _T('\0');
|
|
//set the "\" to a null
|
|
// increment to after the pointer
|
|
pszTempPointer = _tcsninc( pszTempPointer, _tcslen(pszTempPointer))+1;
|
|
_tcscpy(theRegValuePart, pszTempPointer );
|
|
}
|
|
//iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Var:Key=%1!s!:Value=%2!s!.\n"), ParsedLine.szData1, theRegValuePart));
|
|
|
|
iTempFlag = FALSE;
|
|
CRegKey regTheKey(hRootKeyType, ParsedLine.szData1,KEY_READ);
|
|
CString strReturnQueryValue;
|
|
if ((HKEY) regTheKey)
|
|
{
|
|
if (ERROR_SUCCESS == regTheKey.QueryValue(theRegValuePart, strReturnQueryValue))
|
|
{
|
|
if (_tcsicmp(strReturnQueryValue,ParsedLine.szData2) == 0)
|
|
{
|
|
iTempFlag = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (iTempFlag == TRUE)
|
|
{
|
|
if (ifTrueStatementExists)
|
|
{
|
|
// the key exists, so let's do the section...
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData3));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData3);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData3, iTempFlag));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (ifFalseStatementExists)
|
|
{
|
|
// the key exists, so let's do the section...
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData4));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData4);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData4, iTempFlag));
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("45")) == 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// make sure there is a szData1 or a szData2
|
|
ifTrueStatementExists = FALSE;
|
|
ifFalseStatementExists = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {ifTrueStatementExists = TRUE;}
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {ifFalseStatementExists = TRUE;}
|
|
if (ifTrueStatementExists == FALSE && ifFalseStatementExists == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// okay we have either szData1 or szData2
|
|
|
|
// Check if the Service exists...
|
|
iTempFlag = FALSE;
|
|
if (CheckifServiceExist(ParsedLine.szFileName) == 0 )
|
|
{
|
|
// yes the service exists..
|
|
iTempFlag = TRUE;
|
|
}
|
|
|
|
if (iTempFlag == TRUE)
|
|
{
|
|
// the result was true
|
|
// the key exists, so let's do the section...
|
|
if (ifTrueStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData1));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData1);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData1, iTempFlag));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// the result was false
|
|
if (ifFalseStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData2));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData2);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData2, iTempFlag));
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("46")) == 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// make sure there is a szData1 or a szData2
|
|
ifTrueStatementExists = FALSE;
|
|
ifFalseStatementExists = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {ifTrueStatementExists = TRUE;}
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {ifFalseStatementExists = TRUE;}
|
|
if (ifTrueStatementExists == FALSE && ifFalseStatementExists == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// okay we have either szData1 or szData2
|
|
|
|
// Check if the Service exists...and is running..
|
|
iTempFlag = FALSE;
|
|
|
|
if (InetQueryServiceStatus(ParsedLine.szFileName) == SERVICE_RUNNING)
|
|
{
|
|
// yes the service exists..and is running...
|
|
iTempFlag = TRUE;
|
|
}
|
|
|
|
if (iTempFlag == TRUE)
|
|
{
|
|
// the result was true
|
|
// the key exists, so let's do the section...
|
|
if (ifTrueStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData1));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData1);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData1, iTempFlag));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// the result was false
|
|
if (ifFalseStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData2));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData2);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData2, iTempFlag));
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("47")) == 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// make sure there is a szData3 or a szData4.
|
|
ifTrueStatementExists = FALSE;
|
|
ifFalseStatementExists = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {ifTrueStatementExists = TRUE;}
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0) {ifFalseStatementExists = TRUE;}
|
|
if (ifTrueStatementExists == FALSE && ifFalseStatementExists == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz104_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// okay we have either szData3 or szData4
|
|
// Check if the values match.
|
|
iTempFlag = FALSE;
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("ProcessEntry_If:check if [%1!s!=%2!s!]\n"), ParsedLine.szFileName, ParsedLine.szData1));
|
|
|
|
if ( _tcsicmp(ParsedLine.szFileName, ParsedLine.szData1) == 0)
|
|
{
|
|
iTempFlag = TRUE;
|
|
}
|
|
|
|
if (iTempFlag == TRUE)
|
|
{
|
|
// the result was true
|
|
// the key exists, so let's do the section...
|
|
if (ifTrueStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData2));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData2);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData2, iTempFlag));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// the result was false
|
|
if (ifFalseStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData3));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData3);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData3, iTempFlag));
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("48")) == 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// make sure there is a szData1 or a szData2
|
|
ifTrueStatementExists = FALSE;
|
|
ifFalseStatementExists = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {ifTrueStatementExists = TRUE;}
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {ifFalseStatementExists = TRUE;}
|
|
if (ifTrueStatementExists == FALSE && ifFalseStatementExists == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// okay we have either szData1 or szData2
|
|
|
|
// Check if the language specified in the .inf corresponds to
|
|
// our systems language.
|
|
iTempFlag = FALSE;
|
|
|
|
// Get our language
|
|
// set iTempFlag to true if it matches the same language they specified.
|
|
DWORD thid;
|
|
LCID ThisThreadsLocale = GetThreadLocale();
|
|
LCID SystemDefaultLocale = GetSystemDefaultLCID();
|
|
LCID UserDefaultLocale = GetUserDefaultLCID();
|
|
|
|
HANDLE hHackThread = CreateThread (NULL,0,GetNewlyCreatedThreadLocale,NULL,0,&thid);
|
|
if (hHackThread)
|
|
{
|
|
// wait for 10 secs only
|
|
DWORD res = WaitForSingleObject (hHackThread,10*1000);
|
|
if (res == WAIT_TIMEOUT)
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("ERROR GetNewlyCreatedThreadLocale thread never finished...\n")));
|
|
// iTempFlag will be false.
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("ThisThreadsLocale=%0x, GetNewlyCreatedThreadLocale=%0x\n"),ThisThreadsLocale,g_MyTrueThreadLocale));
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("SystemDefaultLocale=%0x, UserDefaultLocale=%0x\n"),SystemDefaultLocale,UserDefaultLocale));
|
|
|
|
CloseHandle (hHackThread);
|
|
|
|
// Check if g_MyTrueThreadLocale matches the one in the .inf file!
|
|
DWORD dwTheLocaleSpecifiedinINF = 0;
|
|
dwTheLocaleSpecifiedinINF = atodw(ParsedLine.szFileName);
|
|
if (g_MyTrueThreadLocale == dwTheLocaleSpecifiedinINF)
|
|
{
|
|
iTempFlag = TRUE;
|
|
}
|
|
else if (ThisThreadsLocale == dwTheLocaleSpecifiedinINF)
|
|
{
|
|
iTempFlag = TRUE;
|
|
}
|
|
else if (SystemDefaultLocale == dwTheLocaleSpecifiedinINF)
|
|
{
|
|
iTempFlag = TRUE;
|
|
}
|
|
else if (UserDefaultLocale == dwTheLocaleSpecifiedinINF)
|
|
{
|
|
iTempFlag = TRUE;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, _T("Failed to start GetNewlyCreatedThreadLocale thread. error =%0x\n"),GetLastError()));
|
|
}
|
|
|
|
if (iTempFlag == TRUE)
|
|
{
|
|
// the result was true
|
|
// the key exists, so let's do the section...
|
|
if (ifTrueStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData1));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData1);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData1, iTempFlag));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// the result was false
|
|
if (ifFalseStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData2));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData2);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData2, iTempFlag));
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("49")) == 0)
|
|
{
|
|
BOOL bOperator_EqualTo = 0;
|
|
BOOL bOperator_GreaterThan = 0;
|
|
BOOL bOperator_LessThan = 0;
|
|
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
// make sure there is an operator "=,>,<,>=,<="
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
iTempFlag = FALSE;
|
|
LPTSTR pchResult;
|
|
pchResult = _tcschr( ParsedLine.szData1, _T('=') );
|
|
if(pchResult){bOperator_EqualTo = TRUE;iTempFlag = TRUE;}
|
|
|
|
pchResult = NULL;
|
|
pchResult = _tcschr( ParsedLine.szData1, _T('>') );
|
|
if(pchResult){bOperator_GreaterThan = TRUE;iTempFlag = TRUE;}
|
|
|
|
pchResult = NULL;
|
|
pchResult = _tcschr( ParsedLine.szData1, _T('<') );
|
|
if(pchResult){bOperator_LessThan = TRUE;iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
// make sure the version to compare it to is specified
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// make sure there is a szData3 or a szData4.
|
|
ifTrueStatementExists = FALSE;
|
|
ifFalseStatementExists = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0) {ifTrueStatementExists = TRUE;}
|
|
if (_tcsicmp(ParsedLine.szData4, _T("")) != 0) {ifFalseStatementExists = TRUE;}
|
|
if (ifTrueStatementExists == FALSE && ifFalseStatementExists == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz104_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz105_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// make sure to return true from here on!
|
|
iReturn = TRUE;
|
|
|
|
// check if the file exists
|
|
// Check if the filename or dir exists...
|
|
if (!IsFileExist(ParsedLine.szFileName))
|
|
{goto ProcessEntry_If_Exit;}
|
|
|
|
BOOL bThisIsABinary = FALSE;
|
|
TCHAR szExtensionOnly[_MAX_EXT] = _T("");
|
|
_tsplitpath(ParsedLine.szFileName, NULL, NULL, NULL, szExtensionOnly);
|
|
|
|
// Get version info for dll,exe,ocx only
|
|
if (_tcsicmp(szExtensionOnly, _T(".exe")) == 0){bThisIsABinary=TRUE;}
|
|
if (_tcsicmp(szExtensionOnly, _T(".dll")) == 0){bThisIsABinary=TRUE;}
|
|
if (_tcsicmp(szExtensionOnly, _T(".ocx")) == 0){bThisIsABinary=TRUE;}
|
|
if (FALSE == bThisIsABinary)
|
|
{
|
|
// no version, bail
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
DWORD dwMSVer, dwLSVer = 0;
|
|
TCHAR szLocalizedVersion[100] = _T("");
|
|
|
|
// the file exists, lets get the file version and compare it with
|
|
// the inputed version, if the fileversion is <= inputversion, then do TRUE section,
|
|
// otherwise to FALSE section
|
|
|
|
// get the fileinformation
|
|
MyGetVersionFromFile(ParsedLine.szFileName, &dwMSVer, &dwLSVer, szLocalizedVersion);
|
|
if (!dwMSVer)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("ProcessEntry_If:No Version in %1!s!, or filenot found\n"), ParsedLine.szFileName));
|
|
// no version, leave
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("ProcessEntry_If:check if [%1!s! (%2!s! %3!s! %4!s!)]\n"), ParsedLine.szFileName, szLocalizedVersion, ParsedLine.szData1));
|
|
|
|
int iTempVerValue = 0;
|
|
iTempVerValue = VerCmp(szLocalizedVersion,ParsedLine.szData1);
|
|
if (0 == iTempVerValue)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("ProcessEntry_If:VerCmp=%d\n"), iTempVerValue));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
iTempFlag = FALSE;
|
|
if (bOperator_EqualTo)
|
|
{
|
|
// check if the above operation was equal
|
|
if (1 == iTempVerValue){iTempFlag = TRUE;}
|
|
}
|
|
|
|
if (bOperator_GreaterThan)
|
|
{
|
|
// check if the above operation was greater than
|
|
if (2 == iTempVerValue){iTempFlag = TRUE;}
|
|
}
|
|
|
|
if (bOperator_LessThan)
|
|
{
|
|
// check if the above operation was less than
|
|
if (3 == iTempVerValue){iTempFlag = TRUE;}
|
|
}
|
|
|
|
if (iTempFlag == TRUE)
|
|
{
|
|
// the result was true
|
|
// the key exists, so let's do the section...
|
|
if (ifTrueStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData3));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData3);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData3, iTempFlag));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// the result was false
|
|
if (ifFalseStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData4));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData4);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData4, iTempFlag));
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("39")) == 0)
|
|
{
|
|
BOOL bOperator_EqualTo = 0;
|
|
BOOL bOperator_GreaterThan = 0;
|
|
BOOL bOperator_LessThan = 0;
|
|
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
// make sure the description string to comprare it to is specified
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
ifTrueStatementExists = FALSE;
|
|
ifFalseStatementExists = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {ifTrueStatementExists = TRUE;}
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0) {ifFalseStatementExists = TRUE;}
|
|
if (ifTrueStatementExists == FALSE && ifFalseStatementExists == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz104_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// make sure to return true from here on!
|
|
iReturn = TRUE;
|
|
|
|
// check if the file exists
|
|
// Check if the filename or dir exists...
|
|
if (!IsFileExist(ParsedLine.szFileName))
|
|
{goto ProcessEntry_If_Exit;}
|
|
|
|
TCHAR szFileDescriptionInfo[_MAX_PATH] = _T("");
|
|
|
|
// Get the file description info
|
|
|
|
// get the DescriptionInfo
|
|
if (!MyGetDescriptionFromFile(ParsedLine.szFileName, szFileDescriptionInfo))
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("ProcessEntry_If:No file desc in %1!s!, or filenot found\n"), ParsedLine.szFileName));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
iTempFlag = FALSE;
|
|
if ( _tcsicmp(szFileDescriptionInfo,ParsedLine.szData1) == 0)
|
|
{
|
|
// if they match the do the true!
|
|
iTempFlag = TRUE;
|
|
}
|
|
|
|
if (iTempFlag == TRUE)
|
|
{
|
|
// the result was true
|
|
// the key exists, so let's do the section...
|
|
if (ifTrueStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData2));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData2);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData2, iTempFlag));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// the result was false
|
|
if (ifFalseStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData3));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData3);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData3, iTempFlag));
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("100")) == 0)
|
|
{
|
|
TCHAR buf[_MAX_PATH];
|
|
GetSystemDirectory(buf, _MAX_PATH);
|
|
|
|
// make sure there is a szData1 or a szData2
|
|
ifTrueStatementExists = FALSE;
|
|
ifFalseStatementExists = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {ifTrueStatementExists = TRUE;}
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {ifFalseStatementExists = TRUE;}
|
|
if (ifTrueStatementExists == FALSE && ifFalseStatementExists == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_If_Exit;
|
|
}
|
|
|
|
// okay we have either szData1 or szData2
|
|
|
|
// Check if the Service exists...
|
|
iTempFlag = FALSE;
|
|
if (IsThisDriveNTFS(buf) == 0 )
|
|
{
|
|
// yes it is FAT
|
|
iTempFlag = TRUE;
|
|
}
|
|
|
|
if (iTempFlag == TRUE)
|
|
{
|
|
// the result was true
|
|
// the key exists, so let's do the section...
|
|
if (ifTrueStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData1));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData1);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData1, iTempFlag));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// the result was false
|
|
if (ifFalseStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData2));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData2);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData2, iTempFlag));
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("119")) == 0)
|
|
{
|
|
|
|
if ( IsMachineInDomain() )
|
|
{
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0 )
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData2));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData2);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData2, iTempFlag));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0 )
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData3));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData3);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData3, iTempFlag));
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// We called the function, so return true.
|
|
iReturn = TRUE;
|
|
|
|
ProcessEntry_If_Exit:
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int ProcessEntry_Metabase(IN CString csEntry,IN LPCTSTR szTheSection,ThingToDo ParsedLine)
|
|
{
|
|
int iShowErrorsOnFail = TRUE;
|
|
int iReturn = FALSE;
|
|
int iTempFlag = FALSE;
|
|
|
|
// Get the type.
|
|
if ( _tcsicmp(ParsedLine.szType, _T("82")) != 0 && _tcsicmp(ParsedLine.szType, _T("83")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("84")) != 0 && _tcsicmp(ParsedLine.szType, _T("85")) != 0
|
|
)
|
|
{
|
|
goto ProcessEntry_Metabase_Exit;
|
|
}
|
|
|
|
// Check if there is other criteria we need to pass
|
|
if (!ProcessEntry_CheckAll(csEntry, szTheSection, ParsedLine) )
|
|
{
|
|
goto ProcessEntry_Metabase_Exit;
|
|
}
|
|
|
|
iShowErrorsOnFail = TRUE;
|
|
if (_tcsicmp(ParsedLine.szDoNotDisplayErrIfFunctionFailed, _T("1")) == 0)
|
|
{iShowErrorsOnFail = FALSE;}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("82")) == 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Metabase_Exit;
|
|
}
|
|
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Metabase_Exit;
|
|
}
|
|
|
|
// Check if hte szData1 includes a "/*"
|
|
// if it does, then that means to do it for every server instance.
|
|
iTempFlag = FALSE;
|
|
if (_tcsstr(ParsedLine.szFileName, _T("/*")))
|
|
{iTempFlag = TRUE;}
|
|
|
|
// Check if we need to do this for every server instance.
|
|
if (iTempFlag)
|
|
{
|
|
CString csTempString;
|
|
CString BeforeString;
|
|
CString AfterString;
|
|
|
|
csTempString = ParsedLine.szFileName;
|
|
BeforeString = csTempString;
|
|
AfterString = _T("");
|
|
|
|
// Find the "/*" and get the stuff before it.
|
|
int iWhere = 0;
|
|
iWhere = csTempString.Find(_T("/*"));
|
|
if (-1 != iWhere)
|
|
{
|
|
// there is a '/*' in the string
|
|
BeforeString = csTempString.Left(iWhere);
|
|
|
|
// Get the after comma vlues
|
|
CString csVeryTemp;
|
|
csVeryTemp = _T("/*");
|
|
AfterString = csTempString.Right( csTempString.GetLength() - (iWhere + csVeryTemp.GetLength()));
|
|
}
|
|
|
|
CStringArray arrayInstance;
|
|
int nArray = 0, i = 0;
|
|
if (CheckifServiceExist(_T("IISADMIN")) == 0 )
|
|
{
|
|
CMDKey cmdKey;
|
|
//cmdKey.OpenNode(ParsedLine.szFileName);
|
|
cmdKey.OpenNode(BeforeString);
|
|
if ( (METADATA_HANDLE) cmdKey )
|
|
{
|
|
// enumerate thru this key for other keys...
|
|
CMDKeyIter cmdKeyEnum(cmdKey);
|
|
CString csKeyName;
|
|
while (cmdKeyEnum.Next(&csKeyName) == ERROR_SUCCESS)
|
|
{
|
|
// make sure that it's a number that we are adding.
|
|
if (IsValidNumber(csKeyName))
|
|
{
|
|
arrayInstance.Add(csKeyName);
|
|
}
|
|
}
|
|
cmdKey.Close();
|
|
|
|
nArray = (int)arrayInstance.GetSize();
|
|
for (i=0; i<nArray; i++)
|
|
{
|
|
/*
|
|
// Recurse Thru This nodes entries
|
|
// Probably look something like these...
|
|
[/W3SVC]
|
|
[/W3SVC/1/ROOT/IISSAMPLES/ExAir]
|
|
[/W3SVC/1/ROOT/IISADMIN]
|
|
[/W3SVC/1/ROOT/IISHELP]
|
|
[/W3SVC/1/ROOT/specs]
|
|
[/W3SVC/2/ROOT]
|
|
[/W3SVC/2/ROOT/IISADMIN]
|
|
[/W3SVC/2/ROOT/IISHELP]
|
|
etc...
|
|
*/
|
|
CString csPath;
|
|
csPath = BeforeString;
|
|
csPath += _T("/");
|
|
csPath += arrayInstance[i];
|
|
csPath += AfterString;
|
|
|
|
// delete the metabase node.
|
|
cmdKey.OpenNode(csPath);
|
|
if ( (METADATA_HANDLE)cmdKey )
|
|
{
|
|
cmdKey.DeleteNode(ParsedLine.szData1);
|
|
cmdKey.Close();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// delete the metabase node.
|
|
if (CheckifServiceExist(_T("IISADMIN")) == 0 )
|
|
{
|
|
CMDKey cmdKey;
|
|
cmdKey.OpenNode(ParsedLine.szFileName);
|
|
if ( (METADATA_HANDLE)cmdKey )
|
|
{
|
|
cmdKey.DeleteNode(ParsedLine.szData1);
|
|
cmdKey.Close();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("83")) == 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Metabase_Exit;
|
|
}
|
|
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Metabase_Exit;
|
|
}
|
|
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Metabase_Exit;
|
|
}
|
|
|
|
// Check if hte szData1 includes a "/*"
|
|
// if it does, then that means to do it for every server instance.
|
|
iTempFlag = FALSE;
|
|
if (_tcsstr(ParsedLine.szFileName, _T("/*")))
|
|
{iTempFlag = TRUE;}
|
|
|
|
// Check if we need to do this for every server instance.
|
|
if (iTempFlag)
|
|
{
|
|
CString csTempString;
|
|
CString BeforeString;
|
|
CString AfterString;
|
|
|
|
csTempString = ParsedLine.szFileName;
|
|
BeforeString = csTempString;
|
|
AfterString = _T("");
|
|
|
|
// Find the "/*" and get the stuff before it.
|
|
int iWhere = 0;
|
|
iWhere = csTempString.Find(_T("/*"));
|
|
if (-1 != iWhere)
|
|
{
|
|
// there is a '/*' in the string
|
|
BeforeString = csTempString.Left(iWhere);
|
|
|
|
// Get the after comma vlues
|
|
CString csVeryTemp;
|
|
csVeryTemp = _T("/*");
|
|
AfterString = csTempString.Right( csTempString.GetLength() - (iWhere + csVeryTemp.GetLength()));
|
|
}
|
|
|
|
CStringArray arrayInstance;
|
|
int nArray = 0, i = 0;
|
|
if (CheckifServiceExist(_T("IISADMIN")) == 0 )
|
|
{
|
|
CMDKey cmdKey;
|
|
//cmdKey.OpenNode(ParsedLine.szFileName);
|
|
cmdKey.OpenNode(BeforeString);
|
|
if ( (METADATA_HANDLE) cmdKey )
|
|
{
|
|
// enumerate thru this key for other keys...
|
|
CMDKeyIter cmdKeyEnum(cmdKey);
|
|
CString csKeyName;
|
|
while (cmdKeyEnum.Next(&csKeyName) == ERROR_SUCCESS)
|
|
{
|
|
// make sure that it's a number that we are adding.
|
|
if (IsValidNumber(csKeyName))
|
|
{
|
|
arrayInstance.Add(csKeyName);
|
|
}
|
|
}
|
|
cmdKey.Close();
|
|
|
|
nArray = (int)arrayInstance.GetSize();
|
|
for (i=0; i<nArray; i++)
|
|
{
|
|
/*
|
|
// Recurse Thru This nodes entries
|
|
// Probably look something like these...
|
|
[/W3SVC]
|
|
[/W3SVC/1/ROOT/IISSAMPLES/ExAir]
|
|
[/W3SVC/1/ROOT/IISADMIN]
|
|
[/W3SVC/1/ROOT/IISHELP]
|
|
[/W3SVC/1/ROOT/specs]
|
|
[/W3SVC/2/ROOT]
|
|
[/W3SVC/2/ROOT/IISADMIN]
|
|
[/W3SVC/2/ROOT/IISHELP]
|
|
etc...
|
|
*/
|
|
CString csPath;
|
|
csPath = BeforeString;
|
|
csPath += _T("/");
|
|
csPath += arrayInstance[i];
|
|
csPath += AfterString;
|
|
|
|
// DO WHATEVER YOU NEED TO DO.
|
|
int arrayInstanceNum = _ttoi(arrayInstance[i]);
|
|
// Add the virtual root
|
|
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0) {iTempFlag = TRUE;}
|
|
|
|
// make sure it ParsedLine.szData1 starts with a "/"
|
|
TCHAR szTempString[_MAX_PATH];
|
|
|
|
SafeCopy(szTempString, ParsedLine.szData1, sizeof(szTempString)/sizeof(TCHAR));
|
|
if (szTempString[0] != _T('/'))
|
|
{_stprintf(ParsedLine.szData1, _T("/%s"), szTempString);}
|
|
|
|
if (iTempFlag)
|
|
{
|
|
AddMDVRootTree(csPath, ParsedLine.szData1, ParsedLine.szData2, ParsedLine.szData3, arrayInstanceNum);
|
|
}
|
|
else
|
|
{
|
|
AddMDVRootTree(csPath, ParsedLine.szData1, ParsedLine.szData2, NULL, arrayInstanceNum);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Add the virtual root
|
|
if (CheckifServiceExist(_T("IISADMIN")) == 0 )
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0) {iTempFlag = TRUE;}
|
|
|
|
// make sure it ParsedLine.szData1 starts with a "/"
|
|
TCHAR szTempString[_MAX_PATH];
|
|
SafeCopy(szTempString, ParsedLine.szData1, sizeof(szTempString)/sizeof(TCHAR));
|
|
if (szTempString[0] != _T('/'))
|
|
{_stprintf(ParsedLine.szData1, _T("/%s"), szTempString);}
|
|
|
|
if (iTempFlag)
|
|
{
|
|
AddMDVRootTree(ParsedLine.szFileName, ParsedLine.szData1, ParsedLine.szData2, ParsedLine.szData3, 0);
|
|
}
|
|
else
|
|
{
|
|
AddMDVRootTree(ParsedLine.szFileName, ParsedLine.szData1, ParsedLine.szData2, NULL, 0);
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("84")) == 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Metabase_Exit;
|
|
}
|
|
|
|
// call that particular migration section
|
|
TSTR strTheSection;
|
|
|
|
if ( strTheSection.Copy( ParsedLine.szFileName ) &&
|
|
GetSectionNameToDo(g_pTheApp->m_hInfHandle, &strTheSection )
|
|
)
|
|
{
|
|
MigrateInfSectionToMD(g_pTheApp->m_hInfHandle, strTheSection.QueryStr() );
|
|
}
|
|
}
|
|
|
|
#ifndef _CHICAGO_
|
|
if ( _tcsicmp(ParsedLine.szType, _T("85")) == 0)
|
|
{
|
|
int iTheReturn = TRUE;
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Metabase_Exit;
|
|
}
|
|
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Metabase_Exit;
|
|
}
|
|
|
|
iTheReturn = ChangeUserPassword(ParsedLine.szFileName,ParsedLine.szData1);
|
|
if (FALSE == iTheReturn)
|
|
{
|
|
if (iShowErrorsOnFail){MyMessageBox(NULL, _T("ChangeUserPassword failed"), ParsedLine.szFileName, MB_OK | MB_SETFOREGROUND);}
|
|
else{iisDebugOut((LOG_TYPE_ERROR, _T("ChangeUserPassword(%s). Failed..\n"), ParsedLine.szFileName));}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
// We called the function, so return true.
|
|
iReturn = TRUE;
|
|
|
|
ProcessEntry_Metabase_Exit:
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
int ProcessEntry_Misc2(IN CString csEntry,IN LPCTSTR szTheSection,ThingToDo ParsedLine)
|
|
{
|
|
int iReturn = FALSE;
|
|
int iTempFlag = FALSE;
|
|
|
|
// Get the type.
|
|
if ( _tcsicmp(ParsedLine.szType, _T("15")) != 0 && _tcsicmp(ParsedLine.szType, _T("16")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("78")) != 0 && _tcsicmp(ParsedLine.szType, _T("79")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("80")) != 0 && _tcsicmp(ParsedLine.szType, _T("81")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("86")) != 0 && _tcsicmp(ParsedLine.szType, _T("87")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("88")) != 0 && _tcsicmp(ParsedLine.szType, _T("89")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("90")) != 0 && _tcsicmp(ParsedLine.szType, _T("91")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("92")) != 0 && _tcsicmp(ParsedLine.szType, _T("93")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("94")) != 0 && _tcsicmp(ParsedLine.szType, _T("95")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("96")) != 0 && _tcsicmp(ParsedLine.szType, _T("97")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("98")) != 0 && _tcsicmp(ParsedLine.szType, _T("99")) != 0
|
|
)
|
|
{
|
|
goto ProcessEntry_Misc2_Exit;
|
|
}
|
|
|
|
// Check if there is other criteria we need to pass
|
|
if (!ProcessEntry_CheckAll(csEntry, szTheSection, ParsedLine) )
|
|
{
|
|
goto ProcessEntry_Misc2_Exit;
|
|
}
|
|
|
|
// make sure we have a progresstitle
|
|
if ( _tcsicmp(ParsedLine.szType, _T("15")) == 0)
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szProgressTitle, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz805_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc2_Exit;
|
|
}
|
|
}
|
|
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("15")) == 0)
|
|
{
|
|
ProgressBarTextStack_Set(ParsedLine.szProgressTitle);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("16")) == 0)
|
|
{
|
|
ProgressBarTextStack_Pop();
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("78")) == 0)
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc2_Exit;
|
|
}
|
|
if (!IsFileExist(ParsedLine.szFileName))
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("ProcessEntry_other():'%s' does not exist.\n"),ParsedLine.szFileName));
|
|
goto ProcessEntry_Misc2_Exit;
|
|
}
|
|
|
|
MakeSureDirAclsHaveAtLeastRead((LPTSTR) ParsedLine.szFileName);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("79")) == 0)
|
|
{
|
|
int ifTrueStatementExists = FALSE;
|
|
int ifFalseStatementExists = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {ifTrueStatementExists = TRUE;}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {ifFalseStatementExists = TRUE;}
|
|
|
|
iTempFlag = FALSE;
|
|
iTempFlag = IsMetabaseCorrupt();
|
|
if (iTempFlag == TRUE)
|
|
{
|
|
// the result was true
|
|
// the key exists, so let's do the section...
|
|
if (ifTrueStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szFileName));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szFileName);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szFileName, iTempFlag));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// the result was false
|
|
if (ifFalseStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData1));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData1);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData1, iTempFlag));
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("80")) == 0)
|
|
{
|
|
// initialize ole
|
|
iisDebugOut_Start((_T("ole32:OleInitialize")));
|
|
int iBalanceOLE = iOleInitialize();
|
|
iisDebugOut_End((_T("ole32:OleInitialize")));
|
|
// add it to the stack of ole inits and uninits...
|
|
GlobalOleInitList_Push(iBalanceOLE);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("81")) == 0)
|
|
{
|
|
// Uninitialize ole.
|
|
// Check if there is a corresponding oleinit, if there is,
|
|
// then uninit, else uninit anyways.
|
|
// Grab the last thing on the stack...
|
|
// if there is one, then do whatever it is.
|
|
// if there is none, then OleUninitialize anyway
|
|
if (GlobalOleInitList_Find() == TRUE)
|
|
{
|
|
if (TRUE == GlobalOleInitList_Pop())
|
|
{
|
|
iOleUnInitialize(TRUE);
|
|
}
|
|
else
|
|
{
|
|
iOleUnInitialize(FALSE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
iOleUnInitialize(TRUE);
|
|
}
|
|
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("86")) == 0)
|
|
{
|
|
// See if there is an extra param in the other field
|
|
int iTicksToAdvance = 1;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0)
|
|
{
|
|
if (IsValidNumber((LPCTSTR)ParsedLine.szFileName))
|
|
{iTicksToAdvance = _ttoi((LPCTSTR)ParsedLine.szFileName);}
|
|
}
|
|
AdvanceProgressBarTickGauge(iTicksToAdvance);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("87")) == 0)
|
|
{
|
|
LogFilesInThisDir(ParsedLine.szFileName);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("88")) == 0)
|
|
{
|
|
LogFileVersion(ParsedLine.szFileName, TRUE);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("89")) == 0)
|
|
{
|
|
// make sure the metabase writes all the information to disk now.
|
|
WriteToMD_ForceMetabaseToWriteToDisk();
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("90")) == 0)
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc2_Exit;
|
|
}
|
|
DWORD dwTheID = _ttol(ParsedLine.szFileName);
|
|
//iisDebugOut((LOG_TYPE_ERROR, _T("Values: %s, %d"), ParsedLine.szFileName, dwTheID));
|
|
|
|
if ( ( dwTheID == 32802 ) && // DomainName
|
|
( _tcsicmp(ParsedLine.szData1, _T("")) == 0)
|
|
)
|
|
{
|
|
CString DomainName;
|
|
|
|
if ( RetrieveDomain(DomainName) )
|
|
{
|
|
SetupSetStringId_Wrapper(g_pTheApp->m_hInfHandle,dwTheID,DomainName.GetBuffer(0));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SetupSetStringId_Wrapper(g_pTheApp->m_hInfHandle,dwTheID,ParsedLine.szData1);
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("91")) == 0)
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc2_Exit;
|
|
}
|
|
DWORD dwTheID = atodw(ParsedLine.szFileName);
|
|
SetupSetStringId_Wrapper(g_pTheApp->m_hInfHandle,dwTheID,ParsedLine.szData1);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("92")) == 0)
|
|
{
|
|
// 100=92|101=Inst mode (0,1,2,3)|102=UpgType(UT_10,etc..)|103=UpgTypeHasMetabaseFlag (0|1)|104=AllCompOffByDefaultFlag
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc2_Exit;
|
|
}
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc2_Exit;
|
|
}
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc2_Exit;
|
|
}
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz104_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc2_Exit;
|
|
}
|
|
//m_eInstallMode = IM_FRESH;
|
|
//m_eUpgradeType = UT_NONE;
|
|
//m_bUpgradeTypeHasMetabaseFlag = FALSE;
|
|
//m_bPleaseDoNotInstallByDefault = TRUE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("1")) == 0)
|
|
{g_pTheApp->m_eInstallMode = IM_FRESH;}
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("2")) == 0)
|
|
{g_pTheApp->m_eInstallMode = IM_UPGRADE;}
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("3")) == 0)
|
|
{g_pTheApp->m_eInstallMode = IM_MAINTENANCE;}
|
|
|
|
if (_tcsicmp(ParsedLine.szData1, _T("UT_NONE")) == 0)
|
|
{g_pTheApp->m_eUpgradeType = UT_NONE;}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("UT_351")) == 0)
|
|
{g_pTheApp->m_eUpgradeType = UT_351;}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("UT_10")) == 0)
|
|
{g_pTheApp->m_eUpgradeType = UT_10;}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("UT_20")) == 0)
|
|
{g_pTheApp->m_eUpgradeType = UT_20;}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("UT_30")) == 0)
|
|
{g_pTheApp->m_eUpgradeType = UT_30;}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("UT_40")) == 0)
|
|
{g_pTheApp->m_eUpgradeType = UT_40;}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("UT_50")) == 0)
|
|
{g_pTheApp->m_eUpgradeType = UT_50;}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("UT_51")) == 0)
|
|
{g_pTheApp->m_eUpgradeType = UT_51;}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("UT_60")) == 0)
|
|
{g_pTheApp->m_eUpgradeType = UT_60;}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("UT_10_W95")) == 0)
|
|
{g_pTheApp->m_eUpgradeType = UT_10_W95;}
|
|
|
|
g_pTheApp->m_bUpgradeTypeHasMetabaseFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("1")) == 0)
|
|
{g_pTheApp->m_bUpgradeTypeHasMetabaseFlag = TRUE;}
|
|
|
|
g_pTheApp->m_bPleaseDoNotInstallByDefault = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData3, _T("1")) == 0)
|
|
{g_pTheApp->m_bPleaseDoNotInstallByDefault = TRUE;}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("93")) == 0)
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("1")) == 0) {iTempFlag = TRUE;}
|
|
StopAllServicesRegardless(iTempFlag);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("94")) == 0)
|
|
{
|
|
DisplayActionsForAllOurComponents(g_pTheApp->m_hInfHandle);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("95")) == 0)
|
|
{
|
|
// Check if the specified file has a version >= iis4.
|
|
// if it does then rename the file.
|
|
|
|
// make sure it has a 101
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc2_Exit;
|
|
}
|
|
// make sure the file exists.
|
|
if (!IsFileExist(ParsedLine.szFileName))
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("ProcessEntry_other():'%s' does not exist.\n"),ParsedLine.szFileName));
|
|
goto ProcessEntry_Misc2_Exit;
|
|
}
|
|
|
|
DWORD dwMajorVersion = 0x0;
|
|
DWORD dwMinorVersion = 0x0;
|
|
// make sure it has a 102
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc2_Exit;
|
|
}
|
|
// make sure it has a 103
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc2_Exit;
|
|
}
|
|
else
|
|
{
|
|
dwMajorVersion = atodw(ParsedLine.szData2);
|
|
}
|
|
|
|
// make sure it has a 104
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz104_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc2_Exit;
|
|
}
|
|
else
|
|
{
|
|
dwMinorVersion = atodw(ParsedLine.szData3);
|
|
}
|
|
|
|
// Check if the file has a larger version.
|
|
//DWORD dwNtopMSVer = 0x40002;
|
|
//DWORD dwNtopLSVer = 0x26e0001;
|
|
if (FALSE == IsFileLessThanThisVersion(ParsedLine.szFileName, dwMajorVersion, dwMinorVersion))
|
|
{
|
|
// ok, this is a 'special' built file that the user built themselves.
|
|
// let's rename it to something else.
|
|
|
|
// check if the "to" filename exists.
|
|
iTempFlag = FALSE;
|
|
int I1 = 0;
|
|
TCHAR szTempFileName[_MAX_PATH];
|
|
SafeCopy(szTempFileName, ParsedLine.szData1, _MAX_PATH);
|
|
do
|
|
{
|
|
if (!IsFileExist(szTempFileName) || (I1 > 10))
|
|
{
|
|
iTempFlag = TRUE;
|
|
// rename it
|
|
if (MoveFileEx( ParsedLine.szFileName, szTempFileName, MOVEFILE_COPY_ALLOWED|MOVEFILE_WRITE_THROUGH|MOVEFILE_REPLACE_EXISTING))
|
|
{iisDebugOut((LOG_TYPE_WARN, _T("%s was renamed to %s for safety because it is probably a user compiled file. WARNING."),ParsedLine.szFileName, szTempFileName));}
|
|
else
|
|
{iisDebugOut((LOG_TYPE_ERROR, _T("Rename of %s to %s for safety because it is probably a user compiled file. FAILED."),ParsedLine.szFileName, szTempFileName));}
|
|
}
|
|
else
|
|
{
|
|
// add on some other stuff.
|
|
I1++;
|
|
_stprintf(szTempFileName, _T("%s%d"), ParsedLine.szData1, I1);
|
|
}
|
|
} while (iTempFlag == FALSE);
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("96")) == 0)
|
|
{
|
|
// show messagebox
|
|
int iSaveOld_AllowMessageBoxPopups = g_pTheApp->m_bAllowMessageBoxPopups;
|
|
g_pTheApp->m_bAllowMessageBoxPopups = TRUE;
|
|
MyMessageBox(NULL, ParsedLine.szData1, ParsedLine.szFileName, MB_OK | MB_SETFOREGROUND);
|
|
g_pTheApp->m_bAllowMessageBoxPopups = iSaveOld_AllowMessageBoxPopups;
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("97")) == 0)
|
|
{
|
|
// do nothing...
|
|
}
|
|
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("98")) == 0)
|
|
{
|
|
//Reboot
|
|
SetRebootFlag();
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("99")) == 0)
|
|
{
|
|
// dump internal variables
|
|
g_pTheApp->DumpAppVars();
|
|
int iDoExtraStuff = 0;
|
|
|
|
if (ParsedLine.szFileName && _tcsicmp(ParsedLine.szFileName, _T("")) != 0)
|
|
{
|
|
if (IsValidNumber((LPCTSTR)ParsedLine.szFileName))
|
|
{
|
|
iDoExtraStuff = _ttoi((LPCTSTR)ParsedLine.szFileName);
|
|
}
|
|
}
|
|
|
|
if (g_GlobalDebugLevelFlag >= LOG_TYPE_TRACE)
|
|
{
|
|
if (iDoExtraStuff >= 2)
|
|
{
|
|
// display locked dlls by setup
|
|
LogThisProcessesDLLs();
|
|
// display running processes
|
|
LogCurrentProcessIDs();
|
|
// free some memory used for the task list
|
|
FreeTaskListMem();
|
|
UnInit_Lib_PSAPI();
|
|
}
|
|
|
|
// display running services
|
|
if (iDoExtraStuff >= 1)
|
|
{
|
|
LogEnumServicesStatus();
|
|
}
|
|
// log file versions
|
|
LogImportantFiles();
|
|
// check if temp dir is writeable
|
|
LogCheckIfTempDirWriteable();
|
|
}
|
|
}
|
|
|
|
// We called the function, so return true.
|
|
iReturn = TRUE;
|
|
|
|
ProcessEntry_Misc2_Exit:
|
|
return iReturn;
|
|
}
|
|
|
|
// function: SafeCopy
|
|
//
|
|
// - Copy a string from one to another.
|
|
// - This function takes the length of the destination to make sure we don't
|
|
// copy too much.
|
|
// - This will always make sure that it is null terminated
|
|
//
|
|
// Return
|
|
// A pointer to the destination string
|
|
//
|
|
LPTSTR
|
|
SafeCopy( LPTSTR szDestination, LPTSTR szSource, DWORD dwSize)
|
|
{
|
|
LPTSTR szRet;
|
|
|
|
// This is an assumption, so lets make sure it is true
|
|
ASSERT( dwSize != 0 );
|
|
|
|
szRet = _tcsncpy( szDestination, szSource, dwSize); // Copy string
|
|
szDestination[dwSize - 1] = '\0'; // NULL Terminate
|
|
|
|
return szRet;
|
|
}
|
|
|
|
// function: SafeCat
|
|
//
|
|
// - Concatanate one string onto another
|
|
// - This function takes the length of the destination to make sure we don't
|
|
// copy too much.
|
|
// - This will always make sure that it is null terminated
|
|
//
|
|
// Return
|
|
// A pointer to the destination string
|
|
//
|
|
LPTSTR
|
|
SafeCat( LPTSTR szDestination, LPTSTR szSource, DWORD dwSize)
|
|
{
|
|
LPTSTR szRet;
|
|
|
|
// This is an assumption, so lets make sure it is true
|
|
ASSERT( dwSize != 0 );
|
|
|
|
szRet = _tcsncat( szDestination, szSource, dwSize); // Copy string
|
|
szDestination[dwSize - 1] = '\0'; // NULL Terminate
|
|
|
|
return szRet;
|
|
}
|
|
|
|
int ProcessEntry_Misc3(IN CString csEntry,IN LPCTSTR szTheSection,ThingToDo ParsedLine)
|
|
{
|
|
int iReturn = FALSE;
|
|
int iTempFlag = FALSE;
|
|
int ifTrueStatementExists = FALSE;
|
|
int ifFalseStatementExists = FALSE;
|
|
|
|
int iShowErrorsOnFail = TRUE;
|
|
if (_tcsicmp(ParsedLine.szDoNotDisplayErrIfFunctionFailed, _T("1")) == 0)
|
|
{iShowErrorsOnFail = FALSE;}
|
|
|
|
// Get the type.
|
|
if ( _tcsicmp(ParsedLine.szType, _T("101")) != 0 && _tcsicmp(ParsedLine.szType, _T("102")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("103")) != 0 && _tcsicmp(ParsedLine.szType, _T("104")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("105")) != 0 && _tcsicmp(ParsedLine.szType, _T("106")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("107")) != 0 && _tcsicmp(ParsedLine.szType, _T("108")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("109")) != 0 && _tcsicmp(ParsedLine.szType, _T("110")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("111")) != 0 && _tcsicmp(ParsedLine.szType, _T("112")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("113")) != 0 && _tcsicmp(ParsedLine.szType, _T("114")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("115")) != 0 && _tcsicmp(ParsedLine.szType, _T("116")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("117")) != 0 && _tcsicmp(ParsedLine.szType, _T("118")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("119")) != 0
|
|
)
|
|
{
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
// Check if there is other criteria we need to pass
|
|
if (!ProcessEntry_CheckAll(csEntry, szTheSection, ParsedLine) )
|
|
{
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("101")) == 0)
|
|
{
|
|
// Remove filter
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
// Check for extra flag
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("1")) == 0){iTempFlag = TRUE;}
|
|
|
|
// Remove the filter
|
|
RemoveMetabaseFilter(ParsedLine.szFileName, iTempFlag);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("102")) == 0)
|
|
{
|
|
// Remove bad filters
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
// Check for extra flag
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("1")) == 0){iTempFlag = TRUE;}
|
|
|
|
// Remove the filter
|
|
RemoveIncompatibleMetabaseFilters(ParsedLine.szFileName,iTempFlag);
|
|
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("103")) == 0)
|
|
{
|
|
// Compile mof file
|
|
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
// Remove the filter
|
|
HRESULT hres = MofCompile(ParsedLine.szFileName);
|
|
if (FAILED(hres))
|
|
{
|
|
if (iShowErrorsOnFail){MyMessageBox(NULL, IDS_RUN_PROG_FAILED, ParsedLine.szFileName, hres, MB_OK | MB_SETFOREGROUND);}
|
|
else{iisDebugOut((LOG_TYPE_ERROR, _T("MofCompile(%s). Failed. Err=0x%x.\n"), ParsedLine.szFileName,hres));}
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("104")) == 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
// Make sure we have a value for the entry point..
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
// make sure there is a szData3 or a szData4.
|
|
ifTrueStatementExists = FALSE;
|
|
ifFalseStatementExists = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {ifTrueStatementExists = TRUE;}
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0) {ifFalseStatementExists = TRUE;}
|
|
if (ifTrueStatementExists == FALSE && ifFalseStatementExists == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz104_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
// okay we have either szData3 or szData4
|
|
// Check Entry point exists
|
|
iTempFlag = FALSE;
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("ProcessEntry_If:check for entrypoint [%1!s! (%2!s!)]\n"), ParsedLine.szFileName, ParsedLine.szData1));
|
|
|
|
// check if entry point exists
|
|
DWORD dwReturn = DoesEntryPointExist(ParsedLine.szFileName,ParsedLine.szData1);
|
|
if (ERROR_SUCCESS == dwReturn)
|
|
{
|
|
iTempFlag = TRUE;
|
|
}
|
|
else
|
|
{
|
|
if (ERROR_FILE_NOT_FOUND == dwReturn)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("FileNot found:[%1!s!]\n"), ParsedLine.szFileName));
|
|
}
|
|
}
|
|
|
|
if (iTempFlag == TRUE)
|
|
{
|
|
// the result was true
|
|
// the key exists, so let's do the section...
|
|
if (ifTrueStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData2));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData2);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData2, iTempFlag));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// the result was false
|
|
if (ifFalseStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData3));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData3);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData3, iTempFlag));
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("105")) == 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
// Make sure we have a value for the entry point..
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
// see if we got the extra param
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
// see if we got the extra param to say -- do this for the special group
|
|
INT iTempFlag2 = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0) {iTempFlag2 = TRUE;}
|
|
|
|
|
|
// call function to CreateGroup
|
|
#ifndef _CHICAGO_
|
|
HRESULT hr;
|
|
|
|
if (_tcsicmp(ParsedLine.szData2, _T("1")) == 0)
|
|
{
|
|
// add group
|
|
hr = CreateGroup(ParsedLine.szFileName,ParsedLine.szData1,TRUE, iTempFlag2);
|
|
if (FAILED(hr))
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("CreateGroup:%s,%s.failed.code=0x%x\n"),ParsedLine.szFileName, ParsedLine.szData1,hr));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// remove group
|
|
hr = CreateGroup(ParsedLine.szFileName,ParsedLine.szData1,FALSE, iTempFlag2);
|
|
if (FAILED(hr))
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("DeleteGroup:%s,%s.failed.code=0x%x\n"),ParsedLine.szFileName, ParsedLine.szData1,hr));
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("106")) == 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
// Make sure we have a value for the entry point..
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
// call function to CreateGroup
|
|
DWORD dwPermissions = MD_ACR_ENUM_KEYS;
|
|
dwPermissions = atodw(ParsedLine.szData1);
|
|
#ifndef _CHICAGO_
|
|
iTempFlag = TRUE;
|
|
if (g_pTheApp->m_bUpgradeTypeHasMetabaseFlag)
|
|
{
|
|
if (DoesAdminACLExist(ParsedLine.szFileName) == TRUE)
|
|
{iTempFlag = FALSE;}
|
|
}
|
|
// if this is upgrading from win95, then make sure to write the acl...
|
|
if (g_pTheApp->m_bWin95Migration){iTempFlag = TRUE;}
|
|
if (iTempFlag)
|
|
{
|
|
SetAdminACL_wrap(ParsedLine.szFileName,dwPermissions,TRUE);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("107")) == 0)
|
|
{
|
|
// Run the ftp, upgrade code to move registry stuff to the metabase
|
|
FTP_Upgrade_RegToMetabase(g_pTheApp->m_hInfHandle);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("108")) == 0)
|
|
{
|
|
// Run the w3svc, upgrade code to move registry stuff to the metabase
|
|
WWW_Upgrade_RegToMetabase(g_pTheApp->m_hInfHandle);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("109")) == 0)
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
UpgradeFilters(ParsedLine.szFileName);
|
|
}
|
|
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("110")) == 0)
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
#ifndef _CHICAGO_
|
|
if (_tcsicmp(ParsedLine.szData1, _T("1")) == 0)
|
|
{
|
|
// add
|
|
RegisterAccountToLocalGroup(_T("system"),ParsedLine.szFileName,TRUE);
|
|
RegisterAccountToLocalGroup(_T("service"),ParsedLine.szFileName,TRUE);
|
|
RegisterAccountToLocalGroup(_T("networkservice"),ParsedLine.szFileName,TRUE);
|
|
}
|
|
else
|
|
{
|
|
// remove
|
|
RegisterAccountToLocalGroup(_T("system"),ParsedLine.szFileName,FALSE);
|
|
RegisterAccountToLocalGroup(_T("service"),ParsedLine.szFileName,FALSE);
|
|
RegisterAccountToLocalGroup(_T("networkservice"),ParsedLine.szFileName,FALSE);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("111")) == 0)
|
|
{
|
|
iTempFlag = FALSE;
|
|
DWORD dwAccessMask = 0x0;
|
|
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szData2, _T("")) != 0 )
|
|
{
|
|
// Get access mask if it is available
|
|
dwAccessMask = atodw(ParsedLine.szData2);
|
|
}
|
|
|
|
#ifndef _CHICAGO_
|
|
AddUserToMetabaseACL_Rec(ParsedLine.szFileName,ParsedLine.szData1, dwAccessMask);
|
|
#endif
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("112")) == 0)
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
#ifndef _CHICAGO_
|
|
if (_tcsicmp(ParsedLine.szData2, _T("1")) == 0)
|
|
{
|
|
// add
|
|
RegisterAccountToLocalGroup(ParsedLine.szData1,ParsedLine.szFileName,TRUE);
|
|
}
|
|
else
|
|
{
|
|
// remove
|
|
RegisterAccountToLocalGroup(ParsedLine.szData1,ParsedLine.szFileName,FALSE);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("113")) == 0)
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz104_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
HKEY hRootKeyType = HKEY_LOCAL_MACHINE;
|
|
// check if the registry key exists...
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKLM")) == 0){hRootKeyType = HKEY_LOCAL_MACHINE;}
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKCR")) == 0){hRootKeyType = HKEY_CLASSES_ROOT;}
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKCU")) == 0){hRootKeyType = HKEY_CURRENT_USER;}
|
|
if ( _tcsicmp(ParsedLine.szFileName, _T("HKU")) == 0){hRootKeyType = HKEY_USERS;}
|
|
#ifndef _CHICAGO_
|
|
DWORD dwAccessMask = atodw(ParsedLine.szData3);
|
|
DWORD dwInheritMask = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE;
|
|
SetRegistryKeySecurity(hRootKeyType,ParsedLine.szData1,ParsedLine.szData2,dwAccessMask,dwInheritMask,TRUE,ParsedLine.szData4);
|
|
#endif
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("114")) == 0)
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
// rename the metabase node.
|
|
if (CheckifServiceExist(_T("IISADMIN")) == 0 )
|
|
{
|
|
CMDKey cmdKey;
|
|
cmdKey.OpenNode(ParsedLine.szFileName);
|
|
if ( (METADATA_HANDLE)cmdKey )
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("RenameNode:%s=%s\n"),ParsedLine.szData1,ParsedLine.szData2));
|
|
cmdKey.RenameNode(ParsedLine.szData1, ParsedLine.szData2);
|
|
cmdKey.Close();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("115")) == 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
// make sure there is a szData1 or a szData2
|
|
ifTrueStatementExists = FALSE;
|
|
ifFalseStatementExists = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {ifTrueStatementExists = TRUE;}
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {ifFalseStatementExists = TRUE;}
|
|
if (ifTrueStatementExists == FALSE && ifFalseStatementExists == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
// okay we have either szData1 or szData2
|
|
|
|
// Check if the language specified in the .inf corresponds to
|
|
// our systems language.
|
|
iTempFlag = FALSE;
|
|
|
|
// Get our language
|
|
// set iTempFlag to true if it matches the same language they specified.
|
|
|
|
DWORD dwCodePage = GetACP();
|
|
DWORD dwTheCodePageSpecifiedinINF = 0;
|
|
dwTheCodePageSpecifiedinINF = atodw(ParsedLine.szFileName);
|
|
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("CodePage=0x%x,%d\n"),dwCodePage,dwCodePage));
|
|
|
|
if (dwTheCodePageSpecifiedinINF == dwCodePage)
|
|
{
|
|
iTempFlag = TRUE;
|
|
}
|
|
|
|
if (iTempFlag == TRUE)
|
|
{
|
|
// the result was true
|
|
// the key exists, so let's do the section...
|
|
if (ifTrueStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData1));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData1);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData1, iTempFlag));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// the result was false
|
|
if (ifFalseStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData2));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData2);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData2, iTempFlag));
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("116")) == 0)
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("CreateDummyMetabaseBin\n")));
|
|
CreateDummyMetabaseBin();
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("117")) == 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
// make sure there is a szData1 or a szData2
|
|
ifTrueStatementExists = FALSE;
|
|
ifFalseStatementExists = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {ifTrueStatementExists = TRUE;}
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {ifFalseStatementExists = TRUE;}
|
|
if (ifTrueStatementExists == FALSE && ifFalseStatementExists == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
// okay we have either szData1 or szData2
|
|
iTempFlag = CheckForWriteAccess(ParsedLine.szFileName);
|
|
|
|
if (iTempFlag == TRUE)
|
|
{
|
|
// the result was true
|
|
// the key exists, so let's do the section...
|
|
if (ifTrueStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData1));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData1);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData1, iTempFlag));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// the result was false
|
|
if (ifFalseStatementExists)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:Start.\n"), ParsedLine.szData2));
|
|
iTempFlag = ProcessSection(g_pTheApp->m_hInfHandle,ParsedLine.szData2);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Calling ProcessSection:%1!s!:End.return=%2!d!\n"), ParsedLine.szData2, iTempFlag));
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("118")) == 0)
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
#ifndef _CHICAGO_
|
|
|
|
if (_tcsicmp(ParsedLine.szData4, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz104_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_Misc3_Exit;
|
|
}
|
|
|
|
if ( _ttoi(ParsedLine.szData4) == 1 )
|
|
{
|
|
RemovePrincipalFromFileAcl(ParsedLine.szFileName,ParsedLine.szData1);
|
|
}
|
|
else
|
|
{
|
|
// don't remove any iheritance, keep all inheritance
|
|
BOOL DontInheritFromParentAndOverWriteAccess = FALSE;
|
|
DWORD dwInheritMask = 0;
|
|
INT iAceType = ACCESS_ALLOWED_ACE_TYPE;
|
|
DWORD dwAccessMask = atodw(ParsedLine.szData2);
|
|
|
|
// see if the "special" parameter was passed in...
|
|
// we had to use szData4 since we don't have a szData5 :-(
|
|
if ( _ttoi(ParsedLine.szData4) == 2 )
|
|
{
|
|
DontInheritFromParentAndOverWriteAccess = TRUE;
|
|
dwInheritMask = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE;
|
|
}
|
|
else
|
|
{
|
|
DontInheritFromParentAndOverWriteAccess = FALSE;
|
|
//dwInheritMask = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE | INHERITED_ACE;
|
|
dwInheritMask = 0;
|
|
}
|
|
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0)
|
|
{
|
|
iAceType = _ttoi(ParsedLine.szData3);
|
|
}
|
|
|
|
SetDirectorySecurity(ParsedLine.szFileName,ParsedLine.szData1,iAceType,dwAccessMask,dwInheritMask,DontInheritFromParentAndOverWriteAccess);
|
|
}
|
|
|
|
#endif
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("119")) == 0)
|
|
{
|
|
SetDIRIDforThisInf(g_pTheApp->m_hInfHandle,FALSE);
|
|
}
|
|
|
|
// We called the function, so return true.
|
|
iReturn = TRUE;
|
|
|
|
ProcessEntry_Misc3_Exit:
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
int ProcessEntry_other(IN CString csEntry,IN LPCTSTR szTheSection,ThingToDo ParsedLine)
|
|
{
|
|
int iReturn = FALSE;
|
|
int iTempFlag = FALSE;
|
|
int iProgressBarUpdated = FALSE;
|
|
int iShowErrorsOnFail = TRUE;
|
|
|
|
TCHAR szDirBefore[_MAX_PATH];
|
|
_tcscpy(szDirBefore, _T(""));
|
|
|
|
// Get the type.
|
|
if ( _tcsicmp(ParsedLine.szType, _T("19")) != 0 && _tcsicmp(ParsedLine.szType, _T("20")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("21")) != 0 && _tcsicmp(ParsedLine.szType, _T("22")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("23")) != 0 && _tcsicmp(ParsedLine.szType, _T("24")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("25")) != 0 && _tcsicmp(ParsedLine.szType, _T("26")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("27")) != 0 && _tcsicmp(ParsedLine.szType, _T("28")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("29")) != 0 && _tcsicmp(ParsedLine.szType, _T("30")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("31")) != 0 && _tcsicmp(ParsedLine.szType, _T("32")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("33")) != 0 && _tcsicmp(ParsedLine.szType, _T("34")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("35")) != 0 && _tcsicmp(ParsedLine.szType, _T("36")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("37")) != 0 && _tcsicmp(ParsedLine.szType, _T("38")) != 0 &&
|
|
_tcsicmp(ParsedLine.szType, _T("120"))
|
|
)
|
|
{
|
|
goto ProcessEntry_other_Exit;
|
|
}
|
|
|
|
// Check if there is other criteria we need to pass
|
|
if (!ProcessEntry_CheckAll(csEntry, szTheSection, ParsedLine) )
|
|
{
|
|
goto ProcessEntry_other_Exit;
|
|
}
|
|
|
|
if (_tcsicmp(ParsedLine.szType, _T("28")) != 0)
|
|
{
|
|
if (_tcsicmp(ParsedLine.szType, _T("37")) != 0)
|
|
{
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_other_Exit;
|
|
}
|
|
}
|
|
}
|
|
|
|
iShowErrorsOnFail = TRUE;
|
|
if (_tcsicmp(ParsedLine.szDoNotDisplayErrIfFunctionFailed, _T("1")) == 0)
|
|
{iShowErrorsOnFail = FALSE;}
|
|
|
|
if (_tcsicmp(ParsedLine.szProgressTitle, _T("")) != 0)
|
|
{
|
|
ProgressBarTextStack_Set(ParsedLine.szProgressTitle);
|
|
iProgressBarUpdated = TRUE;
|
|
}
|
|
|
|
// Check if we need to change to a specific dir first...
|
|
if (ParsedLine.szChangeDir)
|
|
{
|
|
if (IsFileExist(ParsedLine.szChangeDir))
|
|
{
|
|
// save the current dir
|
|
GetCurrentDirectory( _MAX_PATH, szDirBefore);
|
|
// change to this dir
|
|
SetCurrentDirectory(ParsedLine.szChangeDir);
|
|
}
|
|
}
|
|
|
|
// check if we need to ask the user if they want to call it for sure.
|
|
if (!ProcessEntry_AskFirst(ParsedLine, 1))
|
|
{
|
|
goto ProcessEntry_other_Exit;
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("19")) == 0)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("MyAddGroup:%1!s!\n"),ParsedLine.szFileName));
|
|
MyAddGroup(ParsedLine.szFileName);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("20")) == 0)
|
|
{
|
|
if ( _tcsicmp(ParsedLine.szData1, _T("1")) == 0)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("MyDeleteGroup:%1!s!. even if not empty.\n"),ParsedLine.szFileName));
|
|
MyDeleteGroup(ParsedLine.szFileName);
|
|
}
|
|
else
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("MyDeleteGroup:%1!s!. only if empty.\n"),ParsedLine.szFileName));
|
|
if (MyIsGroupEmpty(ParsedLine.szFileName)) {MyDeleteGroup(ParsedLine.szFileName);}
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("21")) == 0)
|
|
{
|
|
|
|
//MyAddItem(csGroupName, csAppName, csProgram, NULL, NULL);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("MyAddItem:Type=%1!s!,%2!s!,%3!s!,%4!s!,%5!s!\n"),ParsedLine.szFileName, ParsedLine.szData1, ParsedLine.szData2, ParsedLine.szData3, ParsedLine.szData4));
|
|
if ( _tcsicmp(ParsedLine.szData3, _T("")) == 0 && _tcsicmp(ParsedLine.szData4, _T("")) == 0)
|
|
{
|
|
MyAddItem(ParsedLine.szFileName, ParsedLine.szData1, ParsedLine.szData2, NULL, NULL, NULL);
|
|
}
|
|
else
|
|
{
|
|
// if ParsedLine.szData4 is a directory, then
|
|
// the start in dir should be used there.
|
|
|
|
// if ParsedLine.szData4 is a filename, then
|
|
// the start in dir should be used there.
|
|
// and you ought to use the filename specified for the icon
|
|
if (IsFileExist(ParsedLine.szData4))
|
|
{
|
|
DWORD retCode = GetFileAttributes(ParsedLine.szData4);
|
|
|
|
if (retCode & FILE_ATTRIBUTE_DIRECTORY)
|
|
{
|
|
// It is a directory, so pass in only the directory information
|
|
MyAddItem(ParsedLine.szFileName, ParsedLine.szData1, ParsedLine.szData2, ParsedLine.szData3, ParsedLine.szData4, NULL);
|
|
}
|
|
else
|
|
{
|
|
// it is a file so get the directory and pass in the filename as well.
|
|
TCHAR szDirOnly[_MAX_PATH];
|
|
TCHAR szDirOnly2[_MAX_PATH];
|
|
_tcscpy(szDirOnly, _T(""));
|
|
_tcscpy(szDirOnly2, _T(""));
|
|
InetGetFilePath(ParsedLine.szData4, szDirOnly);
|
|
|
|
// change e:\winnt\system32 to %systemroot%\system32 if we need to.
|
|
ReverseExpandEnvironmentStrings(szDirOnly, szDirOnly2);
|
|
|
|
MyAddItem(ParsedLine.szFileName, ParsedLine.szData1, ParsedLine.szData2, ParsedLine.szData3, szDirOnly2, ParsedLine.szData4);
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
MyAddItem(ParsedLine.szFileName, ParsedLine.szData1, ParsedLine.szData2, NULL, NULL, NULL);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("22")) == 0)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("MyDeleteItem:%1!s!,%2!s!\n"),ParsedLine.szFileName, ParsedLine.szData1));
|
|
MyDeleteItem(ParsedLine.szFileName, ParsedLine.szData1);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("23")) == 0)
|
|
{
|
|
//MyAddDeskTopItem(csAppName, csProgram, NULL, NULL, csProgram, 7);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("MyAddDeskTopItem:Type=%1!s!,%2!s!,%3!s!\n"),ParsedLine.szFileName, ParsedLine.szData1, ParsedLine.szData2));
|
|
if ( _tcsicmp(ParsedLine.szData2, _T("")) == 0)
|
|
{
|
|
// icon number not specified
|
|
MyAddDeskTopItem(ParsedLine.szFileName, ParsedLine.szData1, NULL, NULL, ParsedLine.szData1, 7);
|
|
}
|
|
else
|
|
{
|
|
// icon specified use what they said to use
|
|
int iIconIndex = 7 ;
|
|
if (IsValidNumber((LPCTSTR)ParsedLine.szData2))
|
|
{iIconIndex = _ttoi((LPCTSTR)ParsedLine.szData2);}
|
|
MyAddDeskTopItem(ParsedLine.szFileName, ParsedLine.szData1, NULL, NULL, ParsedLine.szData1, iIconIndex);
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("24")) == 0)
|
|
{
|
|
// Check which version they want....
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0)
|
|
{
|
|
BOOL bDeleteItsDirToo = _ttoi(ParsedLine.szData1);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("MyDeleteDeskTopItem2:%1!s!,%2!d!\n"),ParsedLine.szFileName,bDeleteItsDirToo));
|
|
MyDeleteDeskTopItem2(ParsedLine.szFileName, bDeleteItsDirToo);
|
|
}
|
|
else
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("MyDeleteDeskTopItem:%1!s!\n"),ParsedLine.szFileName));
|
|
MyDeleteDeskTopItem(ParsedLine.szFileName);
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("120")) == 0)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("DeleteFromGroup:%1!s!\n"),ParsedLine.szFileName));
|
|
DeleteFromGroup(ParsedLine.szFileName, ParsedLine.szData1);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("25")) == 0)
|
|
{
|
|
//MyAddSendToItem(csAppName, csProgram, NULL, NULL);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("MyAddSendToItem:Type=%1!s!,%2!s!\n"),ParsedLine.szFileName, ParsedLine.szData1));
|
|
MyAddSendToItem(ParsedLine.szFileName, ParsedLine.szData1, NULL, NULL);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("26")) == 0)
|
|
{
|
|
//MyDeleteSendToItem(csAppName);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("MyDeleteSendToItem:%1!s!\n"),ParsedLine.szFileName));
|
|
MyDeleteSendToItem(ParsedLine.szFileName);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("27")) == 0)
|
|
{
|
|
if (ParsedLine.szFileName)
|
|
{
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0)
|
|
{
|
|
INT iUserWasNewlyCreated = 0;
|
|
//CreateIUSRAccount(g_pTheApp->m_csWWWAnonyName, g_pTheApp->m_csWWWAnonyPassword);
|
|
#ifndef _CHICAGO_
|
|
CreateIUSRAccount( (LPTSTR)(LPCTSTR) ParsedLine.szFileName, (LPTSTR)(LPCTSTR) ParsedLine.szData1,&iUserWasNewlyCreated);
|
|
#endif //_CHICAGO_
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("28")) == 0)
|
|
{
|
|
if (ParsedLine.szFileName)
|
|
{
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0)
|
|
{
|
|
#ifndef _CHICAGO_
|
|
int iUserWasDeleted = 0;
|
|
DeleteGuestUser( (LPTSTR)(LPCTSTR) ParsedLine.szFileName,&iUserWasDeleted);
|
|
// if the user was deleted, then remove it
|
|
// from the uninstall list!
|
|
if (1 == iUserWasDeleted)
|
|
{
|
|
g_pTheApp->UnInstallList_DelData(ParsedLine.szFileName);
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
|
|
// move location of directory recursive
|
|
if ( _tcsicmp(ParsedLine.szType, _T("29")) == 0)
|
|
{
|
|
if (ParsedLine.szFileName && _tcsicmp(ParsedLine.szFileName, _T("")) != 0)
|
|
{
|
|
// Check if the from directory even exist...
|
|
// see if the file exists
|
|
if (IsFileExist(ParsedLine.szFileName))
|
|
{
|
|
if (ParsedLine.szData1 && _tcsicmp(ParsedLine.szData1, _T("")) != 0)
|
|
{
|
|
if (TRUE == MoveFileEx( ParsedLine.szFileName, ParsedLine.szData1, MOVEFILE_COPY_ALLOWED|MOVEFILE_WRITE_THROUGH ))
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("MoveFileEx:%1!s! to %2!s!. success.\n"),ParsedLine.szFileName, ParsedLine.szData1));
|
|
}
|
|
else
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("MoveFileEx:%1!s! to %2!s!. failed.\n"),ParsedLine.szFileName, ParsedLine.szData1));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("30")) == 0)
|
|
{
|
|
if (ParsedLine.szFileName && _tcsicmp(ParsedLine.szFileName, _T("")) != 0)
|
|
{
|
|
BOOL b;
|
|
BOOL bInstalled = FALSE;
|
|
CString csFile;
|
|
|
|
b = AddFontResource(ParsedLine.szFileName);
|
|
if (!b)
|
|
{
|
|
csFile = g_pTheApp->m_csWinDir + _T("\\Fonts\\");
|
|
csFile += ParsedLine.szFileName;
|
|
b = AddFontResource((LPCTSTR)csFile);
|
|
if (!b)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, _T("AddFontResource:FAILED:, csFile=%s, err=0x%x,\n"), csFile, GetLastError()));
|
|
}
|
|
}
|
|
|
|
if (b)
|
|
{
|
|
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("31")) == 0)
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_other_Exit;
|
|
}
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_other_Exit;
|
|
}
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_other_Exit;
|
|
}
|
|
|
|
AddURLShortcutItem( ParsedLine.szFileName, ParsedLine.szData1, ParsedLine.szData2);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("32")) == 0)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("MyAddItem:Type=%1!s!,%2!s!,%3!s!\n"),ParsedLine.szFileName, ParsedLine.szData1, ParsedLine.szData2));
|
|
MyAddItemInfoTip(ParsedLine.szFileName, ParsedLine.szData1, ParsedLine.szData2);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("33")) == 0)
|
|
{
|
|
CString strUseThisFileName;
|
|
int iShowErrorsOnFail = TRUE;
|
|
if (_tcsicmp(ParsedLine.szDoNotDisplayErrIfFunctionFailed, _T("1")) == 0)
|
|
{iShowErrorsOnFail = FALSE;}
|
|
|
|
// the user can specify a filename or
|
|
// they can specify a registry location to get the filename from
|
|
// if the registry location is not there then use the filename.
|
|
|
|
// make sure we have a filename entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_other_Exit;
|
|
}
|
|
|
|
strUseThisFileName = ParsedLine.szFileName;
|
|
|
|
// if we have a valid registry entry then use that.
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0)
|
|
{
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0)
|
|
{
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0)
|
|
{
|
|
// try to get the filename stored there.
|
|
HKEY hRootKeyType = HKEY_LOCAL_MACHINE;
|
|
// check if the registry key exists...
|
|
if ( _tcsicmp(ParsedLine.szData1, _T("HKLM")) == 0){hRootKeyType = HKEY_LOCAL_MACHINE;}
|
|
if ( _tcsicmp(ParsedLine.szData1, _T("HKCR")) == 0){hRootKeyType = HKEY_CLASSES_ROOT;}
|
|
if ( _tcsicmp(ParsedLine.szData1, _T("HKCU")) == 0){hRootKeyType = HKEY_CURRENT_USER;}
|
|
if ( _tcsicmp(ParsedLine.szData1, _T("HKU")) == 0){hRootKeyType = HKEY_USERS;}
|
|
|
|
iTempFlag = FALSE;
|
|
CRegKey regTheKey(hRootKeyType, ParsedLine.szData2,KEY_READ);
|
|
CString strReturnQueryValue;
|
|
if ((HKEY) regTheKey)
|
|
{
|
|
if (ERROR_SUCCESS == regTheKey.QueryValue(ParsedLine.szData3, strReturnQueryValue))
|
|
{
|
|
strUseThisFileName = strReturnQueryValue;
|
|
iTempFlag = TRUE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// check if the the filename we want to use
|
|
// needs to get expanded "%windir%\myfile" or something.
|
|
if (-1 != strUseThisFileName.Find(_T('%')) )
|
|
{
|
|
// there is a '%' in the string
|
|
TCHAR szTempDir[_MAX_PATH];
|
|
_tcscpy(szTempDir, strUseThisFileName);
|
|
if (ExpandEnvironmentStrings( (LPCTSTR)strUseThisFileName, szTempDir, sizeof(szTempDir)/sizeof(TCHAR)))
|
|
{
|
|
strUseThisFileName = szTempDir;
|
|
}
|
|
}
|
|
|
|
if (TRUE == iTempFlag)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("CreateAnEmptyFile:%1!s!. From Registry location.\n"),strUseThisFileName));
|
|
}
|
|
else
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("CreateAnEmptyFile:%1!s!\n"),strUseThisFileName));
|
|
}
|
|
|
|
if (TRUE != CreateAnEmptyFile(strUseThisFileName))
|
|
{
|
|
if (iShowErrorsOnFail){MyMessageBox(NULL, IDS_RUN_PROG_FAILED, strUseThisFileName, GetLastError(), MB_OK | MB_SETFOREGROUND);}
|
|
else{iisDebugOut((LOG_TYPE_TRACE, _T("CreateAnEmptyFile(%s). Failed. Err=0x%x.\n"), strUseThisFileName, GetLastError() ));}
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("34")) == 0)
|
|
{
|
|
CString strUseThisFileName;
|
|
TCHAR szUseThisFileName[_MAX_PATH];
|
|
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_other_Exit;
|
|
}
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_other_Exit;
|
|
}
|
|
|
|
strUseThisFileName = ParsedLine.szFileName;
|
|
|
|
// if we have a valid registry entry then use that.
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0)
|
|
{
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0)
|
|
{
|
|
if (_tcsicmp(ParsedLine.szData4, _T("")) != 0)
|
|
{
|
|
// try to get the filename stored there.
|
|
HKEY hRootKeyType = HKEY_LOCAL_MACHINE;
|
|
// check if the registry key exists...
|
|
if ( _tcsicmp(ParsedLine.szData2, _T("HKLM")) == 0){hRootKeyType = HKEY_LOCAL_MACHINE;}
|
|
if ( _tcsicmp(ParsedLine.szData2, _T("HKCR")) == 0){hRootKeyType = HKEY_CLASSES_ROOT;}
|
|
if ( _tcsicmp(ParsedLine.szData2, _T("HKCU")) == 0){hRootKeyType = HKEY_CURRENT_USER;}
|
|
if ( _tcsicmp(ParsedLine.szData2, _T("HKU")) == 0){hRootKeyType = HKEY_USERS;}
|
|
|
|
iTempFlag = FALSE;
|
|
CRegKey regTheKey(hRootKeyType, ParsedLine.szData3, KEY_READ);
|
|
CString strReturnQueryValue;
|
|
if ((HKEY) regTheKey)
|
|
{
|
|
if (ERROR_SUCCESS == regTheKey.QueryValue(ParsedLine.szData4, strReturnQueryValue))
|
|
{
|
|
strUseThisFileName = strReturnQueryValue;
|
|
iTempFlag = TRUE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// check if the the filename we want to use
|
|
// needs to get expanded "%windir%\myfile" or something.
|
|
if (-1 != strUseThisFileName.Find(_T('%')) )
|
|
{
|
|
// there is a '%' in the string
|
|
TCHAR szTempDir[_MAX_PATH];
|
|
_tcscpy(szTempDir, strUseThisFileName);
|
|
if (ExpandEnvironmentStrings( (LPCTSTR)strUseThisFileName, szTempDir, sizeof(szTempDir)/sizeof(TCHAR)))
|
|
{
|
|
strUseThisFileName = szTempDir;
|
|
}
|
|
}
|
|
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("GrantUserAccessToFile:%1!s!,%2!s!\n"),strUseThisFileName, ParsedLine.szData1));
|
|
_tcscpy(szUseThisFileName, strUseThisFileName);
|
|
GrantUserAccessToFile(szUseThisFileName, ParsedLine.szData1);
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("35")) == 0)
|
|
{
|
|
DWORD dwID = 0;
|
|
DWORD dwAttrib = 0;
|
|
DWORD dwUserType = 0;
|
|
DWORD dwTheData = 0;
|
|
INT iOverwriteFlag = FALSE;
|
|
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz101_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_other_Exit;
|
|
}
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_other_Exit;
|
|
}
|
|
|
|
// make sure we have a szData2 entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz103_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_other_Exit;
|
|
}
|
|
|
|
// make sure we have a szData3 entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData3, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz104_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_other_Exit;
|
|
}
|
|
|
|
dwID = atodw(ParsedLine.szData1);
|
|
dwAttrib = METADATA_INHERIT;
|
|
dwUserType = atodw(ParsedLine.szData2);
|
|
dwTheData = atodw(ParsedLine.szData3);
|
|
|
|
iOverwriteFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData4, _T("1")) == 0)
|
|
{iOverwriteFlag = TRUE;}
|
|
|
|
if (CheckifServiceExist(_T("IISADMIN")) == 0 )
|
|
{
|
|
WriteToMD_DwordEntry(ParsedLine.szFileName, dwID, dwAttrib, dwUserType, dwTheData, iOverwriteFlag);
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("36")) == 0)
|
|
{
|
|
// Functionality removed because no longer used
|
|
iisDebugOut((LOG_TYPE_ERROR, _T("1==36 is no longer supported") ));
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("37")) == 0)
|
|
{
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szFileName, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == TRUE)
|
|
{
|
|
int MyLogErrorType = LOG_TYPE_TRACE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("0")) == 0)
|
|
{MyLogErrorType = LOG_TYPE_ERROR;}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("1")) == 0)
|
|
{MyLogErrorType = LOG_TYPE_WARN;}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("2")) == 0)
|
|
{MyLogErrorType = LOG_TYPE_PROGRAM_FLOW;}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("3")) == 0)
|
|
{MyLogErrorType = LOG_TYPE_TRACE;}
|
|
if (_tcsicmp(ParsedLine.szData1, _T("4")) == 0)
|
|
{MyLogErrorType = LOG_TYPE_TRACE_WIN32_API;}
|
|
iisDebugOut((MyLogErrorType, _T("%s"), ParsedLine.szFileName));
|
|
}
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("38")) == 0)
|
|
{
|
|
BOOL bOK = FALSE;
|
|
BOOL bDeleteOld = FALSE;
|
|
BOOL bOverWriteToFile = FALSE;
|
|
|
|
// make sure we have a szData1 entry
|
|
iTempFlag = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData1, _T("")) != 0) {iTempFlag = TRUE;}
|
|
if (iTempFlag == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, (TCHAR *) csz102_NOT_SPECIFIED, _T(".."), csEntry, szTheSection));
|
|
goto ProcessEntry_other_Exit;
|
|
}
|
|
|
|
bDeleteOld = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData2, _T("1")) == 0) {bDeleteOld = TRUE;}
|
|
bOverWriteToFile = FALSE;
|
|
if (_tcsicmp(ParsedLine.szData3, _T("1")) == 0) {bOverWriteToFile = TRUE;}
|
|
|
|
if (IsFileExist(ParsedLine.szFileName))
|
|
{
|
|
//Save file attributes so they can be restored after we are done.
|
|
DWORD dwSourceAttrib = GetFileAttributes(ParsedLine.szFileName);
|
|
|
|
//Now set the file attributes to normal to ensure file ops succeed.
|
|
SetFileAttributes(ParsedLine.szFileName, FILE_ATTRIBUTE_NORMAL);
|
|
|
|
//from=ParsedLine.szFileName
|
|
//to=ParsedLine.szData1
|
|
// check if the 'to' filename exists.
|
|
if (!IsFileExist(ParsedLine.szData1))
|
|
{
|
|
// go ahead and try to copy it over
|
|
bOK = CopyFile(ParsedLine.szFileName, ParsedLine.szData1, FALSE);
|
|
if (bOK)
|
|
{
|
|
SetFileAttributes(ParsedLine.szData1, dwSourceAttrib);
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("%1!s! copied to %2!s!.\n"), ParsedLine.szFileName, ParsedLine.szData1));
|
|
// the file was copied. let's delete it now.
|
|
if (bDeleteOld)
|
|
{
|
|
if(!DeleteFile(ParsedLine.szFileName))
|
|
{
|
|
MoveFileEx(ParsedLine.szFileName, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// set this files attribs back to what it was
|
|
SetFileAttributes(ParsedLine.szFileName, dwSourceAttrib);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// we were unable to copy the file over!
|
|
// don't delete the old one.
|
|
iisDebugOutSafeParams((LOG_TYPE_WARN, _T("unabled to copy %1!s! to %2!s!.\n"), ParsedLine.szFileName, ParsedLine.szData1));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// the 'to' file exists, shall we overwrite it?
|
|
if (bOverWriteToFile)
|
|
{
|
|
if(DeleteFile(ParsedLine.szData1))
|
|
{
|
|
bOK = FALSE;
|
|
bOK = CopyFile(ParsedLine.szFileName, ParsedLine.szData1, FALSE);
|
|
if (bOK)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("%1!s! copied to %2!s!.\n"), ParsedLine.szFileName, ParsedLine.szData1));
|
|
// the file was copied. let's delete it now.
|
|
if (bDeleteOld)
|
|
{
|
|
if(!DeleteFile(ParsedLine.szFileName))
|
|
{
|
|
MoveFileEx(ParsedLine.szFileName, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// set this files attribs back to what it was
|
|
SetFileAttributes(ParsedLine.szFileName, dwSourceAttrib);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_WARN, _T("unabled to copy %1!s! to %2!s!.\n"), ParsedLine.szFileName, ParsedLine.szData1));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_WARN, _T("unabled to copy %1!s! to %2!s!. file#2 cannot be deleted.\n"), ParsedLine.szFileName, ParsedLine.szData1));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_WARN, _T("unabled to copy %1!s! to %2!s!. file#2 already exists.\n"), ParsedLine.szFileName, ParsedLine.szData1));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// We called the function, so return true.
|
|
iReturn = TRUE;
|
|
|
|
// change back to the original dir
|
|
if (ParsedLine.szChangeDir){if (szDirBefore){SetCurrentDirectory(szDirBefore);}}
|
|
|
|
ProcessEntry_AskLast(ParsedLine, 1);
|
|
|
|
ProcessEntry_other_Exit:
|
|
if (TRUE == iProgressBarUpdated){ProgressBarTextStack_Pop();}
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
int ProcessEntry_Entry(IN HINF hFile, IN LPCTSTR szTheSection, IN CString csOneParseableLine)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("ProcessEntry_Entry:%1!s!, %2!s!\n"),szTheSection, csOneParseableLine));
|
|
int iReturn = FALSE;
|
|
int iReturnTemp = FALSE;
|
|
int iTempFlag = FALSE;
|
|
|
|
ThingToDo ParsedLine;
|
|
|
|
_tcscpy(ParsedLine.szType, _T(""));
|
|
_tcscpy(ParsedLine.szFileName, _T(""));
|
|
_tcscpy(ParsedLine.szData1, _T(""));
|
|
_tcscpy(ParsedLine.szData2, _T(""));
|
|
_tcscpy(ParsedLine.szData3, _T(""));
|
|
_tcscpy(ParsedLine.szData4, _T(""));
|
|
_tcscpy(ParsedLine.szChangeDir, _T(""));
|
|
|
|
_tcscpy(ParsedLine.szOS, _T(""));
|
|
_tcscpy(ParsedLine.szPlatformArchitecture, _T(""));
|
|
_tcscpy(ParsedLine.szEnterprise, _T(""));
|
|
_tcscpy(ParsedLine.szErrIfFileNotFound, _T(""));
|
|
_tcscpy(ParsedLine.szMsgBoxBefore, _T(""));
|
|
_tcscpy(ParsedLine.szMsgBoxAfter, _T(""));
|
|
_tcscpy(ParsedLine.szDoNotDisplayErrIfFunctionFailed, _T(""));
|
|
_tcscpy(ParsedLine.szProgressTitle, _T(""));
|
|
|
|
// parse the line and put into another big cstring list
|
|
CStringList strListOrderImportant;
|
|
//
|
|
// Parse the long string and put into another list
|
|
//
|
|
LPTSTR lpBuffer = NULL;
|
|
lpBuffer = (LPTSTR) LocalAlloc(LPTR, (csOneParseableLine.GetLength() + 1) * sizeof(TCHAR) );
|
|
if ( !lpBuffer )
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, _T("ProcessEntry_Entry:Failed to allocate memory.")));
|
|
return iReturn;
|
|
}
|
|
|
|
_tcscpy(lpBuffer, csOneParseableLine);
|
|
TCHAR *token = NULL;
|
|
token = _tcstok(lpBuffer, _T("|"));
|
|
while (token != NULL)
|
|
{
|
|
strListOrderImportant.AddTail(token);
|
|
token = _tcstok(NULL, _T("|"));
|
|
}
|
|
|
|
// Loop thru the new list and set variables
|
|
int i = 0;
|
|
int iFoundMatch = FALSE;
|
|
POSITION pos = NULL;
|
|
CString csEntry;
|
|
int iEntryLen = 0;
|
|
|
|
pos = strListOrderImportant.GetHeadPosition();
|
|
while (pos)
|
|
{
|
|
iFoundMatch = FALSE;
|
|
csEntry = strListOrderImportant.GetAt(pos);
|
|
iEntryLen=(csEntry.GetLength() + 1) * sizeof(TCHAR);
|
|
|
|
// Look for "100:"
|
|
// 100=Type (1=DllFunction,2=DllFunctionInitOle, 2=Executable, 3=RunThisExe, 4=DoSection, 5=DoINFSection)
|
|
if (csEntry.Left(4) == ThingToDoNumType_100 && iFoundMatch != TRUE)
|
|
{
|
|
csEntry = csEntry.Right( csEntry.GetLength() - 4);
|
|
if (iEntryLen <= sizeof(ParsedLine.szType)) {_tcscpy(ParsedLine.szType, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, (TCHAR *) PARSE_ERROR_ENTRY_TO_BIG,ThingToDoNumType_100,csEntry));}
|
|
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
// 101=File
|
|
if (csEntry.Left(4) == ThingToDoNumType_101 && iFoundMatch != TRUE)
|
|
{
|
|
csEntry = csEntry.Right( csEntry.GetLength() - 4);
|
|
if (iEntryLen <= sizeof(ParsedLine.szFileName)) {_tcscpy(ParsedLine.szFileName, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, (TCHAR *) PARSE_ERROR_ENTRY_TO_BIG,ThingToDoNumType_101, csEntry));}
|
|
if (-1 != csEntry.Find(_T('<')) )
|
|
{
|
|
// there is a < in the string
|
|
int iWhere = 0;
|
|
CString csValue2;
|
|
csEntry.MakeUpper();
|
|
if (csEntry.Find(_T("<SYSTEMROOT>")) != (-1) )
|
|
{
|
|
// We Found the cheesy <SYSTEMROOT> deal. Now replace it with the real SYSTEMROOT
|
|
iWhere = csEntry.Find(_T("<SYSTEMROOT>"));
|
|
iWhere = iWhere + _tcslen(_T("<SYSTEMROOT>"));
|
|
csValue2 = g_pTheApp->m_csWinDir + csEntry.Right( csEntry.GetLength() - (iWhere) );
|
|
csEntry = csValue2;
|
|
if (iEntryLen <= sizeof(ParsedLine.szFileName)) {_tcscpy(ParsedLine.szFileName, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, _T("ProcessEntry_Entry:ParseError:%s.1:%1!s! -- entry to big\n"),ThingToDoNumType_101,csEntry));}
|
|
}
|
|
|
|
if (csEntry.Find(_T("<SYSTEMDRIVE>")) != (-1) )
|
|
{
|
|
// We Found the cheesy <SYSTEMDRIVE> deal. Now replace it with the real systemdrive
|
|
iWhere = csEntry.Find(_T("<SYSTEMDRIVE>"));
|
|
iWhere = iWhere + _tcslen(_T("<SYSTEMDRIVE>"));
|
|
csValue2 = g_pTheApp->m_csSysDrive + csEntry.Right( csEntry.GetLength() - (iWhere) );
|
|
csEntry = csValue2;
|
|
if (iEntryLen <= sizeof(ParsedLine.szFileName)) {_tcscpy(ParsedLine.szFileName, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, (TCHAR *) PARSE_ERROR_ENTRY_TO_BIG,ThingToDoNumType_101,csEntry));}
|
|
}
|
|
}
|
|
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
// ThingToDoNumType_102=szData1
|
|
if (csEntry.Left(4) == ThingToDoNumType_102 && iFoundMatch != TRUE)
|
|
{
|
|
csEntry = csEntry.Right( csEntry.GetLength() - 4);
|
|
if (iEntryLen <= sizeof(ParsedLine.szData1)) {_tcscpy(ParsedLine.szData1, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, (TCHAR *) PARSE_ERROR_ENTRY_TO_BIG,ThingToDoNumType_102,csEntry));}
|
|
iFoundMatch = TRUE;
|
|
if (-1 != csEntry.Find(_T('<')) )
|
|
{
|
|
// there is a < in the string
|
|
int iWhere = 0;
|
|
CString csValue2;
|
|
csEntry.MakeUpper();
|
|
if (csEntry.Find(_T("<SYSTEMROOT>")) != (-1) )
|
|
{
|
|
// We Found the cheesy <SYSTEMROOT> deal. Now replace it with the real SYSTEMROOT
|
|
iWhere = csEntry.Find(_T("<SYSTEMROOT>"));
|
|
iWhere = iWhere + _tcslen(_T("<SYSTEMROOT>"));
|
|
csValue2 = g_pTheApp->m_csWinDir + csEntry.Right( csEntry.GetLength() - (iWhere) );
|
|
csEntry = csValue2;
|
|
if (iEntryLen <= sizeof(ParsedLine.szData1)) {_tcscpy(ParsedLine.szData1, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, _T("ProcessEntry_Entry:ParseError:%s.1:%1!s! -- entry to big\n"),ThingToDoNumType_102, csEntry));}
|
|
}
|
|
|
|
if (csEntry.Find(_T("<SYSTEMDRIVE>")) != (-1) )
|
|
{
|
|
// We Found the cheesy <SYSTEMDRIVE> deal. Now replace it with the real SYSTEMROOT
|
|
iWhere = csEntry.Find(_T("<SYSTEMDRIVE>"));
|
|
iWhere = iWhere + _tcslen(_T("<SYSTEMDRIVE>"));
|
|
csValue2 = g_pTheApp->m_csSysDrive + csEntry.Right( csEntry.GetLength() - (iWhere) );
|
|
csEntry = csValue2;
|
|
if (iEntryLen <= sizeof(ParsedLine.szData1)) {_tcscpy(ParsedLine.szData1, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, (TCHAR *) PARSE_ERROR_ENTRY_TO_BIG,ThingToDoNumType_102,csEntry));}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// ThingToDoNumType_103=szData2
|
|
if (csEntry.Left(4) == ThingToDoNumType_103 && iFoundMatch != TRUE)
|
|
{
|
|
csEntry = csEntry.Right( csEntry.GetLength() - 4);
|
|
if (iEntryLen <= sizeof(ParsedLine.szData2)) {_tcscpy(ParsedLine.szData2, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, (TCHAR *) PARSE_ERROR_ENTRY_TO_BIG,ThingToDoNumType_103,csEntry));}
|
|
iFoundMatch = TRUE;
|
|
}
|
|
// ThingToDoNumType_104=szData3
|
|
if (csEntry.Left(4) == ThingToDoNumType_104 && iFoundMatch != TRUE)
|
|
{
|
|
csEntry = csEntry.Right( csEntry.GetLength() - 4);
|
|
if (iEntryLen <= sizeof(ParsedLine.szData3)) {_tcscpy(ParsedLine.szData3, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, (TCHAR *) PARSE_ERROR_ENTRY_TO_BIG,ThingToDoNumType_104,csEntry));}
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
// ThingToDoNumType_105=szData4
|
|
if (csEntry.Left(4) == ThingToDoNumType_105 && iFoundMatch != TRUE)
|
|
{
|
|
csEntry = csEntry.Right( csEntry.GetLength() - 4);
|
|
if (iEntryLen <= sizeof(ParsedLine.szData4)) {_tcscpy(ParsedLine.szData4, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, (TCHAR *) PARSE_ERROR_ENTRY_TO_BIG,ThingToDoNumType_105,csEntry));}
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
|
|
|
|
// 200=ChangeToThisDirFirst
|
|
if (csEntry.Left(4) == ThingToDoNumType_200 && iFoundMatch != TRUE)
|
|
{
|
|
csEntry = csEntry.Right( csEntry.GetLength() - 4);
|
|
if (iEntryLen <= sizeof(ParsedLine.szChangeDir)) {_tcscpy(ParsedLine.szChangeDir, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, (TCHAR *) PARSE_ERROR_ENTRY_TO_BIG,ThingToDoNumType_200,csEntry));}
|
|
iFoundMatch = TRUE;
|
|
|
|
if (-1 != csEntry.Find(_T('<')) )
|
|
{
|
|
// there is a < in the string
|
|
int iWhere = 0;
|
|
CString csValue2;
|
|
csEntry.MakeUpper();
|
|
if (csEntry.Find(_T("<SYSTEMROOT>")) != (-1) )
|
|
{
|
|
// We Found the cheesy <SYSTEMROOT> deal. Now replace it with the real SYSTEMROOT
|
|
iWhere = csEntry.Find(_T("<SYSTEMROOT>"));
|
|
iWhere = iWhere + _tcslen(_T("<SYSTEMROOT>"));
|
|
csValue2 = g_pTheApp->m_csWinDir + csEntry.Right( csEntry.GetLength() - (iWhere) );
|
|
csEntry = csValue2;
|
|
if (iEntryLen <= sizeof(ParsedLine.szChangeDir)) {_tcscpy(ParsedLine.szChangeDir, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, _T("ProcessEntry_Entry:ParseError:%s.1:%1!s! -- entry to big\n"),ThingToDoNumType_200,csEntry));}
|
|
}
|
|
|
|
if (csEntry.Find(_T("<SYSTEMDRIVE>")) != (-1) )
|
|
{
|
|
// We Found the cheesy <SYSTEMDRIVE> deal. Now replace it with the real SYSTEMROOT
|
|
iWhere = csEntry.Find(_T("<SYSTEMDRIVE>"));
|
|
iWhere = iWhere + _tcslen(_T("<SYSTEMDRIVE>"));
|
|
csValue2 = g_pTheApp->m_csSysDrive + csEntry.Right( csEntry.GetLength() - (iWhere) );
|
|
csEntry = csValue2;
|
|
if (iEntryLen <= sizeof(ParsedLine.szChangeDir)) {_tcscpy(ParsedLine.szChangeDir, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, (TCHAR *) PARSE_ERROR_ENTRY_TO_BIG,ThingToDoNumType_200,csEntry));}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
// 701=OS (0=ALL,1=NTS,2=NTW,4=NTDC)
|
|
if (csEntry.Left(4) == ThingToDoNumType_701 && iFoundMatch != TRUE)
|
|
{
|
|
csEntry = csEntry.Right( csEntry.GetLength() - 4);
|
|
if (iEntryLen <= sizeof(ParsedLine.szOS)) {_tcscpy(ParsedLine.szOS, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, (TCHAR *) PARSE_ERROR_ENTRY_TO_BIG,ThingToDoNumType_701,csEntry));}
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
// 702=PlatformArchitecture (0=ALL,1=x86,2=alpha)
|
|
if (csEntry.Left(4) == ThingToDoNumType_702 && iFoundMatch != TRUE)
|
|
{
|
|
csEntry = csEntry.Right( csEntry.GetLength() - 4);
|
|
if (iEntryLen <= sizeof(ParsedLine.szPlatformArchitecture)) {_tcscpy(ParsedLine.szPlatformArchitecture, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, (TCHAR *) PARSE_ERROR_ENTRY_TO_BIG,ThingToDoNumType_702,csEntry));}
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
// 703=Enterprise (1=yes,0=no)
|
|
if (csEntry.Left(4) == ThingToDoNumType_703 && iFoundMatch != TRUE)
|
|
{
|
|
csEntry = csEntry.Right( csEntry.GetLength() - 4);
|
|
if (iEntryLen <= sizeof(ParsedLine.szEnterprise)) {_tcscpy(ParsedLine.szEnterprise, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, (TCHAR *) PARSE_ERROR_ENTRY_TO_BIG,ThingToDoNumType_703,csEntry));}
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
// 801=ErrIfFileNotFound (1=Show error if filenot found, 0=don't show error)
|
|
if (csEntry.Left(4) == ThingToDoNumType_801 && iFoundMatch != TRUE)
|
|
{
|
|
csEntry = csEntry.Right( csEntry.GetLength() - 4);
|
|
if (iEntryLen <= sizeof(ParsedLine.szErrIfFileNotFound)) {_tcscpy(ParsedLine.szErrIfFileNotFound, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, (TCHAR *) PARSE_ERROR_ENTRY_TO_BIG,ThingToDoNumType_801,csEntry));}
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
// 802=Ask User if they want to call this function with msgbox (1=yes,0=no)
|
|
if (csEntry.Left(4) == ThingToDoNumType_802 && iFoundMatch != TRUE)
|
|
{
|
|
csEntry = csEntry.Right( csEntry.GetLength() - 4);
|
|
if (iEntryLen <= sizeof(ParsedLine.szMsgBoxBefore)) {_tcscpy(ParsedLine.szMsgBoxBefore, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, (TCHAR *) PARSE_ERROR_ENTRY_TO_BIG,ThingToDoNumType_802,csEntry));}
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
// 803=notify use after calling the function (1=yes,0=no)
|
|
if (csEntry.Left(4) == ThingToDoNumType_803 && iFoundMatch != TRUE)
|
|
{
|
|
csEntry = csEntry.Right( csEntry.GetLength() - 4);
|
|
if (iEntryLen <= sizeof(ParsedLine.szMsgBoxAfter)) {_tcscpy(ParsedLine.szMsgBoxAfter, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, (TCHAR *) PARSE_ERROR_ENTRY_TO_BIG,ThingToDoNumType_803,csEntry));}
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
// 804=szDoNotDisplayErrIfFunctionFailed (1= dont Show error , 0=show error)
|
|
if (csEntry.Left(4) == ThingToDoNumType_804 && iFoundMatch != TRUE)
|
|
{
|
|
csEntry = csEntry.Right( csEntry.GetLength() - 4);
|
|
if (iEntryLen <= sizeof(ParsedLine.szDoNotDisplayErrIfFunctionFailed)) {_tcscpy(ParsedLine.szDoNotDisplayErrIfFunctionFailed, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, (TCHAR *) PARSE_ERROR_ENTRY_TO_BIG,ThingToDoNumType_804,csEntry));}
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
// 805=szProgressTitle
|
|
if (csEntry.Left(4) == ThingToDoNumType_805 && iFoundMatch != TRUE)
|
|
{
|
|
csEntry = csEntry.Right( csEntry.GetLength() - 4);
|
|
if (iEntryLen <= sizeof(ParsedLine.szProgressTitle)) {_tcscpy(ParsedLine.szProgressTitle, csEntry);}
|
|
else {iisDebugOutSafeParams((LOG_TYPE_ERROR, (TCHAR *) PARSE_ERROR_ENTRY_TO_BIG,ThingToDoNumType_805,csEntry));}
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
if (iFoundMatch != TRUE)
|
|
{
|
|
// We didn't find a match, so output the problem to the logs..
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("ProcessEntry_Entry():UnknownOption '%1!s!'. Section=%2!s!..\n"),csEntry, szTheSection));
|
|
}
|
|
|
|
// Get next value
|
|
strListOrderImportant.GetNext(pos);
|
|
i++;
|
|
}
|
|
|
|
iFoundMatch = FALSE;
|
|
/*
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("ProcessEntry_Entry:PleaseProcess:type=%1!s!,filename=%2!s!,data=%3!s!,os=%4!s!,plat=%5!s!,errnofile=%6!s!,msgb=%7!s!,msga=%8!s!,noerr=%9!s!\n"),
|
|
ParsedLine.szType,
|
|
ParsedLine.szFileName,
|
|
ParsedLine.szData1,
|
|
ParsedLine.szOS,
|
|
ParsedLine.szPlatformArchitecture,
|
|
ParsedLine.szEnterprise
|
|
ParsedLine.szErrIfFileNotFound,
|
|
ParsedLine.szMsgBoxBefore,
|
|
ParsedLine.szMsgBoxAfter,
|
|
ParsedLine.szDoNotDisplayErrIfFunctionFailed
|
|
));
|
|
*/
|
|
if (i >= 1)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("...ProcessEntry:100=%1!s!...\n"),ParsedLine.szType));
|
|
|
|
// Get the type.
|
|
//
|
|
// 100=Type (1=DllFunction,2=DllFunctionInitOle, 2=Executable, 3=RunThisExe, 4=DoSection, 5=DoINFSection)
|
|
//
|
|
if ( _tcsicmp(ParsedLine.szType, _T("1")) == 0 || _tcsicmp(ParsedLine.szType, _T("2")) == 0 )
|
|
{
|
|
// 100=1=DllFunction,2=DllFunctionInitOle
|
|
// We are doing a call to a function in a DLL.
|
|
iReturnTemp = ProcessEntry_CallDll(csEntry,szTheSection,ParsedLine);
|
|
if (iReturnTemp == FALSE) (iReturn = FALSE);
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
// 100=7,8,9,10,11,12,13,14
|
|
if ( _tcsicmp(ParsedLine.szType, _T("7")) == 0 || _tcsicmp(ParsedLine.szType, _T("8")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("9")) == 0 || _tcsicmp(ParsedLine.szType, _T("10")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("11")) == 0 || _tcsicmp(ParsedLine.szType, _T("12")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("13")) == 0 || _tcsicmp(ParsedLine.szType, _T("14")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("17")) == 0 || _tcsicmp(ParsedLine.szType, _T("18")) == 0
|
|
)
|
|
{
|
|
iReturnTemp = ProcessEntry_Misc1(csEntry,szTheSection,ParsedLine);
|
|
if (iReturnTemp == FALSE) (iReturn = FALSE);
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("19")) == 0 || _tcsicmp(ParsedLine.szType, _T("20")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("21")) == 0 || _tcsicmp(ParsedLine.szType, _T("22")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("23")) == 0 || _tcsicmp(ParsedLine.szType, _T("24")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("25")) == 0 || _tcsicmp(ParsedLine.szType, _T("26")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("27")) == 0 || _tcsicmp(ParsedLine.szType, _T("28")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("29")) == 0 || _tcsicmp(ParsedLine.szType, _T("30")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("31")) == 0 || _tcsicmp(ParsedLine.szType, _T("32")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("33")) == 0 || _tcsicmp(ParsedLine.szType, _T("34")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("35")) == 0 || _tcsicmp(ParsedLine.szType, _T("36")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("37")) == 0 || _tcsicmp(ParsedLine.szType, _T("38")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("120")) == 0
|
|
)
|
|
{
|
|
iReturnTemp = ProcessEntry_other(csEntry,szTheSection,ParsedLine);
|
|
if (iReturnTemp == FALSE) (iReturn = FALSE);
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("39")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("40")) == 0 || _tcsicmp(ParsedLine.szType, _T("41")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("42")) == 0 || _tcsicmp(ParsedLine.szType, _T("43")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("44")) == 0 || _tcsicmp(ParsedLine.szType, _T("45")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("46")) == 0 || _tcsicmp(ParsedLine.szType, _T("47")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("48")) == 0 || _tcsicmp(ParsedLine.szType, _T("49")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("100")) == 0 || _tcsicmp(ParsedLine.szType, _T("119")) == 0
|
|
)
|
|
{
|
|
iReturnTemp = ProcessEntry_If(csEntry,szTheSection,ParsedLine);
|
|
if (iReturnTemp == FALSE) (iReturn = FALSE);
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("50")) == 0 || _tcsicmp(ParsedLine.szType, _T("51")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("52")) == 0 || _tcsicmp(ParsedLine.szType, _T("53")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("54")) == 0 || _tcsicmp(ParsedLine.szType, _T("55")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("56")) == 0 || _tcsicmp(ParsedLine.szType, _T("57")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("58")) == 0 || _tcsicmp(ParsedLine.szType, _T("59")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("60")) == 0 || _tcsicmp(ParsedLine.szType, _T("61")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("62")) == 0 || _tcsicmp(ParsedLine.szType, _T("63")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("64")) == 0 || _tcsicmp(ParsedLine.szType, _T("65")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("66")) == 0 || _tcsicmp(ParsedLine.szType, _T("67")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("68")) == 0 || _tcsicmp(ParsedLine.szType, _T("69")) == 0
|
|
)
|
|
{
|
|
iReturnTemp = ProcessEntry_SVC_Clus(csEntry,szTheSection,ParsedLine);
|
|
if (iReturnTemp == FALSE) (iReturn = FALSE);
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("70")) == 0 || _tcsicmp(ParsedLine.szType, _T("71")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("72")) == 0 || _tcsicmp(ParsedLine.szType, _T("73")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("74")) == 0 || _tcsicmp(ParsedLine.szType, _T("75")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("76")) == 0 || _tcsicmp(ParsedLine.szType, _T("77")) == 0
|
|
)
|
|
{
|
|
iReturnTemp = ProcessEntry_Dcom(csEntry,szTheSection,ParsedLine);
|
|
if (iReturnTemp == FALSE) (iReturn = FALSE);
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("82")) == 0 || _tcsicmp(ParsedLine.szType, _T("83")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("84")) == 0 || _tcsicmp(ParsedLine.szType, _T("85")) == 0
|
|
)
|
|
{
|
|
iReturnTemp = ProcessEntry_Metabase(csEntry,szTheSection,ParsedLine);
|
|
if (iReturnTemp == FALSE) (iReturn = FALSE);
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("15")) == 0 || _tcsicmp(ParsedLine.szType, _T("16")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("78")) == 0 || _tcsicmp(ParsedLine.szType, _T("79")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("80")) == 0 || _tcsicmp(ParsedLine.szType, _T("81")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("86")) == 0 || _tcsicmp(ParsedLine.szType, _T("87")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("88")) == 0 || _tcsicmp(ParsedLine.szType, _T("89")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("90")) == 0 || _tcsicmp(ParsedLine.szType, _T("91")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("92")) == 0 || _tcsicmp(ParsedLine.szType, _T("93")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("94")) == 0 || _tcsicmp(ParsedLine.szType, _T("95")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("96")) == 0 || _tcsicmp(ParsedLine.szType, _T("97")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("98")) == 0 || _tcsicmp(ParsedLine.szType, _T("99")) == 0
|
|
)
|
|
{
|
|
iReturnTemp = ProcessEntry_Misc2(csEntry,szTheSection,ParsedLine);
|
|
if (iReturnTemp == FALSE) (iReturn = FALSE);
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
if ( _tcsicmp(ParsedLine.szType, _T("101")) == 0 || _tcsicmp(ParsedLine.szType, _T("102")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("103")) == 0 || _tcsicmp(ParsedLine.szType, _T("104")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("105")) == 0 || _tcsicmp(ParsedLine.szType, _T("106")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("107")) == 0 || _tcsicmp(ParsedLine.szType, _T("108")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("109")) == 0 || _tcsicmp(ParsedLine.szType, _T("110")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("111")) == 0 || _tcsicmp(ParsedLine.szType, _T("112")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("113")) == 0 || _tcsicmp(ParsedLine.szType, _T("114")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("115")) == 0 || _tcsicmp(ParsedLine.szType, _T("116")) == 0 ||
|
|
_tcsicmp(ParsedLine.szType, _T("117")) == 0 || _tcsicmp(ParsedLine.szType, _T("118")) == 0
|
|
)
|
|
{
|
|
iReturnTemp = ProcessEntry_Misc3(csEntry,szTheSection,ParsedLine);
|
|
if (iReturnTemp == FALSE) (iReturn = FALSE);
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
//
|
|
// 100= 3=Executable
|
|
//
|
|
if ( _tcsicmp(ParsedLine.szType, _T("3")) == 0)
|
|
{
|
|
iReturnTemp = ProcessEntry_Call_Exe(csEntry,szTheSection,ParsedLine);
|
|
if (iReturnTemp == FALSE) (iReturn = FALSE);
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
//
|
|
// 100= 4=Call InternalSectionInIISDll
|
|
//
|
|
if ( _tcsicmp(ParsedLine.szType, _T("4")) == 0)
|
|
{
|
|
|
|
iReturnTemp = ProcessEntry_Internal_iisdll(csEntry,szTheSection,ParsedLine);
|
|
if (iReturnTemp == FALSE) (iReturn = FALSE);
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
//
|
|
// 100= 0=DoINFSection queue file ops special
|
|
// 100= 5=DoSection
|
|
// 100= 6=DoINFSection
|
|
//
|
|
if ( _tcsicmp(ParsedLine.szType, _T("0")) == 0 || _tcsicmp(ParsedLine.szType, _T("5")) == 0 || _tcsicmp(ParsedLine.szType, _T("6")) == 0 )
|
|
{
|
|
iReturnTemp = ProcessEntry_Call_Section(csEntry,szTheSection,ParsedLine);
|
|
if (iReturnTemp == FALSE) (iReturn = FALSE);
|
|
iFoundMatch = TRUE;
|
|
}
|
|
|
|
if (TRUE != iFoundMatch)
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_ERROR, _T("ProcessEntry_Entry:ExecuteThing:Unknown Type:%1!s! FAILURE.\n"),ParsedLine.szType));
|
|
}
|
|
}
|
|
|
|
if (lpBuffer) {LocalFree(lpBuffer);lpBuffer=NULL;}
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
int DoesThisSectionExist(IN HINF hFile, IN LPCTSTR szTheSection)
|
|
{
|
|
int iReturn = FALSE;
|
|
|
|
INFCONTEXT Context;
|
|
|
|
// go to the beginning of the section in the INF file
|
|
if (SetupFindFirstLine_Wrapped(hFile, szTheSection, NULL, &Context))
|
|
{iReturn = TRUE;}
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
// DoesTheInstallDrivePreserveAcls
|
|
//
|
|
// Does the drive that we are installing to preserve the ACL's
|
|
// that we set on stuff (ie. Is it NTFS)
|
|
//
|
|
// Parameters:
|
|
// pbPreservesAcls [out] - Are ACL's preserved or not
|
|
//
|
|
// Return Values
|
|
// TRUE - Successfully did query
|
|
// FALSE - Failed to do query
|
|
BOOL
|
|
DoesTheInstallDrivePreserveAcls( LPBOOL pbPreservesAcls )
|
|
{
|
|
DWORD dwSystemFlags;
|
|
TSTR_PATH strDrivePath;
|
|
static BOOL bAlreadyDidCheck = FALSE;
|
|
static BOOL bPreservesAcls = FALSE;
|
|
|
|
if ( !bAlreadyDidCheck )
|
|
{
|
|
// Create Drive path with trailing '\'
|
|
if ( !strDrivePath.Copy( g_pTheApp->m_csSysDrive ) ||
|
|
!strDrivePath.PathAppend( _T("") ) )
|
|
{
|
|
// Failed to create drive path
|
|
return FALSE;
|
|
}
|
|
|
|
if ( !GetVolumeInformation( strDrivePath.QueryStr(),
|
|
NULL, // Volume Name Buffer
|
|
0, // Size of Buffer
|
|
NULL, // Serial Number Buffer
|
|
NULL, // Max Component Lenght
|
|
&dwSystemFlags, // System Flags
|
|
NULL, // FS Type
|
|
0 ) )
|
|
{
|
|
// Failed to do query
|
|
return FALSE;
|
|
}
|
|
|
|
bPreservesAcls = ( dwSystemFlags & FS_PERSISTENT_ACLS ) != 0;
|
|
bAlreadyDidCheck = TRUE;
|
|
}
|
|
|
|
// Do not do query more than one, so remember that we did it
|
|
*pbPreservesAcls = bPreservesAcls;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
int GetSectionNameToDo(IN HINF hFile, TSTR *pstrSectionName )
|
|
{
|
|
iisDebugOut_Start1(_T("GetSectionNameToDo"), pstrSectionName->QueryStr() );
|
|
int iReturn = FALSE;
|
|
|
|
// Check if this section has other sections which have something else appended to it.
|
|
//
|
|
// for example:
|
|
// csTheSection = iis_www_reg_CreateIISPackage
|
|
//
|
|
// could have:
|
|
// iis_www_reg_CreateIISPackage.UT_NONE
|
|
// iis_www_reg_CreateIISPackage.UT_351
|
|
// iis_www_reg_CreateIISPackage.UT_10
|
|
// iis_www_reg_CreateIISPackage.UT_20
|
|
// iis_www_reg_CreateIISPackage.UT_30
|
|
// iis_www_reg_CreateIISPackage.UT_40
|
|
// iis_www_reg_CreateIISPackage.UT_50
|
|
// iis_www_reg_CreateIISPackage.UT_51
|
|
// iis_www_reg_CreateIISPackage.UT_60
|
|
// iis_www_reg_CreateIISPackage.UT_10_W95.GUIMODE
|
|
//
|
|
// In That case, we only want to do the iis_www_reg_CreateIISPackage.UT_40
|
|
// and not do the iis_www_reg_CreateIISPackage one!
|
|
//
|
|
// Check for other upgrade specific sections...
|
|
// if we find one then do that, otherwise, just do the regular section...
|
|
TCHAR szTheSectionToDo[100];
|
|
TCHAR szTheUT[30];
|
|
_tcscpy(szTheUT,_T("UT_NONE"));
|
|
if (g_pTheApp->m_eUpgradeType == UT_351){_tcscpy(szTheUT,_T("UT_351"));}
|
|
if (g_pTheApp->m_eUpgradeType == UT_10){_tcscpy(szTheUT,_T("UT_10"));}
|
|
if (g_pTheApp->m_eUpgradeType == UT_20){_tcscpy(szTheUT,_T("UT_20"));}
|
|
if (g_pTheApp->m_eUpgradeType == UT_30){_tcscpy(szTheUT,_T("UT_30"));}
|
|
if (g_pTheApp->m_eUpgradeType == UT_40){_tcscpy(szTheUT,_T("UT_40"));}
|
|
if (g_pTheApp->m_eUpgradeType == UT_50){_tcscpy(szTheUT,_T("UT_50"));}
|
|
if (g_pTheApp->m_eUpgradeType == UT_51){_tcscpy(szTheUT,_T("UT_51"));}
|
|
if (g_pTheApp->m_eUpgradeType == UT_60){_tcscpy(szTheUT,_T("UT_60"));}
|
|
if (g_pTheApp->m_eUpgradeType == UT_10_W95){_tcscpy(szTheUT,_T("UT_10_W95"));}
|
|
|
|
BOOL bSectionFound = FALSE;
|
|
// If this is an upgrade from win95 then tack that one on...
|
|
if (g_pTheApp->m_bWin95Migration)
|
|
{
|
|
// Check for guimode of this...
|
|
if (g_pTheApp->m_fNTGuiMode)
|
|
{
|
|
_stprintf(szTheSectionToDo,TEXT("%s.%s.MIG95.GUIMODE"), pstrSectionName->QueryStr(),szTheUT);
|
|
if (TRUE == DoesThisSectionExist(hFile, szTheSectionToDo)) {bSectionFound = TRUE;}
|
|
}
|
|
|
|
if (bSectionFound == FALSE)
|
|
{
|
|
_stprintf(szTheSectionToDo,TEXT("%s.%s.MIG95"), pstrSectionName->QueryStr(),szTheUT);
|
|
if (TRUE == DoesThisSectionExist(hFile, szTheSectionToDo)) {bSectionFound = TRUE;}
|
|
}
|
|
}
|
|
|
|
// check with out the extract mig95 thingy
|
|
if (bSectionFound == FALSE)
|
|
{
|
|
if (g_pTheApp->m_fNTGuiMode)
|
|
{
|
|
_stprintf(szTheSectionToDo,TEXT("%s.%s.GUIMODE"), pstrSectionName->QueryStr(),szTheUT);
|
|
if (TRUE == DoesThisSectionExist(hFile, szTheSectionToDo)) {bSectionFound = TRUE;}
|
|
}
|
|
|
|
if (bSectionFound == FALSE)
|
|
{
|
|
_stprintf(szTheSectionToDo,TEXT("%s.%s"), pstrSectionName->QueryStr(),szTheUT);
|
|
if (TRUE == DoesThisSectionExist(hFile, szTheSectionToDo)) {bSectionFound = TRUE;}
|
|
}
|
|
}
|
|
|
|
// if we didn't find a specific section, then see if this is an upgrade
|
|
// and if there is upgrade type box.
|
|
if (bSectionFound == FALSE)
|
|
{
|
|
if (_tcsicmp(szTheUT, _T("UT_NONE")) != 0)
|
|
{
|
|
if (TRUE == g_pTheApp->m_bUpgradeTypeHasMetabaseFlag)
|
|
{
|
|
if (g_pTheApp->m_fNTGuiMode)
|
|
{
|
|
_stprintf(szTheSectionToDo,TEXT("%s.UT_ANYMETABASEUPGRADE.GUIMODE"), pstrSectionName->QueryStr());
|
|
if (TRUE == DoesThisSectionExist(hFile, szTheSectionToDo)) {bSectionFound = TRUE;}
|
|
}
|
|
if (bSectionFound == FALSE)
|
|
{
|
|
_stprintf(szTheSectionToDo,TEXT("%s.UT_ANYMETABASEUPGRADE"), pstrSectionName->QueryStr());
|
|
if (TRUE == DoesThisSectionExist(hFile, szTheSectionToDo)) {bSectionFound = TRUE;}
|
|
}
|
|
}
|
|
|
|
if (bSectionFound == FALSE)
|
|
{
|
|
if (g_pTheApp->m_fNTGuiMode)
|
|
{
|
|
_stprintf(szTheSectionToDo,TEXT("%s.UT_ANYUPGRADE.GUIMODE"), pstrSectionName->QueryStr());
|
|
if (TRUE == DoesThisSectionExist(hFile, szTheSectionToDo)) {bSectionFound = TRUE;}
|
|
}
|
|
if (bSectionFound == FALSE)
|
|
{
|
|
_stprintf(szTheSectionToDo,TEXT("%s.UT_ANYUPGRADE"), pstrSectionName->QueryStr());
|
|
if (TRUE == DoesThisSectionExist(hFile, szTheSectionToDo)) {bSectionFound = TRUE;}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// if we didn't find a specific section, then turn the regular one.
|
|
if (bSectionFound == FALSE)
|
|
{
|
|
if (g_pTheApp->m_fNTGuiMode)
|
|
{
|
|
_stprintf(szTheSectionToDo,TEXT("%s.GUIMODE"), pstrSectionName->QueryStr());
|
|
if (TRUE == DoesThisSectionExist(hFile, szTheSectionToDo)) {bSectionFound = TRUE;}
|
|
}
|
|
|
|
if (bSectionFound == FALSE)
|
|
{
|
|
_tcscpy(szTheSectionToDo, pstrSectionName->QueryStr());
|
|
if (TRUE == DoesThisSectionExist(hFile, szTheSectionToDo)) {bSectionFound = TRUE;}
|
|
}
|
|
}
|
|
|
|
if (bSectionFound == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("GetSectionNameToDo.[%s].Section not found.\n"), pstrSectionName->QueryStr()));
|
|
iReturn = FALSE;
|
|
}
|
|
else
|
|
{
|
|
iReturn = pstrSectionName->Copy( szTheSectionToDo );
|
|
}
|
|
|
|
iisDebugOut_End1(_T("GetSectionNameToDo"), pstrSectionName->QueryStr());
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
|
|
|
|
int ProcessSection(IN HINF hFile, IN LPCTSTR szTheSection)
|
|
{
|
|
int iReturn = FALSE;
|
|
CStringList strList;
|
|
CParse ParseLine;
|
|
TSTR strTheSection;
|
|
|
|
if ( !strTheSection.Copy( szTheSection ) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if (GetSectionNameToDo(hFile, &strTheSection ))
|
|
{
|
|
iisDebugOut((LOG_TYPE_PROGRAM_FLOW, _T("ProcessSection.[%s].Start.\n"), strTheSection.QueryStr() ));
|
|
if (ERROR_SUCCESS == FillStrListWithListOfSections(hFile, strList, strTheSection.QueryStr() ))
|
|
{
|
|
// loop thru the list returned back
|
|
if (strList.IsEmpty() == FALSE)
|
|
{
|
|
POSITION pos = NULL;
|
|
CString csEntry;
|
|
|
|
pos = strList.GetHeadPosition();
|
|
while (pos)
|
|
{
|
|
csEntry = strList.GetAt(pos);
|
|
|
|
if ( ( csEntry.GetAt(0) >= _T('0') ) && ( csEntry.GetAt(0) <= _T('9') ) )
|
|
{
|
|
iReturn = ProcessEntry_Entry(hFile, strTheSection.QueryStr() , csEntry);
|
|
}
|
|
else
|
|
{
|
|
ParseLine.ParseLine(&(g_pTheApp->FuncDict),csEntry.GetBuffer(0) );
|
|
}
|
|
|
|
strList.GetNext(pos);
|
|
}
|
|
}
|
|
}
|
|
iisDebugOut_End1(_T("ProcessSection"),strTheSection.QueryStr());
|
|
|
|
iReturn = TRUE;
|
|
}
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
int iOleInitialize(void)
|
|
{
|
|
int iBalanceOLE = FALSE;
|
|
HRESULT hInitRes = NULL;
|
|
|
|
iisDebugOut_Start((_T("ole32:OleInitialize")));
|
|
hInitRes = OleInitialize(NULL);
|
|
iisDebugOut_End((_T("ole32:OleInitialize")));
|
|
if ( SUCCEEDED(hInitRes) || hInitRes == RPC_E_CHANGED_MODE )
|
|
{
|
|
if ( SUCCEEDED(hInitRes))
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("iOleInitialize: Succeeded: %x. MakeSure to call OleUninitialize.\n"), hInitRes));
|
|
iBalanceOLE = TRUE;
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, _T("iOleInitialize: Failed 0x%x. RPC_E_CHANGED_MODE\n"), hInitRes));
|
|
}
|
|
}
|
|
else
|
|
{iisDebugOut((LOG_TYPE_ERROR, _T("iOleInitialize: Failed 0x%x.\n"), hInitRes));}
|
|
|
|
return iBalanceOLE;
|
|
}
|
|
|
|
|
|
|
|
void iOleUnInitialize(int iBalanceOLE)
|
|
{
|
|
// ----------------------------------------------
|
|
//
|
|
// uninit ole if we need to
|
|
//
|
|
// ----------------------------------------------
|
|
if (iBalanceOLE)
|
|
{
|
|
iisDebugOut_Start(_T("ole32:OleInitialize"),LOG_TYPE_TRACE_WIN32_API);
|
|
OleUninitialize();
|
|
iisDebugOut_End(_T("ole32:OleInitialize"),LOG_TYPE_TRACE_WIN32_API);
|
|
}
|
|
return;
|
|
}
|
|
|
|
BOOL SetupSetDirectoryId_Wrapper(HINF InfHandle,DWORD Id,LPCTSTR Directory)
|
|
{
|
|
TCHAR szTempDir[_MAX_PATH];
|
|
BOOL bTempFlag;
|
|
|
|
// default it with something
|
|
_tcscpy(szTempDir,Directory);
|
|
|
|
if (_tcscmp(szTempDir, _T("")) != 0)
|
|
{
|
|
// Check if the passed in parameter looks like this:
|
|
// %systemroot%\system32\inetsrv or something like that...
|
|
LPTSTR pch = NULL;
|
|
pch = _tcschr( (LPTSTR) Directory, _T('%'));
|
|
if (pch)
|
|
{
|
|
if (!ExpandEnvironmentStrings( (LPCTSTR)Directory, szTempDir, sizeof(szTempDir)/sizeof(TCHAR)))
|
|
{_tcscpy(szTempDir,Directory);}
|
|
}
|
|
|
|
// Check to see if the old Drive still exists -- it may not because
|
|
// the user could have added/removed a drive so now c:\winnt is really d:\winnt
|
|
if (!IsFileExist(Directory))
|
|
{
|
|
TCHAR szDrive_only[_MAX_DRIVE];
|
|
TCHAR szPath_only[_MAX_PATH];
|
|
_tsplitpath( Directory, szDrive_only, szPath_only, NULL, NULL);
|
|
|
|
// See if that drive exists...
|
|
if (!IsFileExist(szDrive_only))
|
|
{
|
|
// the drive doesn't exist.
|
|
// so replace it with the system drive.
|
|
GetSystemDirectory(szTempDir, _MAX_PATH);
|
|
// Get the DriveOnly
|
|
_tsplitpath(szTempDir, szDrive_only, NULL, NULL, NULL);
|
|
// Assemble the full path with the new drive
|
|
_tcscpy(szTempDir, szDrive_only);
|
|
_tcscat(szTempDir, szPath_only);
|
|
// do some extra debug output so we can see what happend.
|
|
iisDebugOutSafeParams((LOG_TYPE_WARN, _T("%1!s! Not exist. Instead use %2!s!\n"), Directory, szTempDir));
|
|
}
|
|
}
|
|
}
|
|
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("%1!d!=%2!s!\n"), Id, szTempDir));
|
|
bTempFlag = SetupSetDirectoryId(InfHandle,Id,szTempDir);
|
|
|
|
// check for the alternate .inf file
|
|
if (g_pTheApp->m_hInfHandleAlternate && InfHandle != g_pTheApp->m_hInfHandleAlternate)
|
|
{
|
|
bTempFlag = SetupSetDirectoryId(g_pTheApp->m_hInfHandleAlternate,Id,szTempDir);
|
|
}
|
|
|
|
return bTempFlag;
|
|
}
|
|
|
|
BOOL SetupSetStringId_Wrapper(HINF InfHandle,DWORD Id,LPCTSTR TheString)
|
|
{
|
|
BOOL bTempFlag;
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("%1!d!=%2!s!\n"), Id, TheString));
|
|
|
|
bTempFlag = SetupSetDirectoryIdEx(InfHandle,Id,TheString,SETDIRID_NOT_FULL_PATH,0,0);
|
|
// check for the alternate .inf file
|
|
if (g_pTheApp->m_hInfHandleAlternate && InfHandle != g_pTheApp->m_hInfHandleAlternate)
|
|
{
|
|
bTempFlag = SetupSetDirectoryIdEx(g_pTheApp->m_hInfHandleAlternate,Id,TheString,SETDIRID_NOT_FULL_PATH,0,0);
|
|
}
|
|
|
|
return bTempFlag;
|
|
}
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
HRESULT FTestForOutstandingCoInits(void)
|
|
{
|
|
HRESULT hInitRes = ERROR_SUCCESS;
|
|
|
|
#if defined(UNICODE) || defined(_UNICODE)
|
|
// perform a defensive check
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("TestForOutstandingCoInits:...COINIT_MULTITHREADED\n")));
|
|
hInitRes = CoInitializeEx( NULL, COINIT_MULTITHREADED );
|
|
if ( SUCCEEDED(hInitRes) )
|
|
{
|
|
//iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("ole32:CoUninitialize().Start.")));
|
|
CoUninitialize();
|
|
//iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("ole32:CoUninitialize().End.")));
|
|
}
|
|
else
|
|
{
|
|
goto FTestForOutstandingCoInits_Exit;
|
|
}
|
|
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("TestForOutstandingCoInits:...COINIT_APARTMENTTHREADED\n")));
|
|
hInitRes = CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
|
|
if ( SUCCEEDED(hInitRes) )
|
|
{
|
|
//iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("ole32:CoUninitialize().Start.")));
|
|
CoUninitialize();
|
|
//iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("ole32:CoUninitialize().End.")));
|
|
}
|
|
else
|
|
{
|
|
goto FTestForOutstandingCoInits_Exit;
|
|
}
|
|
#endif
|
|
|
|
// it worked out OK
|
|
hInitRes = NOERROR;
|
|
goto FTestForOutstandingCoInits_Exit;
|
|
|
|
FTestForOutstandingCoInits_Exit:
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("TestForOutstandingCoInits:...End. Return=0x%x.\n"), hInitRes));
|
|
return hInitRes;
|
|
}
|
|
|
|
|
|
void ReturnStringForMetabaseID(DWORD dwMetabaseID, LPTSTR lpReturnString)
|
|
{
|
|
switch (dwMetabaseID)
|
|
{
|
|
case IIS_MD_SERVER_BASE:
|
|
_tcscpy(lpReturnString, _T("IIS_MD_SERVER_BASE"));
|
|
break;
|
|
case MD_KEY_TYPE:
|
|
_tcscpy(lpReturnString, _T("MD_KEY_TYPE"));
|
|
break;
|
|
case MD_MAX_BANDWIDTH_BLOCKED:
|
|
_tcscpy(lpReturnString, _T("MD_MAX_BANDWIDTH_BLOCKED"));
|
|
break;
|
|
case MD_SERVER_COMMAND:
|
|
_tcscpy(lpReturnString, _T("MD_SERVER_COMMAND"));
|
|
break;
|
|
case MD_CONNECTION_TIMEOUT:
|
|
_tcscpy(lpReturnString, _T("MD_CONNECTION_TIMEOUT"));
|
|
break;
|
|
case MD_MAX_CONNECTIONS:
|
|
_tcscpy(lpReturnString, _T("MD_MAX_CONNECTIONS"));
|
|
break;
|
|
case MD_SERVER_COMMENT:
|
|
_tcscpy(lpReturnString, _T("MD_SERVER_COMMENT"));
|
|
break;
|
|
case MD_SERVER_STATE:
|
|
_tcscpy(lpReturnString, _T("MD_SERVER_STATE"));
|
|
break;
|
|
case MD_SERVER_AUTOSTART:
|
|
_tcscpy(lpReturnString, _T("MD_SERVER_AUTOSTART"));
|
|
break;
|
|
case MD_SERVER_SIZE:
|
|
_tcscpy(lpReturnString, _T("MD_SERVER_SIZE"));
|
|
break;
|
|
case MD_SERVER_LISTEN_BACKLOG:
|
|
_tcscpy(lpReturnString, _T("MD_SERVER_LISTEN_BACKLOG"));
|
|
break;
|
|
case MD_SERVER_LISTEN_TIMEOUT:
|
|
_tcscpy(lpReturnString, _T("MD_SERVER_LISTEN_TIMEOUT"));
|
|
break;
|
|
case MD_DOWNLEVEL_ADMIN_INSTANCE:
|
|
_tcscpy(lpReturnString, _T("MD_DOWNLEVEL_ADMIN_INSTANCE"));
|
|
break;
|
|
case MD_LEVELS_TO_SCAN:
|
|
_tcscpy(lpReturnString, _T("MD_LEVELS_TO_SCAN"));
|
|
break;
|
|
case MD_SERVER_BINDINGS:
|
|
_tcscpy(lpReturnString, _T("MD_SERVER_BINDINGS"));
|
|
break;
|
|
case MD_MAX_ENDPOINT_CONNECTIONS:
|
|
_tcscpy(lpReturnString, _T("MD_MAX_ENDPOINT_CONNECTIONS"));
|
|
break;
|
|
case MD_SERVER_CONFIGURATION_INFO:
|
|
_tcscpy(lpReturnString, _T("MD_SERVER_CONFIGURATION_INFO"));
|
|
break;
|
|
case MD_IISADMIN_EXTENSIONS:
|
|
_tcscpy(lpReturnString, _T("MD_IISADMIN_EXTENSIONS"));
|
|
break;
|
|
case IIS_MD_HTTP_BASE:
|
|
_tcscpy(lpReturnString, _T("IIS_MD_HTTP_BASE"));
|
|
break;
|
|
case MD_SECURE_BINDINGS:
|
|
_tcscpy(lpReturnString, _T("MD_SECURE_BINDINGS"));
|
|
break;
|
|
case MD_FILTER_LOAD_ORDER:
|
|
_tcscpy(lpReturnString, _T("MD_FILTER_LOAD_ORDER"));
|
|
break;
|
|
case MD_FILTER_IMAGE_PATH:
|
|
_tcscpy(lpReturnString, _T("MD_FILTER_IMAGE_PATH"));
|
|
break;
|
|
case MD_FILTER_STATE:
|
|
_tcscpy(lpReturnString, _T("MD_FILTER_STATE"));
|
|
break;
|
|
case MD_FILTER_ENABLED:
|
|
_tcscpy(lpReturnString, _T("MD_FILTER_ENABLED"));
|
|
break;
|
|
case MD_FILTER_FLAGS:
|
|
_tcscpy(lpReturnString, _T("MD_FILTER_FLAGS"));
|
|
break;
|
|
case MD_FILTER_DESCRIPTION:
|
|
_tcscpy(lpReturnString, _T("MD_FILTER_DESCRIPTION"));
|
|
break;
|
|
case MD_ADV_NOTIFY_PWD_EXP_IN_DAYS:
|
|
_tcscpy(lpReturnString, _T("MD_ADV_NOTIFY_PWD_EXP_IN_DAYS"));
|
|
break;
|
|
case MD_ADV_CACHE_TTL:
|
|
_tcscpy(lpReturnString, _T("MD_ADV_CACHE_TTL"));
|
|
break;
|
|
case MD_AUTH_CHANGE_FLAGS:
|
|
_tcscpy(lpReturnString, _T("MD_AUTH_CHANGE_FLAGS"));
|
|
break;
|
|
case MD_PROCESS_NTCR_IF_LOGGED_ON:
|
|
_tcscpy(lpReturnString, _T("MD_PROCESS_NTCR_IF_LOGGED_ON"));
|
|
break;
|
|
case MD_FRONTPAGE_WEB:
|
|
_tcscpy(lpReturnString, _T("MD_FRONTPAGE_WEB"));
|
|
break;
|
|
case MD_IN_PROCESS_ISAPI_APPS:
|
|
_tcscpy(lpReturnString, _T("MD_IN_PROCESS_ISAPI_APPS"));
|
|
break;
|
|
case MD_ALLOW_PATH_INFO_FOR_SCRIPT_MAPPINGS:
|
|
_tcscpy(lpReturnString, _T("MD_ALLOW_PATH_INFO_FOR_SCRIPT_MAPPINGS"));
|
|
break;
|
|
case MD_APP_FRIENDLY_NAME:
|
|
_tcscpy(lpReturnString, _T("MD_APP_FRIENDLY_NAME"));
|
|
break;
|
|
case MD_APP_ROOT:
|
|
_tcscpy(lpReturnString, _T("MD_APP_ROOT"));
|
|
break;
|
|
case MD_APP_ISOLATED:
|
|
_tcscpy(lpReturnString, _T("MD_APP_ISOLATED"));
|
|
break;
|
|
case MD_APP_WAM_CLSID:
|
|
_tcscpy(lpReturnString, _T("MD_APP_WAM_CLSID"));
|
|
break;
|
|
case MD_APP_PACKAGE_ID:
|
|
_tcscpy(lpReturnString, _T("MD_APP_PACKAGE_ID"));
|
|
break;
|
|
case MD_APP_PACKAGE_NAME:
|
|
_tcscpy(lpReturnString, _T("MD_APP_PACKAGE_NAME"));
|
|
break;
|
|
case MD_APP_OOP_RECOVER_LIMIT:
|
|
_tcscpy(lpReturnString, _T("MD_APP_OOP_RECOVER_LIMIT"));
|
|
break;
|
|
case MD_ADMIN_INSTANCE:
|
|
_tcscpy(lpReturnString, _T("MD_ADMIN_INSTANCE"));
|
|
break;
|
|
case MD_CUSTOM_ERROR_DESC:
|
|
_tcscpy(lpReturnString, _T("MD_CUSTOM_ERROR_DESC"));
|
|
break;
|
|
case MD_CPU_RESET_INTERVAL:
|
|
_tcscpy(lpReturnString, _T("MD_CPU_RESET_INTERVAL"));
|
|
break;
|
|
case MD_MD_SERVER_SS_AUTH_MAPPING:
|
|
_tcscpy(lpReturnString, _T("MD_MD_SERVER_SS_AUTH_MAPPING"));
|
|
break;
|
|
case MD_HC_COMPRESSION_DIRECTORY:
|
|
_tcscpy(lpReturnString, _T("MD_HC_COMPRESSION_DIRECTORY"));
|
|
break;
|
|
case MD_HC_CACHE_CONTROL_HEADER:
|
|
_tcscpy(lpReturnString, _T("MD_HC_CACHE_CONTROL_HEADER"));
|
|
break;
|
|
case MD_HC_EXPIRES_HEADER:
|
|
_tcscpy(lpReturnString, _T("MD_HC_EXPIRES_HEADER"));
|
|
break;
|
|
case MD_HC_DO_DYNAMIC_COMPRESSION:
|
|
_tcscpy(lpReturnString, _T("MD_HC_DO_DYNAMIC_COMPRESSION"));
|
|
break;
|
|
case MD_HC_DO_STATIC_COMPRESSION:
|
|
_tcscpy(lpReturnString, _T("MD_HC_DO_STATIC_COMPRESSION"));
|
|
break;
|
|
case MD_HC_DO_ON_DEMAND_COMPRESSION:
|
|
_tcscpy(lpReturnString, _T("MD_HC_DO_ON_DEMAND_COMPRESSION"));
|
|
break;
|
|
case MD_HC_DO_DISK_SPACE_LIMITING:
|
|
_tcscpy(lpReturnString, _T("MD_HC_DO_DISK_SPACE_LIMITING"));
|
|
break;
|
|
case MD_HC_NO_COMPRESSION_FOR_HTTP_10:
|
|
_tcscpy(lpReturnString, _T("MD_HC_NO_COMPRESSION_FOR_HTTP_10"));
|
|
break;
|
|
case MD_HC_NO_COMPRESSION_FOR_PROXIES:
|
|
_tcscpy(lpReturnString, _T("MD_HC_NO_COMPRESSION_FOR_PROXIES"));
|
|
break;
|
|
case MD_HC_NO_COMPRESSION_FOR_RANGE:
|
|
_tcscpy(lpReturnString, _T("MD_HC_NO_COMPRESSION_FOR_RANGE"));
|
|
break;
|
|
case MD_HC_SEND_CACHE_HEADERS:
|
|
_tcscpy(lpReturnString, _T("MD_HC_SEND_CACHE_HEADERS"));
|
|
break;
|
|
case MD_HC_MAX_DISK_SPACE_USAGE:
|
|
_tcscpy(lpReturnString, _T("MD_HC_MAX_DISK_SPACE_USAGE"));
|
|
break;
|
|
case MD_HC_IO_BUFFER_SIZE:
|
|
_tcscpy(lpReturnString, _T("MD_HC_IO_BUFFER_SIZE"));
|
|
break;
|
|
case MD_HC_COMPRESSION_BUFFER_SIZE:
|
|
_tcscpy(lpReturnString, _T("MD_HC_COMPRESSION_BUFFER_SIZE"));
|
|
break;
|
|
case MD_HC_MAX_QUEUE_LENGTH:
|
|
_tcscpy(lpReturnString, _T("MD_HC_MAX_QUEUE_LENGTH"));
|
|
break;
|
|
case MD_HC_FILES_DELETED_PER_DISK_FREE:
|
|
_tcscpy(lpReturnString, _T("MD_HC_FILES_DELETED_PER_DISK_FREE"));
|
|
break;
|
|
case MD_HC_MIN_FILE_SIZE_FOR_COMP:
|
|
_tcscpy(lpReturnString, _T("MD_HC_MIN_FILE_SIZE_FOR_COMP"));
|
|
break;
|
|
case MD_HC_COMPRESSION_DLL:
|
|
_tcscpy(lpReturnString, _T("MD_HC_COMPRESSION_DLL"));
|
|
break;
|
|
case MD_HC_FILE_EXTENSIONS:
|
|
_tcscpy(lpReturnString, _T("MD_HC_FILE_EXTENSIONS"));
|
|
break;
|
|
case MD_HC_PRIORITY:
|
|
_tcscpy(lpReturnString, _T("MD_HC_PRIORITY"));
|
|
break;
|
|
case MD_HC_DYNAMIC_COMPRESSION_LEVEL:
|
|
_tcscpy(lpReturnString, _T("MD_HC_DYNAMIC_COMPRESSION_LEVEL"));
|
|
break;
|
|
case MD_HC_ON_DEMAND_COMP_LEVEL:
|
|
_tcscpy(lpReturnString, _T("MD_HC_ON_DEMAND_COMP_LEVEL"));
|
|
break;
|
|
case MD_HC_CREATE_FLAGS:
|
|
_tcscpy(lpReturnString, _T("MD_HC_CREATE_FLAGS"));
|
|
break;
|
|
case MD_WIN32_ERROR:
|
|
_tcscpy(lpReturnString, _T("MD_WIN32_ERROR"));
|
|
break;
|
|
case IIS_MD_VR_BASE:
|
|
_tcscpy(lpReturnString, _T("IIS_MD_VR_BASE"));
|
|
break;
|
|
case MD_VR_PATH:
|
|
_tcscpy(lpReturnString, _T("MD_VR_PATH"));
|
|
break;
|
|
case MD_VR_USERNAME:
|
|
_tcscpy(lpReturnString, _T("MD_VR_USERNAME"));
|
|
break;
|
|
case MD_VR_PASSWORD:
|
|
_tcscpy(lpReturnString, _T("MD_VR_PASSWORD"));
|
|
break;
|
|
case MD_VR_PASSTHROUGH:
|
|
_tcscpy(lpReturnString, _T("MD_VR_PASSTHROUGH"));
|
|
break;
|
|
case MD_LOG_TYPE:
|
|
_tcscpy(lpReturnString, _T("MD_LOG_TYPE"));
|
|
break;
|
|
case MD_LOGFILE_DIRECTORY:
|
|
_tcscpy(lpReturnString, _T("MD_LOGFILE_DIRECTORY"));
|
|
break;
|
|
case MD_LOG_UNUSED1:
|
|
_tcscpy(lpReturnString, _T("MD_LOG_UNUSED1"));
|
|
break;
|
|
case MD_LOGFILE_PERIOD:
|
|
_tcscpy(lpReturnString, _T("MD_LOGFILE_PERIOD"));
|
|
break;
|
|
case MD_LOGFILE_TRUNCATE_SIZE:
|
|
_tcscpy(lpReturnString, _T("MD_LOGFILE_TRUNCATE_SIZE"));
|
|
break;
|
|
case MD_LOG_PLUGIN_MOD_ID:
|
|
_tcscpy(lpReturnString, _T("MD_LOG_PLUGIN_MOD_ID"));
|
|
break;
|
|
case MD_LOG_PLUGIN_UI_ID:
|
|
_tcscpy(lpReturnString, _T("MD_LOG_PLUGIN_UI_ID"));
|
|
break;
|
|
case MD_LOGSQL_DATA_SOURCES:
|
|
_tcscpy(lpReturnString, _T("MD_LOGSQL_DATA_SOURCES"));
|
|
break;
|
|
case MD_LOGSQL_TABLE_NAME:
|
|
_tcscpy(lpReturnString, _T("MD_LOGSQL_TABLE_NAME"));
|
|
break;
|
|
case MD_LOGSQL_USER_NAME:
|
|
_tcscpy(lpReturnString, _T("MD_LOGSQL_USER_NAME"));
|
|
break;
|
|
case MD_LOGSQL_PASSWORD:
|
|
_tcscpy(lpReturnString, _T("MD_LOGSQL_PASSWORD"));
|
|
break;
|
|
case MD_LOG_PLUGIN_ORDER:
|
|
_tcscpy(lpReturnString, _T("MD_LOG_PLUGIN_ORDER"));
|
|
break;
|
|
case MD_LOG_PLUGINS_AVAILABLE:
|
|
_tcscpy(lpReturnString, _T("MD_LOG_PLUGINS_AVAILABLE"));
|
|
break;
|
|
case MD_LOGEXT_FIELD_MASK:
|
|
_tcscpy(lpReturnString, _T("MD_LOGEXT_FIELD_MASK"));
|
|
break;
|
|
case MD_LOGEXT_FIELD_MASK2:
|
|
_tcscpy(lpReturnString, _T("MD_LOGEXT_FIELD_MASK2"));
|
|
break;
|
|
case MD_LOGFILE_LOCALTIME_ROLLOVER:
|
|
_tcscpy(lpReturnString, _T("MD_LOGFILE_LOCALTIME_ROLLOVER"));
|
|
break;
|
|
case IIS_MD_LOGCUSTOM_BASE:
|
|
_tcscpy(lpReturnString, _T("IIS_MD_LOGCUSTOM_BASE"));
|
|
break;
|
|
case MD_LOGCUSTOM_PROPERTY_NAME:
|
|
_tcscpy(lpReturnString, _T("MD_LOGCUSTOM_PROPERTY_NAME"));
|
|
break;
|
|
case MD_LOGCUSTOM_PROPERTY_HEADER:
|
|
_tcscpy(lpReturnString, _T("MD_LOGCUSTOM_PROPERTY_HEADER"));
|
|
break;
|
|
case MD_LOGCUSTOM_PROPERTY_ID:
|
|
_tcscpy(lpReturnString, _T("MD_LOGCUSTOM_PROPERTY_ID"));
|
|
break;
|
|
case MD_LOGCUSTOM_PROPERTY_MASK:
|
|
_tcscpy(lpReturnString, _T("MD_LOGCUSTOM_PROPERTY_MASK"));
|
|
break;
|
|
case MD_LOGCUSTOM_PROPERTY_DATATYPE:
|
|
_tcscpy(lpReturnString, _T("MD_LOGCUSTOM_PROPERTY_DATATYPE"));
|
|
break;
|
|
case MD_LOGCUSTOM_SERVICES_STRING:
|
|
_tcscpy(lpReturnString, _T("MD_LOGCUSTOM_SERVICES_STRING"));
|
|
break;
|
|
case IIS_MD_FTP_BASE:
|
|
_tcscpy(lpReturnString, _T("IIS_MD_FTP_BASE"));
|
|
break;
|
|
case MD_EXIT_MESSAGE:
|
|
_tcscpy(lpReturnString, _T("MD_EXIT_MESSAGE"));
|
|
break;
|
|
case MD_GREETING_MESSAGE:
|
|
_tcscpy(lpReturnString, _T("MD_GREETING_MESSAGE"));
|
|
break;
|
|
case MD_MAX_CLIENTS_MESSAGE:
|
|
_tcscpy(lpReturnString, _T("MD_MAX_CLIENTS_MESSAGE"));
|
|
break;
|
|
case MD_MSDOS_DIR_OUTPUT:
|
|
_tcscpy(lpReturnString, _T("MD_MSDOS_DIR_OUTPUT"));
|
|
break;
|
|
case MD_ALLOW_ANONYMOUS:
|
|
_tcscpy(lpReturnString, _T("MD_ALLOW_ANONYMOUS"));
|
|
break;
|
|
case MD_ANONYMOUS_ONLY:
|
|
_tcscpy(lpReturnString, _T("MD_ANONYMOUS_ONLY"));
|
|
break;
|
|
case MD_LOG_ANONYMOUS:
|
|
_tcscpy(lpReturnString, _T("MD_LOG_ANONYMOUS"));
|
|
break;
|
|
case MD_LOG_NONANONYMOUS:
|
|
_tcscpy(lpReturnString, _T("MD_LOG_NONANONYMOUS"));
|
|
break;
|
|
case MD_ALLOW_REPLACE_ON_RENAME:
|
|
_tcscpy(lpReturnString, _T("MD_ALLOW_REPLACE_ON_RENAME"));
|
|
break;
|
|
case MD_SSL_PUBLIC_KEY:
|
|
_tcscpy(lpReturnString, _T("MD_SSL_PUBLIC_KEY"));
|
|
break;
|
|
case MD_SSL_PRIVATE_KEY:
|
|
_tcscpy(lpReturnString, _T("MD_SSL_PRIVATE_KEY"));
|
|
break;
|
|
case MD_SSL_KEY_PASSWORD:
|
|
_tcscpy(lpReturnString, _T("MD_SSL_KEY_PASSWORD"));
|
|
break;
|
|
case MD_SSL_KEY_REQUEST:
|
|
_tcscpy(lpReturnString, _T("MD_SSL_KEY_REQUEST"));
|
|
break;
|
|
case MD_AUTHORIZATION:
|
|
_tcscpy(lpReturnString, _T("MD_AUTHORIZATION"));
|
|
break;
|
|
case MD_REALM:
|
|
_tcscpy(lpReturnString, _T("MD_REALM"));
|
|
break;
|
|
case MD_HTTP_EXPIRES:
|
|
_tcscpy(lpReturnString, _T("MD_HTTP_EXPIRES"));
|
|
break;
|
|
case MD_HTTP_PICS:
|
|
_tcscpy(lpReturnString, _T("MD_HTTP_PICS"));
|
|
break;
|
|
case MD_HTTP_CUSTOM:
|
|
_tcscpy(lpReturnString, _T("MD_HTTP_CUSTOM"));
|
|
break;
|
|
case MD_DIRECTORY_BROWSING:
|
|
_tcscpy(lpReturnString, _T("MD_DIRECTORY_BROWSING"));
|
|
break;
|
|
case MD_DEFAULT_LOAD_FILE:
|
|
_tcscpy(lpReturnString, _T("MD_DEFAULT_LOAD_FILE"));
|
|
break;
|
|
case MD_CUSTOM_ERROR:
|
|
_tcscpy(lpReturnString, _T("MD_CUSTOM_ERROR"));
|
|
break;
|
|
case MD_FOOTER_DOCUMENT:
|
|
_tcscpy(lpReturnString, _T("MD_FOOTER_DOCUMENT"));
|
|
break;
|
|
case MD_FOOTER_ENABLED:
|
|
_tcscpy(lpReturnString, _T("MD_FOOTER_ENABLED"));
|
|
break;
|
|
case MD_HTTP_REDIRECT:
|
|
_tcscpy(lpReturnString, _T("MD_HTTP_REDIRECT"));
|
|
break;
|
|
case MD_DEFAULT_LOGON_DOMAIN:
|
|
_tcscpy(lpReturnString, _T("MD_DEFAULT_LOGON_DOMAIN"));
|
|
break;
|
|
case MD_LOGON_METHOD:
|
|
_tcscpy(lpReturnString, _T("MD_LOGON_METHOD"));
|
|
break;
|
|
case MD_SCRIPT_MAPS:
|
|
_tcscpy(lpReturnString, _T("MD_SCRIPT_MAPS"));
|
|
break;
|
|
case MD_MIME_MAP:
|
|
_tcscpy(lpReturnString, _T("MD_MIME_MAP"));
|
|
break;
|
|
case MD_ACCESS_PERM:
|
|
_tcscpy(lpReturnString, _T("MD_ACCESS_PERM"));
|
|
break;
|
|
case MD_IP_SEC:
|
|
_tcscpy(lpReturnString, _T("MD_IP_SEC"));
|
|
break;
|
|
case MD_ANONYMOUS_USER_NAME:
|
|
_tcscpy(lpReturnString, _T("MD_ANONYMOUS_USER_NAME"));
|
|
break;
|
|
case MD_ANONYMOUS_PWD:
|
|
_tcscpy(lpReturnString, _T("MD_ANONYMOUS_PWD"));
|
|
break;
|
|
case MD_ANONYMOUS_USE_SUBAUTH:
|
|
_tcscpy(lpReturnString, _T("MD_ANONYMOUS_USE_SUBAUTH"));
|
|
break;
|
|
case MD_DONT_LOG:
|
|
_tcscpy(lpReturnString, _T("MD_DONT_LOG"));
|
|
break;
|
|
case MD_ADMIN_ACL:
|
|
_tcscpy(lpReturnString, _T("MD_ADMIN_ACL"));
|
|
break;
|
|
case MD_SSI_EXEC_DISABLED:
|
|
_tcscpy(lpReturnString, _T("MD_SSI_EXEC_DISABLED"));
|
|
break;
|
|
case MD_DO_REVERSE_DNS:
|
|
_tcscpy(lpReturnString, _T("MD_DO_REVERSE_DNS"));
|
|
break;
|
|
case MD_SSL_ACCESS_PERM:
|
|
_tcscpy(lpReturnString, _T("MD_SSL_ACCESS_PERM"));
|
|
break;
|
|
case MD_AUTHORIZATION_PERSISTENCE:
|
|
_tcscpy(lpReturnString, _T("MD_AUTHORIZATION_PERSISTENCE"));
|
|
break;
|
|
case MD_NTAUTHENTICATION_PROVIDERS:
|
|
_tcscpy(lpReturnString, _T("MD_NTAUTHENTICATION_PROVIDERS"));
|
|
break;
|
|
case MD_SCRIPT_TIMEOUT:
|
|
_tcscpy(lpReturnString, _T("MD_SCRIPT_TIMEOUT"));
|
|
break;
|
|
case MD_CACHE_EXTENSIONS:
|
|
_tcscpy(lpReturnString, _T("MD_CACHE_EXTENSIONS"));
|
|
break;
|
|
case MD_CREATE_PROCESS_AS_USER:
|
|
_tcscpy(lpReturnString, _T("MD_CREATE_PROCESS_AS_USER"));
|
|
break;
|
|
case MD_CREATE_PROC_NEW_CONSOLE:
|
|
_tcscpy(lpReturnString, _T("MD_CREATE_PROC_NEW_CONSOLE"));
|
|
break;
|
|
case MD_POOL_IDC_TIMEOUT:
|
|
_tcscpy(lpReturnString, _T("MD_POOL_IDC_TIMEOUT"));
|
|
break;
|
|
case MD_ALLOW_KEEPALIVES:
|
|
_tcscpy(lpReturnString, _T("MD_ALLOW_KEEPALIVES"));
|
|
break;
|
|
case MD_IS_CONTENT_INDEXED:
|
|
_tcscpy(lpReturnString, _T("MD_IS_CONTENT_INDEXED"));
|
|
break;
|
|
case MD_CC_NO_CACHE:
|
|
_tcscpy(lpReturnString, _T("MD_CC_NO_CACHE"));
|
|
break;
|
|
case MD_CC_MAX_AGE:
|
|
_tcscpy(lpReturnString, _T("MD_CC_MAX_AGE"));
|
|
break;
|
|
case MD_CC_OTHER:
|
|
_tcscpy(lpReturnString, _T("MD_CC_OTHER"));
|
|
break;
|
|
case MD_REDIRECT_HEADERS:
|
|
_tcscpy(lpReturnString, _T("MD_REDIRECT_HEADERS"));
|
|
break;
|
|
case MD_UPLOAD_READAHEAD_SIZE:
|
|
_tcscpy(lpReturnString, _T("MD_UPLOAD_READAHEAD_SIZE"));
|
|
break;
|
|
case MD_PUT_READ_SIZE:
|
|
_tcscpy(lpReturnString, _T("MD_PUT_READ_SIZE"));
|
|
break;
|
|
case MD_WAM_USER_NAME:
|
|
_tcscpy(lpReturnString, _T("MD_WAM_USER_NAME"));
|
|
break;
|
|
case MD_WAM_PWD:
|
|
_tcscpy(lpReturnString, _T("MD_WAM_PWD"));
|
|
break;
|
|
case MD_SCHEMA_METAID:
|
|
_tcscpy(lpReturnString, _T("MD_SCHEMA_METAID"));
|
|
break;
|
|
case MD_DISABLE_SOCKET_POOLING:
|
|
_tcscpy(lpReturnString, _T("MD_DISABLE_SOCKET_POOLING"));
|
|
break;
|
|
case MD_METADATA_ID_REGISTRATION:
|
|
_tcscpy(lpReturnString, _T("MD_METADATA_ID_REGISTRATION"));
|
|
break;
|
|
case MD_HC_SCRIPT_FILE_EXTENSIONS:
|
|
_tcscpy(lpReturnString, _T("MD_HC_SCRIPT_FILE_EXTENSIONS"));
|
|
break;
|
|
case MD_SHOW_4_DIGIT_YEAR:
|
|
_tcscpy(lpReturnString, _T("MD_SHOW_4_DIGIT_YEAR"));
|
|
break;
|
|
case MD_SSL_USE_DS_MAPPER:
|
|
_tcscpy(lpReturnString, _T("MD_SSL_USE_DS_MAPPER"));
|
|
break;
|
|
case MD_FILTER_ENABLE_CACHE:
|
|
_tcscpy(lpReturnString, _T("MD_FILTER_ENABLE_CACHE"));
|
|
break;
|
|
case MD_USE_DIGEST_SSP:
|
|
_tcscpy(lpReturnString, _T("MD_USE_DIGEST_SSP"));
|
|
break;
|
|
case MD_APPPOOL_PERIODIC_RESTART_TIME:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_PERIODIC_RESTART_TIME"));
|
|
break;
|
|
case MD_APPPOOL_PERIODIC_RESTART_REQUEST_COUNT:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_PERIODIC_RESTART_REQUEST_COUNT"));
|
|
break;
|
|
case MD_APPPOOL_MAX_PROCESS_COUNT:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_MAX_PROCESS_COUNT"));
|
|
break;
|
|
case MD_APPPOOL_PINGING_ENABLED:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_PINGING_ENABLED"));
|
|
break;
|
|
case MD_APPPOOL_IDLE_TIMEOUT:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_IDLE_TIMEOUT"));
|
|
break;
|
|
case MD_APPPOOL_RAPID_FAIL_PROTECTION_ENABLED:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_RAPID_F_PROTECTION_ENABLED"));
|
|
break;
|
|
case MD_APPPOOL_SMP_AFFINITIZED:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_SMP_AFFINITIZED"));
|
|
break;
|
|
case MD_APPPOOL_SMP_AFFINITIZED_PROCESSOR_MASK:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_SMP_AFFINITIZED_PROCESSOR_MASK"));
|
|
break;
|
|
case MD_APPPOOL_ORPHAN_PROCESSES_FOR_DEBUGGING:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_ORPHAN_PROCESSES_FOR_DEBUGGING"));
|
|
break;
|
|
case MD_APPPOOL_STARTUP_TIMELIMIT:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_STARTUP_TIMELIMIT"));
|
|
break;
|
|
case MD_APPPOOL_SHUTDOWN_TIMELIMIT:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_SHUTDOWN_TIMELIMIT"));
|
|
break;
|
|
case MD_APPPOOL_PING_INTERVAL:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_PING_INTERVAL"));
|
|
break;
|
|
case MD_APPPOOL_PING_RESPONSE_TIMELIMIT:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_PING_RESPONSE_TIMELIMIT"));
|
|
break;
|
|
case MD_APPPOOL_DISALLOW_OVERLAPPING_ROTATION:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_DISALLOW_OVERLAPPING_ROTATION"));
|
|
break;
|
|
case MD_APPPOOL_UL_APPPOOL_QUEUE_LENGTH:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_UL_APPPOOL_QUEUE_LENGTH"));
|
|
break;
|
|
case MD_APPPOOL_DISALLOW_ROTATION_ON_CONFIG_CHANGE:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_DISALLOW_ROTATION_ON_CONFIG_CHANGE"));
|
|
break;
|
|
case MD_APPPOOL_PERIODIC_RESTART_SCHEDULE:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_PERIODIC_RESTART_SCHEDULE"));
|
|
break;
|
|
case MD_APPPOOL_IDENTITY_TYPE:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_IDENTITY_TYPE"));
|
|
break;
|
|
case MD_CPU_ACTION:
|
|
_tcscpy(lpReturnString, _T("MD_CPU_ACTION"));
|
|
break;
|
|
case MD_CPU_LIMIT:
|
|
_tcscpy(lpReturnString, _T("MD_CPU_LIMIT"));
|
|
break;
|
|
case MD_APPPOOL_PERIODIC_RESTART_MEMORY:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_PERIODIC_RESTART_MEMORY"));
|
|
break;
|
|
case MD_APP_APPPOOL_ID:
|
|
_tcscpy(lpReturnString, _T("MD_APP_APPPOOL_ID"));
|
|
break;
|
|
case MD_APP_ALLOW_TRANSIENT_REGISTRATION:
|
|
_tcscpy(lpReturnString, _T("MD_APP_ALLOW_TRANSIENT_REGISTRATION"));
|
|
break;
|
|
case MD_APP_AUTO_START:
|
|
_tcscpy(lpReturnString, _T("MD_APP_AUTO_START"));
|
|
break;
|
|
case MD_APPPOOL_PERIODIC_RESTART_CONNECTIONS:
|
|
_tcscpy(lpReturnString, _T("MD_APPPOOL_PERIODIC_RESTART_CONNECTIONS"));
|
|
break;
|
|
case MD_MAX_GLOBAL_BANDWIDTH:
|
|
_tcscpy(lpReturnString, _T("MD_MAX_GLOBAL_BANDWIDTH"));
|
|
break;
|
|
case MD_GLOBAL_STANDARD_APP_MODE_ENABLED:
|
|
_tcscpy(lpReturnString, _T("MD_GLOBAL_STANDARD_APP_MODE_ENABLED"));
|
|
break;
|
|
case MD_HEADER_WAIT_TIMEOUT:
|
|
_tcscpy(lpReturnString, _T("MD_HEADER_WAIT_TIMEOUT"));
|
|
break;
|
|
case MD_MIN_FILE_BYTES_PER_SEC:
|
|
_tcscpy(lpReturnString, _T("MD_MIN_FILE_BYTES_PER_SEC"));
|
|
break;
|
|
case MD_GLOBAL_LOG_IN_UTF_8:
|
|
_tcscpy(lpReturnString, _T("MD_GLOBAL_LOG_IN_UTF_8"));
|
|
break;
|
|
case MD_ASP_ENABLEPARENTPATHS:
|
|
_tcscpy(lpReturnString, _T("MD_ASP_ENABLEPARENTPATHS"));
|
|
break;
|
|
case ASP_MD_SERVER_BASE:
|
|
case MD_ASP_LOGERRORREQUESTS:
|
|
case MD_ASP_SCRIPTERRORSSENTTOBROWSER:
|
|
case MD_ASP_SCRIPTERRORMESSAGE:
|
|
case MD_ASP_SCRIPTFILECACHESIZE:
|
|
case MD_ASP_SCRIPTENGINECACHEMAX:
|
|
case MD_ASP_SCRIPTTIMEOUT:
|
|
case MD_ASP_SESSIONTIMEOUT:
|
|
case MD_ASP_MEMFREEFACTOR:
|
|
case MD_ASP_MINUSEDBLOCKS:
|
|
case MD_ASP_ALLOWSESSIONSTATE:
|
|
case MD_ASP_SCRIPTLANGUAGE:
|
|
case MD_ASP_QUEUETIMEOUT:
|
|
case MD_ASP_ALLOWOUTOFPROCCOMPONENTS:
|
|
case MD_ASP_EXCEPTIONCATCHENABLE:
|
|
case MD_ASP_CODEPAGE:
|
|
case MD_ASP_SCRIPTLANGUAGELIST:
|
|
case MD_ASP_ENABLESERVERDEBUG:
|
|
case MD_ASP_ENABLECLIENTDEBUG:
|
|
case MD_ASP_TRACKTHREADINGMODEL:
|
|
case MD_ASP_ENABLEASPHTMLFALLBACK:
|
|
case MD_ASP_ENABLECHUNKEDENCODING:
|
|
case MD_ASP_ENABLETYPELIBCACHE:
|
|
case MD_ASP_ERRORSTONTLOG:
|
|
case MD_ASP_PROCESSORTHREADMAX:
|
|
case MD_ASP_REQEUSTQUEUEMAX:
|
|
case MD_ASP_ENABLEAPPLICATIONRESTART:
|
|
case MD_ASP_QUEUECONNECTIONTESTTIME:
|
|
case MD_ASP_SESSIONMAX:
|
|
_tcscpy(lpReturnString, _T("MD_ASP_????"));
|
|
break;
|
|
case WAM_MD_SERVER_BASE:
|
|
_tcscpy(lpReturnString, _T("WAM_MD_SERVER_BASE"));
|
|
break;
|
|
default:
|
|
_stprintf(lpReturnString, _T("%d"), dwMetabaseID);
|
|
break;
|
|
}
|
|
return;
|
|
}
|
|
|
|
void SetErrorFlag(char *szFileName, int iLineNumber)
|
|
{
|
|
// set flag to say that there was an error!!!
|
|
g_pTheApp->m_bThereWereErrorsChkLogfile = TRUE;
|
|
return;
|
|
}
|
|
|
|
BOOL
|
|
IsContinuedLine(BUFFER *pBuff)
|
|
{
|
|
LPTSTR szContinueChar;
|
|
|
|
if (!pBuff)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
szContinueChar = _tcsrchr( (LPTSTR)pBuff->QueryPtr(), '\\' );
|
|
|
|
if (!szContinueChar)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
while ( ( *szContinueChar) &&
|
|
( (*szContinueChar == ' ') || (*szContinueChar == '\t') )
|
|
)
|
|
{
|
|
szContinueChar++;
|
|
}
|
|
|
|
return (*szContinueChar == '\0');
|
|
}
|
|
|
|
DWORD FillStrListWithListOfSections(IN HINF hFile, CStringList &strList, IN LPCTSTR szSection)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD dwRequiredSize;
|
|
BOOL b = FALSE;
|
|
INFCONTEXT Context;
|
|
BUFFER bBuff;
|
|
|
|
// go to the beginning of the section in the INF file
|
|
b = SetupFindFirstLine_Wrapped(hFile, szSection, NULL, &Context);
|
|
if (!b)
|
|
{
|
|
dwReturn = ERROR_PATH_NOT_FOUND;
|
|
goto FillStrListWithListOfSections_Exit;
|
|
}
|
|
|
|
// loop through the items in the section.
|
|
while (b)
|
|
{
|
|
// get the size of the memory we need for this
|
|
b = SetupGetLineText(&Context, NULL, NULL, NULL, NULL, 0, &dwRequiredSize);
|
|
dwRequiredSize = (dwRequiredSize + 1) * sizeof(TCHAR);
|
|
|
|
// prepare the buffer to receive the line
|
|
if (dwRequiredSize > bBuff.QuerySize())
|
|
{
|
|
if (!bBuff.Resize( dwRequiredSize ))
|
|
{
|
|
return dwReturn;
|
|
}
|
|
}
|
|
|
|
// get the line from the inf file1
|
|
if (SetupGetLineText(&Context, NULL, NULL, NULL, (LPTSTR) bBuff.QueryPtr(), bBuff.QuerySize()/sizeof(TCHAR), NULL) == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, _T("FillStrListWithListOfSections %s. Failed on SetupGetLineText.\n"), szSection));
|
|
goto FillStrListWithListOfSections_Exit;
|
|
}
|
|
|
|
while ( IsContinuedLine(&bBuff) &&
|
|
SetupFindNextLine(&Context, &Context)
|
|
)
|
|
{
|
|
// get the size of the memory we need for this
|
|
b = SetupGetLineText(&Context, NULL, NULL, NULL, NULL, 0, &dwRequiredSize);
|
|
|
|
dwRequiredSize = (dwRequiredSize + 1 + _tcslen((LPTSTR) bBuff.QueryPtr())) * sizeof(TCHAR);
|
|
if ( !bBuff.Resize(dwRequiredSize + 2) )
|
|
{
|
|
return dwReturn;
|
|
}
|
|
|
|
if (SetupGetLineText(&Context,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
(LPTSTR) bBuff.QueryPtr() + _tcslen((LPTSTR) bBuff.QueryPtr()),
|
|
bBuff.QuerySize()/sizeof(TCHAR)-_tcslen((LPTSTR) bBuff.QueryPtr()),
|
|
NULL) == FALSE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, _T("FillStrListWithListOfSections %s. Failed on SetupGetLineText.\n"), szSection));
|
|
goto FillStrListWithListOfSections_Exit;
|
|
}
|
|
}
|
|
|
|
// Add it to the list
|
|
strList.AddTail((LPTSTR) bBuff.QueryPtr());
|
|
|
|
// find the next line in the section. If there is no next line it should return false
|
|
b = SetupFindNextLine(&Context, &Context);
|
|
}
|
|
|
|
FillStrListWithListOfSections_Exit:
|
|
return dwReturn;
|
|
}
|
|
|
|
|
|
void DisplayStringForMetabaseID(DWORD dwMetabaseID)
|
|
{
|
|
TCHAR lpReturnString[50];
|
|
ReturnStringForMetabaseID(dwMetabaseID, lpReturnString);
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("%d=%s\n"), dwMetabaseID, lpReturnString));
|
|
return;
|
|
}
|
|
|
|
|
|
DWORD WINAPI MessageBoxFreeThread_MTS(LPVOID p)
|
|
{
|
|
HRESULT nNetErr = (HRESULT) gTempMTSError.dwErrorCode;
|
|
TCHAR pMsg[_MAX_PATH] = _T("");
|
|
DWORD dwFormatReturn = 0;
|
|
dwFormatReturn = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM,NULL, gTempMTSError.dwErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),pMsg, _MAX_PATH, NULL);
|
|
if ( dwFormatReturn == 0)
|
|
{
|
|
if (nNetErr >= NERR_BASE)
|
|
{
|
|
HMODULE hDll = (HMODULE)LoadLibrary(_T("netmsg.dll"));
|
|
if (hDll)
|
|
{
|
|
dwFormatReturn = FormatMessage( FORMAT_MESSAGE_FROM_HMODULE,hDll, gTempMTSError.dwErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),pMsg, _MAX_PATH, NULL);
|
|
FreeLibrary(hDll);
|
|
}
|
|
}
|
|
}
|
|
|
|
CString csErrorString;
|
|
MyLoadString(IDS_SETUP_ERRORS_ENCOUNTERED_MTS, csErrorString);
|
|
|
|
CString csErrArea;
|
|
MyLoadString(gTempMTSError.iMtsThingWeWereDoing, csErrArea);
|
|
|
|
CString csTitle;
|
|
MyLoadString(IDS_MTS_ERROR_TITLEBAR, csTitle);
|
|
|
|
CString csMsg;
|
|
csMsg.Format(csErrorString, csErrArea);
|
|
|
|
CString csErrMsg;
|
|
HandleSpecificErrors(gTempMTSError.dwErrorCode, dwFormatReturn, csMsg, pMsg, &csErrMsg);
|
|
|
|
MyMessageBox(NULL, csErrMsg, csTitle, MB_OK | MB_SETFOREGROUND);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
DWORD WINAPI MessageBoxFreeThread_IIS(PVOID p)
|
|
{
|
|
INT_PTR iStringID = (INT_PTR) p;
|
|
MyMessageBox(NULL, (UINT) iStringID, g_MyLogFile.m_szLogFileName_Full, MB_OK | MB_SETFOREGROUND);
|
|
return 0;
|
|
}
|
|
|
|
void MesssageBoxErrors_IIS(void)
|
|
{
|
|
if (g_pTheApp->m_bThereWereErrorsChkLogfile == TRUE)
|
|
{
|
|
int iSaveOld_AllowMessageBoxPopups = g_pTheApp->m_bAllowMessageBoxPopups;
|
|
|
|
g_pTheApp->m_bAllowMessageBoxPopups = TRUE;
|
|
|
|
DWORD id;
|
|
INT_PTR iStringID = IDS_SETUP_ERRORS_ENCOUNTERED;
|
|
|
|
// show the messagebox display from another thread, so that setup can continue!
|
|
HANDLE hProc = NULL;
|
|
hProc = CreateThread(NULL, 0, MessageBoxFreeThread_IIS, (PVOID) iStringID, 0, &id);
|
|
g_pTheApp->m_bAllowMessageBoxPopups = iSaveOld_AllowMessageBoxPopups;
|
|
|
|
CString csErrMsg;
|
|
TCHAR szErrorString[255] = _T("");
|
|
MyLoadString(IDS_SETUP_ERRORS_ENCOUNTERED, csErrMsg);
|
|
_stprintf(szErrorString, csErrMsg, g_MyLogFile.m_szLogFileName_Full);
|
|
|
|
//LogSevInformation 0x00000000
|
|
//LogSevWarning 0x00000001
|
|
//LogSevError 0x00000002
|
|
//LogSevFatalError 0x00000003
|
|
//LogSevMaximum 0x00000004
|
|
// Write it to the setupapi log file!
|
|
if ( *szErrorString )
|
|
{
|
|
SetupLogError(szErrorString, LogSevError);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
void MesssageBoxErrors_MTS(int iMtsThingWeWereDoing, DWORD dwErrorCode)
|
|
{
|
|
if (!g_pTheApp->m_bThereWereErrorsFromMTS)
|
|
{
|
|
DWORD id;
|
|
int iSaveOld_AllowMessageBoxPopups = g_pTheApp->m_bAllowMessageBoxPopups;
|
|
|
|
gTempMTSError.iMtsThingWeWereDoing = iMtsThingWeWereDoing;
|
|
gTempMTSError.dwErrorCode = dwErrorCode;
|
|
|
|
g_pTheApp->m_bAllowMessageBoxPopups = TRUE;
|
|
|
|
// show the messagebox display from another thread, so that setup can continue!
|
|
HANDLE hProc = NULL;
|
|
hProc = CreateThread(NULL, 0, MessageBoxFreeThread_MTS, 0, 0, &id);
|
|
|
|
if ( hProc != NULL )
|
|
{
|
|
CloseHandle( hProc );
|
|
}
|
|
|
|
g_pTheApp->m_bAllowMessageBoxPopups = iSaveOld_AllowMessageBoxPopups;
|
|
|
|
g_pTheApp->m_bThereWereErrorsFromMTS = TRUE;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
void PleaseKillOrStopTheseExeFromRunning(LPCTSTR szModuleWhichIsLocked, CStringList &strList)
|
|
{
|
|
if (strList.IsEmpty() == FALSE)
|
|
{
|
|
POSITION pos;
|
|
CString csExeName;
|
|
int nLen = 0;
|
|
|
|
TCHAR szReturnedServiceName[_MAX_PATH];
|
|
|
|
pos = strList.GetHeadPosition();
|
|
while (pos)
|
|
{
|
|
csExeName = strList.GetAt(pos);
|
|
nLen = 0;
|
|
nLen = csExeName.GetLength();
|
|
|
|
if (nLen > 0)
|
|
{
|
|
//iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("%1!s! is locking %2!s! service and is locking %3!s!\n"),csExeName, szModuleWhichIsLocked));
|
|
|
|
if (TRUE == InetIsThisExeAService(csExeName, szReturnedServiceName))
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_WARN, _T("%1!s! is the %2!s! service and is locking %3!s!. Let's stop that service.\n"),csExeName,szReturnedServiceName, szModuleWhichIsLocked));
|
|
|
|
// Check if it is the netlogon service, We no don't want to stop this service for sure!!!
|
|
/*
|
|
if (_tcsicmp(szReturnedServiceName, _T("NetLogon")) == 0)
|
|
{
|
|
// no we do not want to stop this service!!!
|
|
iisDebugOutSafeParams((LOG_TYPE_WARN, _T("%1!s! is the %2!s! service and is locking %3!s!. This service should not be stopped.\n"),csExeName,szReturnedServiceName, szModuleWhichIsLocked));
|
|
break;
|
|
}
|
|
*/
|
|
|
|
// Don't stop any services which are not win32 services
|
|
// Don't stop any system services...
|
|
if (TRUE == IsThisOnNotStopList(g_pTheApp->m_hInfHandle, szReturnedServiceName, TRUE))
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_WARN, _T("%1!s! is the %2!s! service and is locking %3!s!. This service should not be stopped.\n"),csExeName,szReturnedServiceName, szModuleWhichIsLocked));
|
|
}
|
|
else
|
|
{
|
|
// add this service to the list of
|
|
// services we need to restart after setup is done!!
|
|
ServicesRestartList_Add(szReturnedServiceName);
|
|
|
|
// Check the list of services which we are sure we do not want to stop!
|
|
|
|
// net stop it
|
|
InetStopService(szReturnedServiceName);
|
|
}
|
|
// otherwise go on to the next .exe file
|
|
}
|
|
else
|
|
{
|
|
// This .exe file is not a Service....
|
|
// Should we kill it???????
|
|
|
|
if (TRUE == IsThisOnNotStopList(g_pTheApp->m_hInfHandle, csExeName, FALSE))
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_PROGRAM_FLOW, _T("%1!s! is locking it. This process should not be killed\n"),csExeName));
|
|
}
|
|
else
|
|
{
|
|
// Check the list of .exe which we are sure we do not want to kill!
|
|
iisDebugOutSafeParams((LOG_TYPE_WARN, _T("%1!s! is locking %2!s!. Let's kill that process.\n"),csExeName,szModuleWhichIsLocked));
|
|
KillProcess_Wrap(csExeName);
|
|
}
|
|
}
|
|
}
|
|
strList.GetNext(pos);
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
void ShowIfModuleUsedForThisINFSection(IN HINF hFile, IN LPCTSTR szSection, int iUnlockThem)
|
|
{
|
|
LPTSTR szLine = NULL;
|
|
DWORD dwRequiredSize;
|
|
BOOL b = FALSE;
|
|
CString csFile;
|
|
|
|
INFCONTEXT Context;
|
|
|
|
TCHAR buf[_MAX_PATH];
|
|
GetSystemDirectory( buf, _MAX_PATH);
|
|
|
|
// go to the beginning of the section in the INF file
|
|
b = SetupFindFirstLine_Wrapped(hFile, szSection, NULL, &Context);
|
|
if (!b)
|
|
{
|
|
goto ShowIfModuleUsedForThisINFSection_Exit;
|
|
}
|
|
|
|
// loop through the items in the section.
|
|
while (b)
|
|
{
|
|
// get the size of the memory we need for this
|
|
b = SetupGetLineText(&Context, NULL, NULL, NULL, NULL, 0, &dwRequiredSize);
|
|
|
|
// prepare the buffer to receive the line
|
|
szLine = (LPTSTR)GlobalAlloc( GPTR, dwRequiredSize * sizeof(TCHAR) );
|
|
if ( !szLine )
|
|
{
|
|
goto ShowIfModuleUsedForThisINFSection_Exit;
|
|
}
|
|
|
|
// get the line from the inf file1
|
|
if (SetupGetLineText(&Context, NULL, NULL, NULL, szLine, dwRequiredSize, NULL) == FALSE)
|
|
{
|
|
goto ShowIfModuleUsedForThisINFSection_Exit;
|
|
}
|
|
|
|
// Attach the path to the from of this...
|
|
// check in this directory:
|
|
// 1. winnt\system32
|
|
// --------------------------------------
|
|
|
|
// may look like this "iisrtl.dll,,4"
|
|
// so get rid of the ',,4'
|
|
LPTSTR pch = NULL;
|
|
pch = _tcschr(szLine, _T(','));
|
|
if (pch) {_tcscpy(pch, _T(" "));}
|
|
|
|
// Remove any trailing spaces.
|
|
StripLastBackSlash(szLine);
|
|
|
|
// Get the system dir
|
|
csFile = buf;
|
|
|
|
csFile = AddPath(csFile, szLine);
|
|
|
|
CStringList strList;
|
|
strList.RemoveAll();
|
|
|
|
LogProcessesUsingThisModule(csFile, strList);
|
|
|
|
// if we're supposed to unlock this file, then
|
|
// we'll try it.
|
|
if (iUnlockThem)
|
|
{
|
|
PleaseKillOrStopTheseExeFromRunning(csFile, strList);
|
|
}
|
|
|
|
// find the next line in the section. If there is no next line it should return false
|
|
b = SetupFindNextLine(&Context, &Context);
|
|
|
|
// free the temporary buffer
|
|
GlobalFree( szLine );
|
|
szLine = NULL;
|
|
}
|
|
|
|
// free some memory used for the task list
|
|
FreeTaskListMem();
|
|
UnInit_Lib_PSAPI();
|
|
|
|
if (szLine) {GlobalFree(szLine);szLine=NULL;}
|
|
|
|
ShowIfModuleUsedForThisINFSection_Exit:
|
|
return;
|
|
}
|
|
|
|
|
|
void ShowIfModuleUsedForGroupOfSections(IN HINF hFile, int iUnlockThem)
|
|
{
|
|
CStringList strList;
|
|
TSTR strTheSection;
|
|
|
|
if ( !strTheSection.Copy( _T("VerifyFileSections_Lockable") ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (GetSectionNameToDo(hFile, &strTheSection))
|
|
{
|
|
if (ERROR_SUCCESS == FillStrListWithListOfSections(hFile, strList, strTheSection.QueryStr()))
|
|
{
|
|
// loop thru the list returned back
|
|
if (strList.IsEmpty() == FALSE)
|
|
{
|
|
POSITION pos;
|
|
CString csEntry;
|
|
|
|
pos = strList.GetHeadPosition();
|
|
while (pos)
|
|
{
|
|
csEntry = strList.GetAt(pos);
|
|
ShowIfModuleUsedForThisINFSection(hFile, csEntry, iUnlockThem);
|
|
strList.GetNext(pos);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
int ReadGlobalsFromInf(HINF InfHandle)
|
|
{
|
|
int iReturn = FALSE;
|
|
INFCONTEXT Context;
|
|
TCHAR szTempString[_MAX_PATH] = _T("");
|
|
|
|
//
|
|
// Set the m_csAppName
|
|
//
|
|
if (!SetupFindFirstLine_Wrapped(InfHandle, _T("SetupInfo"), _T("AppName"), &Context) )
|
|
{iisDebugOut((LOG_TYPE_ERROR, _T("SetupFindFirstLine_Wrapped(SetupInfo, AppName) FAILED")));}
|
|
if (!SetupGetStringField(&Context, 1, szTempString, _MAX_PATH, NULL))
|
|
{iisDebugOut((LOG_TYPE_ERROR, _T("SetupGetStringField(SetupInfo, AppName) FAILED")));}
|
|
// Set the global.
|
|
g_pTheApp->m_csAppName = szTempString;
|
|
|
|
//
|
|
// Set the m_csIISGroupName
|
|
//
|
|
_tcscpy(szTempString, _T(""));
|
|
if (!SetupFindFirstLine_Wrapped(InfHandle, _T("SetupInfo"), _T("StartMenuGroupName"), &Context) )
|
|
{iisDebugOut((LOG_TYPE_ERROR, _T("SetupFindFirstLine_Wrapped(SetupInfo, StartMenuGroupName) FAILED")));}
|
|
if (!SetupGetStringField(&Context, 1, szTempString, _MAX_PATH, NULL))
|
|
{iisDebugOut((LOG_TYPE_ERROR, _T("SetupGetStringField(SetupInfo, StartMenuGroupName) FAILED")));}
|
|
g_pTheApp->m_csIISGroupName = szTempString;
|
|
iReturn = TRUE;
|
|
|
|
//
|
|
// Get the value of one tick on the progressbar
|
|
//
|
|
g_GlobalTickValue = 1;
|
|
_tcscpy(szTempString, _T(""));
|
|
SetupFindFirstLine_Wrapped(InfHandle, _T("SetupInfo"), _T("OneTick"), &Context);
|
|
if (SetupGetStringField(&Context, 1, szTempString, _MAX_PATH, NULL))
|
|
{g_GlobalTickValue = _ttoi(szTempString);}
|
|
|
|
//
|
|
// See if we want to fake out setup when it's running in add\remove, to think it's actually guimode
|
|
//
|
|
g_GlobalGuiOverRide = 0;
|
|
_tcscpy(szTempString, _T(""));
|
|
if (SetupFindFirstLine_Wrapped(InfHandle, _T("SetupInfo"), _T("GuiMode"), &Context))
|
|
{
|
|
if (SetupGetStringField(&Context, 1, szTempString, _MAX_PATH, NULL))
|
|
{g_GlobalGuiOverRide = _ttoi(szTempString);}
|
|
}
|
|
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
int CheckIfPlatformMatchesInf(HINF InfHandle)
|
|
{
|
|
int iReturn = TRUE;
|
|
INFCONTEXT Context;
|
|
|
|
TCHAR szPlatform[_MAX_PATH] = _T("");
|
|
BOOL fPlatform = FALSE;
|
|
int nPlatform = IDS_INCORRECT_PLATFORM;
|
|
|
|
if (!SetupFindFirstLine_Wrapped(InfHandle, _T("SetupInfo"), _T("Platform"), &Context) )
|
|
{iisDebugOut((LOG_TYPE_ERROR, _T("SetupFindFirstLine_Wrapped(SetupInfo, Platform) FAILED")));}
|
|
SetupGetStringField(&Context, 1, szPlatform, _MAX_PATH, NULL);
|
|
|
|
// Check if .inf file is for NTS
|
|
if (_tcsicmp(szPlatform, _T("NTS")) == 0)
|
|
{
|
|
if (g_pTheApp->m_eOS == OS_NT && g_pTheApp->m_eNTOSType != OT_NTW)
|
|
{fPlatform = TRUE;}
|
|
else
|
|
{
|
|
if (g_pTheApp->m_fInvokedByNT)
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("TemporaryHack. iis.inf=NTS system=NTW, but wait till nt5 fixes. FAIL.\n")));
|
|
g_pTheApp->m_eNTOSType = OT_NTS;
|
|
fPlatform = TRUE;
|
|
}
|
|
else
|
|
{
|
|
nPlatform = IDS_NEED_PLATFORM_NTW;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Check if .inf file is for NTW
|
|
if (_tcsicmp(szPlatform, _T("NTW")) == 0)
|
|
{
|
|
if (g_pTheApp->m_eOS == OS_NT && g_pTheApp->m_eNTOSType == OT_NTW){fPlatform = TRUE;}
|
|
else{nPlatform = IDS_NEED_PLATFORM_NTW;}
|
|
}
|
|
|
|
/*
|
|
// Check if .inf file is for Windows 95
|
|
if (_tcsicmp(szPlatform, _T("W95")) == 0)
|
|
{
|
|
if (g_pTheApp->m_eOS == OS_W95){fPlatform = TRUE;}
|
|
else{nPlatform = IDS_NEED_PLATFORM_W95;}
|
|
}
|
|
*/
|
|
|
|
// If We didn't find the specific platform, then produce error message.
|
|
if (!fPlatform)
|
|
{
|
|
MyMessageBox(NULL, nPlatform, MB_OK | MB_SETFOREGROUND);
|
|
iReturn = FALSE;
|
|
}
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
int CheckSpecificBuildinInf(HINF InfHandle)
|
|
{
|
|
int iReturn = TRUE;
|
|
INFCONTEXT Context;
|
|
|
|
// Check for a specific build of nt5...
|
|
if ( g_pTheApp->m_eOS == OS_NT )
|
|
{
|
|
int iBuildNumRequired = 0;
|
|
TCHAR szBuildRequired[20] = _T("");
|
|
|
|
// check for Debug Keyword
|
|
if (SetupFindFirstLine_Wrapped(InfHandle, _T("SetupInfo"), _T("Debug"), &Context) )
|
|
{
|
|
SetupGetStringField(&Context, 1, szBuildRequired, sizeof(szBuildRequired)/sizeof(szBuildRequired[0]), NULL);
|
|
if (IsValidNumber((LPCTSTR)szBuildRequired))
|
|
{
|
|
iBuildNumRequired = _ttoi(szBuildRequired);
|
|
if (iBuildNumRequired >= 1) {g_pTheApp->m_bAllowMessageBoxPopups = TRUE;}
|
|
}
|
|
}
|
|
|
|
if (!SetupFindFirstLine_Wrapped(InfHandle, _T("SetupInfo"), _T("OSBuildRequired"), &Context) )
|
|
{iisDebugOut((LOG_TYPE_ERROR, _T("SetupFindFirstLine_Wrapped(SetupInfo, OSBuildRequired) FAILED")));}
|
|
else
|
|
{
|
|
SetupGetStringField(&Context, 1, szBuildRequired, 20, NULL);
|
|
|
|
// Since this is nt, we should be able to get the build number
|
|
CRegKey regWindowsNT( HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"),KEY_READ);
|
|
if ( (HKEY)regWindowsNT )
|
|
{
|
|
CString strBuildNumString;
|
|
regWindowsNT.m_iDisplayWarnings = FALSE;
|
|
if (ERROR_SUCCESS == regWindowsNT.QueryValue(_T("CurrentBuildNumber"), strBuildNumString))
|
|
{
|
|
int iBuildNumOS = 0;
|
|
if (IsValidNumber((LPCTSTR)strBuildNumString))
|
|
{iBuildNumOS = _ttoi(strBuildNumString);}
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("NTCurrentBuildNumber=%d\n"), iBuildNumOS));
|
|
|
|
// We have a build entry.
|
|
// lets check if it larger than or equal to what the underlying operting system is...
|
|
if (_tcsicmp(szBuildRequired, _T("")) != 0)
|
|
{
|
|
if (IsValidNumber((LPCTSTR)szBuildRequired))
|
|
{iBuildNumRequired = _ttoi(szBuildRequired);}
|
|
if ((iBuildNumOS !=0 && iBuildNumRequired !=0) && (iBuildNumOS < iBuildNumRequired))
|
|
{
|
|
// They don't have a big enough build num
|
|
// give the error message.
|
|
MyMessageBox(NULL, IDS_OS_BUILD_NUM_REQUIREMENT,szBuildRequired, MB_OK | MB_SETFOREGROUND);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
int CheckForOldGopher(HINF InfHandle)
|
|
{
|
|
int iReturn = TRUE;
|
|
|
|
if ( !(g_pTheApp->m_fUnattended) && g_pTheApp->m_eInstallMode == IM_UPGRADE )
|
|
{
|
|
CRegKey regGopher(HKEY_LOCAL_MACHINE, REG_GOPHERSVC,KEY_READ);
|
|
if ( (HKEY)regGopher )
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("GopherCurrentlyInstalled=YES")));
|
|
if (g_pTheApp->MsgBox(NULL, IDS_REMOVE_GOPHER, MB_OKCANCEL, FALSE) == IDCANCEL)
|
|
{
|
|
// setup should be terminated.
|
|
iReturn = FALSE;
|
|
goto CheckForOldGopher_Exit;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
CheckForOldGopher_Exit:
|
|
return iReturn;
|
|
}
|
|
|
|
// IIS publish the following directories to iis partners products
|
|
// Note: Inetpub directory can be customized later, and we'll re-publish
|
|
// those affected directories again later.
|
|
void SetOCGlobalPrivateData(void)
|
|
{
|
|
gHelperRoutines.SetPrivateData(gHelperRoutines.OcManagerContext,_T("PathInetsrv"),(PVOID)(LPCTSTR)g_pTheApp->m_csPathInetsrv,(g_pTheApp->m_csPathInetsrv.GetLength() + 1) * sizeof(TCHAR),REG_SZ);
|
|
|
|
CString csPathIISAdmin = g_pTheApp->m_csPathInetsrv + _T("\\iisadmin");
|
|
gHelperRoutines.SetPrivateData(gHelperRoutines.OcManagerContext,_T("PathIISAdmin"),(PVOID)(LPCTSTR)csPathIISAdmin,(csPathIISAdmin.GetLength() + 1) * sizeof(TCHAR),REG_SZ);
|
|
|
|
CString csPathIISHelp = g_pTheApp->m_csWinDir + _T("\\Help\\iishelp");
|
|
gHelperRoutines.SetPrivateData(gHelperRoutines.OcManagerContext,_T("PathIISHelp"),(PVOID)(LPCTSTR)csPathIISHelp,(csPathIISHelp.GetLength() + 1) * sizeof(TCHAR),REG_SZ);
|
|
|
|
gHelperRoutines.SetPrivateData(gHelperRoutines.OcManagerContext,_T("PathFTPRoot"),(PVOID)(LPCTSTR)g_pTheApp->m_csPathFTPRoot,(g_pTheApp->m_csPathFTPRoot.GetLength() + 1) * sizeof(TCHAR),REG_SZ);
|
|
gHelperRoutines.SetPrivateData(gHelperRoutines.OcManagerContext,_T("PathWWWRoot"),(PVOID)(LPCTSTR)g_pTheApp->m_csPathWWWRoot,(g_pTheApp->m_csPathWWWRoot.GetLength() + 1) * sizeof(TCHAR),REG_SZ);
|
|
gHelperRoutines.SetPrivateData(gHelperRoutines.OcManagerContext,_T("PathIISSamples"),(PVOID)(LPCTSTR)g_pTheApp->m_csPathIISSamples,(g_pTheApp->m_csPathIISSamples.GetLength() + 1) * sizeof(TCHAR),REG_SZ);
|
|
|
|
CString csPathScripts = g_pTheApp->m_csPathIISSamples + _T("\\Scripts");
|
|
gHelperRoutines.SetPrivateData(gHelperRoutines.OcManagerContext,_T("PathScripts"),(PVOID)(LPCTSTR)csPathScripts,(csPathScripts.GetLength() + 1) * sizeof(TCHAR),REG_SZ);
|
|
gHelperRoutines.SetPrivateData(gHelperRoutines.OcManagerContext,_T("IISProgramGroup"),(PVOID)(LPCTSTR)g_pTheApp->m_csIISGroupName,(g_pTheApp->m_csIISGroupName.GetLength() + 1) * sizeof(TCHAR),REG_SZ);
|
|
|
|
DWORD dwUpgradeType = (DWORD)(g_pTheApp->m_eUpgradeType);
|
|
gHelperRoutines.SetPrivateData(gHelperRoutines.OcManagerContext,_T("UpgradeType"),(PVOID)&dwUpgradeType,sizeof(DWORD),REG_DWORD);
|
|
|
|
return;
|
|
}
|
|
|
|
// STDAPI GetCORSystemDirectory(LPWSTR pbuffer, DWORD cchBuffer, DWORD* dwlength);
|
|
typedef HRESULT (*P_GetCORSystemDirectory)(LPWSTR pBuffer, DWORD ccBuffer, DWORD* dwLength);
|
|
|
|
BOOL GetASPNETSystemDir(LPTSTR lpszDir)
|
|
{
|
|
BOOL bRet = FALSE;
|
|
WCHAR wszSystemDir[_MAX_PATH];
|
|
DWORD dwLength;
|
|
|
|
P_GetCORSystemDirectory hProcGetSystemPath = NULL;
|
|
_tcscpy(lpszDir,_T(""));
|
|
|
|
// try using method#1
|
|
HINSTANCE hMsCoreeDll = LoadLibraryEx(_T("mscoree.dll"), NULL, 0 );
|
|
if (hMsCoreeDll)
|
|
{
|
|
hProcGetSystemPath = (P_GetCORSystemDirectory) GetProcAddress(hMsCoreeDll, "GetCORSystemDirectory");
|
|
if (hProcGetSystemPath)
|
|
{
|
|
// should come back looking like (notice trailing slash):"C:\WINDOWS\Microsoft.NET\Framework\v1.0.3119\"
|
|
HRESULT hRes = (*hProcGetSystemPath)((LPWSTR) wszSystemDir,(DWORD) _MAX_PATH,(DWORD*) &dwLength);
|
|
if (SUCCEEDED(hRes))
|
|
{
|
|
bRet = TRUE;
|
|
|
|
#if defined(UNICODE) || defined(_UNICODE)
|
|
_tcscpy(lpszDir,wszSystemDir);
|
|
#else
|
|
char AsciiProcedureName[_MAX_PATH];
|
|
// convert to ascii
|
|
WideCharToMultiByte( CP_ACP, 0, (LPCWSTR) wszSystemDir, -1, AsciiProcedureName, _MAX_PATH, NULL, NULL );
|
|
_tcscpy(lpszDir,AsciiProcedureName);
|
|
#endif
|
|
// Ensure that it ends with a "\"
|
|
LPTSTR pszTempPointer = lpszDir + _tcslen(lpszDir) - 1;
|
|
if (pszTempPointer)
|
|
{
|
|
if (*pszTempPointer != _T('\\'))
|
|
{
|
|
_tcscat(lpszDir, _T("\\"));
|
|
}
|
|
}
|
|
goto GetASPNETSystemDir_Exit;
|
|
}
|
|
}
|
|
}
|
|
|
|
// try using method#2
|
|
if (!bRet)
|
|
{
|
|
CRegKey regKeyPath(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\.NETFramework"),KEY_READ);
|
|
if ((HKEY)regKeyPath)
|
|
{
|
|
CString csPathResult;
|
|
CString csPathVersion;
|
|
|
|
// get the path
|
|
// should come back looking like: "C:\WINDOWS\Microsoft.NET\Framework\"
|
|
if (regKeyPath.QueryValue(_T("InstallRoot"), csPathResult) != ERROR_SUCCESS)
|
|
{
|
|
goto GetASPNETSystemDir_Exit;
|
|
}
|
|
|
|
// do any expansions if we need to
|
|
if (-1 != csPathResult.Find(_T('%')) )
|
|
{
|
|
// there is a '%' in the string
|
|
TCHAR szTempDir[_MAX_PATH];
|
|
_tcscpy(szTempDir, csPathResult);
|
|
if (ExpandEnvironmentStrings( (LPCTSTR)csPathResult, szTempDir, sizeof(szTempDir)/sizeof(TCHAR)))
|
|
{
|
|
csPathResult = szTempDir;
|
|
}
|
|
}
|
|
|
|
//key=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\policy\v1.0
|
|
//name=3119
|
|
//value=0-3119
|
|
CRegKey regKey(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\.NETFramework\\policy\\v1.0"),KEY_READ);
|
|
if ((HKEY)regKey)
|
|
{
|
|
// Enum thru the entries in this key
|
|
// since there will be one for every .netframework installation
|
|
// and we want the latest one...
|
|
CRegValueIter regEnum( regKey );
|
|
CString csName, csValue;
|
|
int iTheBiggestNumberYet = 0;
|
|
while ( regEnum.Next( &csName, &csValue ) == ERROR_SUCCESS )
|
|
{
|
|
if (_ttoi(csName) > iTheBiggestNumberYet)
|
|
{
|
|
csPathVersion = csName;
|
|
iTheBiggestNumberYet = _ttoi(csName);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Append the biggest version number onto the path...
|
|
// so it looks like:"C:\WINDOWS\Microsoft.NET\Framework\v1.0.3119\"
|
|
|
|
// Ensure that it ends with a "\"
|
|
LPTSTR pszTempPointer = csPathResult.GetBuffer(_tcslen(csPathResult)) + _tcslen(csPathResult) - 1;
|
|
csPathResult.ReleaseBuffer();
|
|
if (pszTempPointer)
|
|
{
|
|
if (*pszTempPointer != _T('\\'))
|
|
{
|
|
csPathResult += _T('\\');
|
|
}
|
|
}
|
|
csPathResult = csPathResult + _T("v1.0.") + csPathVersion + _T("\\");
|
|
_tcscpy(lpszDir,csPathResult);
|
|
bRet = TRUE;
|
|
}
|
|
}
|
|
|
|
// try getting the filversion of mscoree.dll
|
|
// and using that version to create the path
|
|
if (!bRet)
|
|
{
|
|
TCHAR szSystemDir[_MAX_PATH];
|
|
TCHAR szFullPath[_MAX_PATH];
|
|
DWORD dwMSVer, dwLSVer = 0;
|
|
TCHAR szLocalizedVersion[100] = _T("");
|
|
|
|
// get the c:\winnt\system32 dir
|
|
if (0 == GetSystemDirectory(szSystemDir, _MAX_PATH))
|
|
{goto GetASPNETSystemDir_Exit;}
|
|
|
|
// Tack on the filename
|
|
_stprintf(szFullPath, _T("%s\\mscoree.dll"),szSystemDir);
|
|
|
|
// get the fileversion.
|
|
if (TRUE != IsFileExist(szFullPath))
|
|
{goto GetASPNETSystemDir_Exit;}
|
|
|
|
MyGetVersionFromFile(szFullPath, &dwMSVer, &dwLSVer, szLocalizedVersion);
|
|
if (dwMSVer != 0)
|
|
{
|
|
// create the path
|
|
// "C:\WINDOWS\Microsoft.NET\Framework\v1.0.3119\"
|
|
if (0 == GetWindowsDirectory(szSystemDir, _MAX_PATH))
|
|
{goto GetASPNETSystemDir_Exit;}
|
|
|
|
_stprintf(lpszDir, _T("%s\\Microsoft.NET\\Framework\\v%d.%d.%d\\"),szSystemDir,HIWORD(dwMSVer), LOWORD(dwMSVer), HIWORD(dwLSVer));
|
|
bRet = TRUE;
|
|
}
|
|
}
|
|
|
|
GetASPNETSystemDir_Exit:
|
|
if (hMsCoreeDll){FreeLibrary(hMsCoreeDll);}
|
|
return bRet;
|
|
}
|
|
|
|
// UpdateAnonymousUsers
|
|
//
|
|
// Update the inf, with the correct users for removal.
|
|
//
|
|
BOOL
|
|
UpdateAnonymousUsers( HINF InfHandle )
|
|
{
|
|
TSTR strData;
|
|
TSTR strPassword;
|
|
TSTR strAnonymousPrefix;
|
|
BOOL bGuestIsSet = FALSE;
|
|
|
|
if ( !strData.Resize( MAX_PATH ) ||
|
|
!strPassword.Resize( MAX_PATH ) ||
|
|
!strAnonymousPrefix.LoadString( IDS_GUEST_NAME ) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if ( GetDataFromMetabase(METABASEPATH_WWW_ROOT, MD_ANONYMOUS_USER_NAME, (PBYTE)strData.QueryStr(), strData.QuerySize()))
|
|
{
|
|
// Set WWW Info
|
|
g_pTheApp->m_csWWWAnonyName_Remove = strData.QueryStr();
|
|
|
|
if ( g_pTheApp->IsUpgrade() &&
|
|
( _tcsnicmp( strAnonymousPrefix.QueryStr(),
|
|
strData.QueryStr(),
|
|
_tcslen( strAnonymousPrefix.QueryStr() ) ) == 0 ) &&
|
|
GetDataFromMetabase( METABASEPATH_WWW_ROOT,
|
|
MD_ANONYMOUS_PWD,
|
|
(PBYTE)strPassword.QueryStr(),
|
|
strPassword.QuerySize() )
|
|
)
|
|
{
|
|
// The username here is the anonymous user, so lets use it, instead of our
|
|
// newly created one (machines names may have changed)
|
|
g_pTheApp->m_csWWWAnonyName = strData.QueryStr();
|
|
g_pTheApp->m_csGuestName = strData.QueryStr();
|
|
g_pTheApp->m_csGuestPassword = strPassword.QueryStr();
|
|
g_pTheApp->m_csWWWAnonyPassword = strPassword.QueryStr();
|
|
bGuestIsSet = TRUE;
|
|
}
|
|
}
|
|
|
|
if ( GetDataFromMetabase(_T("LM/MSFTPSVC"), MD_ANONYMOUS_USER_NAME, (PBYTE)strData.QueryStr(), strData.QuerySize()))
|
|
{
|
|
// Set FTP Info
|
|
g_pTheApp->m_csFTPAnonyName_Remove = strData.QueryStr();
|
|
|
|
if ( g_pTheApp->IsUpgrade() &&
|
|
( _tcsnicmp( strAnonymousPrefix.QueryStr(),
|
|
strData.QueryStr(),
|
|
_tcslen( strAnonymousPrefix.QueryStr() ) ) == 0 ) &&
|
|
GetDataFromMetabase( _T("LM/MSFTPSVC"),
|
|
MD_ANONYMOUS_PWD,
|
|
(PBYTE)strPassword.QueryStr(),
|
|
strPassword.QuerySize())
|
|
)
|
|
{
|
|
// The username here is the anonymous FTP user, so lets use it, instead of our
|
|
// newly created one (machines names may have changed)
|
|
g_pTheApp->m_csFTPAnonyName = strData.QueryStr();
|
|
g_pTheApp->m_csFTPAnonyPassword = strPassword.QueryStr();
|
|
|
|
if ( !bGuestIsSet )
|
|
{
|
|
g_pTheApp->m_csGuestName = strData.QueryStr();
|
|
g_pTheApp->m_csGuestPassword = strPassword.QueryStr();
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( GetDataFromMetabase(METABASEPATH_WWW_ROOT, MD_WAM_USER_NAME, (PBYTE)strData.QueryStr(), strData.QuerySize()))
|
|
{
|
|
g_pTheApp->m_csWAMAccountName_Remove = strData.QueryStr();
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// this will be called during oc_init
|
|
// and right before oc_complete and oc_about_to_commit_queue
|
|
void SetDIRIDforThisInf(HINF InfHandle,BOOL bOCInit)
|
|
{
|
|
BOOL bTempFlag = FALSE;
|
|
TCHAR szTempDir[_MAX_PATH];
|
|
|
|
// set everything if bOCInit is specified.
|
|
// but if it's not specified then
|
|
// set ID's which were not available at oc_init time...
|
|
GetASPNETSystemDir(szTempDir);
|
|
bTempFlag = SetupSetDirectoryId_Wrapper(InfHandle, 32781, szTempDir);
|
|
|
|
if (FALSE == bOCInit)
|
|
{
|
|
g_pTheApp->ReGetMachineAndAccountNames();
|
|
CString csMachineName = g_pTheApp->m_csMachineName.Right(g_pTheApp->m_csMachineName.GetLength() - 2);
|
|
SetupSetStringId_Wrapper(g_pTheApp->m_hInfHandle, 32800, csMachineName);
|
|
|
|
UpdateAnonymousUsers( InfHandle );
|
|
|
|
if ( _tcsicmp(g_pTheApp->m_csWAMAccountName_Remove, _T("")) == 0)
|
|
{g_pTheApp->m_csWAMAccountName_Remove = g_pTheApp->m_csWAMAccountName;}
|
|
SetupSetStringId_Wrapper(InfHandle, 33004, g_pTheApp->m_csWAMAccountName_Remove);
|
|
|
|
if ( _tcsicmp(g_pTheApp->m_csWWWAnonyName_Remove, _T("")) == 0)
|
|
{g_pTheApp->m_csWWWAnonyName_Remove = g_pTheApp->m_csWWWAnonyName; }
|
|
SetupSetStringId_Wrapper(InfHandle, 33005, g_pTheApp->m_csWWWAnonyName_Remove);
|
|
|
|
if ( _tcsicmp(g_pTheApp->m_csWWWAnonyName_Remove, _T("")) == 0)
|
|
{g_pTheApp->m_csFTPAnonyName_Remove = g_pTheApp->m_csFTPAnonyName;}
|
|
SetupSetStringId_Wrapper(InfHandle, 33006, g_pTheApp->m_csFTPAnonyName_Remove);
|
|
|
|
SetupSetStringId_Wrapper(InfHandle, 33000, g_pTheApp->m_csGuestName);
|
|
SetupSetStringId_Wrapper(InfHandle, 33002, g_pTheApp->m_csWWWAnonyName);
|
|
SetupSetStringId_Wrapper(InfHandle, 33003, g_pTheApp->m_csFTPAnonyName);
|
|
}
|
|
else
|
|
{
|
|
// Create Directory IDs for the coresponding .inf file
|
|
bTempFlag = SetupSetDirectoryId_Wrapper(InfHandle, 32768, g_pTheApp->m_csPathInetsrv);
|
|
bTempFlag = SetupSetDirectoryId_Wrapper(InfHandle, 32769, g_pTheApp->m_csPathFTPRoot);
|
|
bTempFlag = SetupSetDirectoryId_Wrapper(InfHandle, 32770, g_pTheApp->m_csPathWWWRoot);
|
|
bTempFlag = SetupSetDirectoryId_Wrapper(InfHandle, 32771, g_pTheApp->m_csPathIISSamples);
|
|
bTempFlag = SetupSetDirectoryId_Wrapper(InfHandle, 32772, g_pTheApp->m_csPathScripts);
|
|
bTempFlag = SetupSetDirectoryId_Wrapper(InfHandle, 32773, g_pTheApp->m_csPathInetpub);
|
|
bTempFlag = SetupSetDirectoryId_Wrapper(InfHandle, 32774, g_pTheApp->m_csPathOldInetsrv);
|
|
bTempFlag = SetupSetDirectoryId_Wrapper(InfHandle, 32780, g_pTheApp->m_csSysDrive);
|
|
|
|
if (g_pTheApp->m_eUpgradeType == UT_10_W95)
|
|
{
|
|
bTempFlag = SetupSetDirectoryId_Wrapper(InfHandle, 32775, g_pTheApp->m_csPathOldPWSFiles);
|
|
bTempFlag = SetupSetDirectoryId_Wrapper(InfHandle, 32776, g_pTheApp->m_csPathOldPWSSystemFiles);
|
|
}
|
|
|
|
GetJavaTLD(szTempDir);
|
|
bTempFlag = SetupSetDirectoryId_Wrapper(InfHandle, 32778, szTempDir);
|
|
SetupSetDirectoryId_Wrapper(InfHandle, 32777, g_pTheApp->m_csPathProgramFiles);
|
|
|
|
SetupSetDirectoryId_Wrapper(InfHandle, 32779, g_pTheApp->m_csPathWebPub);
|
|
|
|
if (g_pTheApp->m_eUpgradeType == UT_NONE){SetupSetStringId_Wrapper(InfHandle, 32801, _T("UT_NONE"));}
|
|
if (g_pTheApp->m_eUpgradeType == UT_351){SetupSetStringId_Wrapper(InfHandle, 32801, _T("UT_351"));}
|
|
if (g_pTheApp->m_eUpgradeType == UT_10){SetupSetStringId_Wrapper(InfHandle, 32801, _T("UT_10"));}
|
|
if (g_pTheApp->m_eUpgradeType == UT_20){SetupSetStringId_Wrapper(InfHandle, 32801, _T("UT_20"));}
|
|
if (g_pTheApp->m_eUpgradeType == UT_30){SetupSetStringId_Wrapper(InfHandle, 32801, _T("UT_30"));}
|
|
if (g_pTheApp->m_eUpgradeType == UT_40){SetupSetStringId_Wrapper(InfHandle, 32801, _T("UT_40"));} // can also be from win95
|
|
if (g_pTheApp->m_eUpgradeType == UT_50){SetupSetStringId_Wrapper(InfHandle, 32801, _T("UT_50"));}
|
|
if (g_pTheApp->m_eUpgradeType == UT_51){SetupSetStringId_Wrapper(InfHandle, 32801, _T("UT_51"));}
|
|
if (g_pTheApp->m_eUpgradeType == UT_60){SetupSetStringId_Wrapper(InfHandle, 32801, _T("UT_60"));}
|
|
if (g_pTheApp->m_eUpgradeType == UT_10_W95){SetupSetStringId_Wrapper(InfHandle, 32801, _T("UT_10_W95"));}
|
|
|
|
CString csMachineName = g_pTheApp->m_csMachineName.Right(g_pTheApp->m_csMachineName.GetLength() - 2);
|
|
SetupSetStringId_Wrapper(InfHandle, 32800, csMachineName);
|
|
SetupSetStringId_Wrapper(InfHandle, 32802, _T(""));
|
|
|
|
SetupSetStringId_Wrapper(InfHandle, 33000, g_pTheApp->m_csGuestName);
|
|
SetupSetStringId_Wrapper(InfHandle, 33001, g_pTheApp->m_csWAMAccountName);
|
|
SetupSetStringId_Wrapper(InfHandle, 33002, g_pTheApp->m_csWWWAnonyName);
|
|
SetupSetStringId_Wrapper(InfHandle, 33003, g_pTheApp->m_csFTPAnonyName);
|
|
|
|
if ( _tcsicmp(g_pTheApp->m_csWAMAccountName_Remove, _T("")) == 0)
|
|
{g_pTheApp->m_csWAMAccountName_Remove = g_pTheApp->m_csWAMAccountName;}
|
|
SetupSetStringId_Wrapper(InfHandle, 33004, g_pTheApp->m_csWAMAccountName_Remove);
|
|
|
|
if ( _tcsicmp(g_pTheApp->m_csWWWAnonyName_Remove, _T("")) == 0)
|
|
{g_pTheApp->m_csWWWAnonyName_Remove = g_pTheApp->m_csWWWAnonyName; }
|
|
SetupSetStringId_Wrapper(InfHandle, 33005, g_pTheApp->m_csWWWAnonyName_Remove);
|
|
|
|
if ( _tcsicmp(g_pTheApp->m_csWWWAnonyName_Remove, _T("")) == 0)
|
|
{g_pTheApp->m_csFTPAnonyName_Remove = g_pTheApp->m_csFTPAnonyName;}
|
|
SetupSetStringId_Wrapper(InfHandle, 33006, g_pTheApp->m_csFTPAnonyName_Remove);
|
|
|
|
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;
|
|
}
|
|
SetupSetStringId_Wrapper(InfHandle, 34000, szSourceCatOSName);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
BOOL GetJavaTLD(LPTSTR lpszDir)
|
|
{
|
|
CRegKey regKey(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\JAVA VM"),KEY_READ);
|
|
BOOL bFound = FALSE;
|
|
CString csValue;
|
|
CString csValue2;
|
|
int iWhere = -1;
|
|
|
|
if ((HKEY)regKey)
|
|
{
|
|
regKey.m_iDisplayWarnings = FALSE;
|
|
if (regKey.QueryValue(_T("TrustedLibsDirectory"), csValue) == ERROR_SUCCESS) {bFound = TRUE;}
|
|
// Warning: we are expecting something like this = "C:\WINNT\java\trustlib"
|
|
// However, recently 12/18 the nt5 "java vm" setup seems to be hosing and passing us:
|
|
// %systemroot%\java\trustlib
|
|
|
|
if (-1 != csValue.Find(_T('%')) )
|
|
{
|
|
// there is a '%' in the string
|
|
TCHAR szTempDir[_MAX_PATH];
|
|
_tcscpy(szTempDir, csValue);
|
|
if (ExpandEnvironmentStrings( (LPCTSTR)csValue, szTempDir, sizeof(szTempDir)/sizeof(TCHAR)))
|
|
{
|
|
csValue = szTempDir;
|
|
}
|
|
}
|
|
/*
|
|
// if we see %systemroot% in there then, i'm going to substitute WinDir in place of %Systemroot%
|
|
csValue.MakeUpper();
|
|
if (csValue.Find(_T("%SYSTEMROOT%")) != (-1) )
|
|
{
|
|
// We Found the cheesy %systemroot% deal. Now replace it with the real systemroot
|
|
iWhere = csValue.Find(_T("%SYSTEMROOT%"));
|
|
iWhere = iWhere + _tcslen(_T("%SYSTEMROOT%"));
|
|
csValue2 = g_pTheApp->m_csWinDir + csValue.Right( csValue.GetLength() - (iWhere) );
|
|
csValue = csValue2;
|
|
}
|
|
*/
|
|
}
|
|
|
|
if (!bFound) {csValue = g_pTheApp->m_csWinDir + _T("\\Java\\TrustLib");}
|
|
_tcscpy(lpszDir, csValue);
|
|
return bFound;
|
|
}
|
|
|
|
|
|
void ShowStateOfTheseServices(IN HINF hFile)
|
|
{
|
|
CStringList strList;
|
|
DWORD dwStatus;
|
|
|
|
iisDebugOut((LOG_TYPE_PROGRAM_FLOW, _T(" --- Display status of services which are required for IIS to run --- \n")));
|
|
|
|
TSTR strTheSection;
|
|
|
|
if ( !strTheSection.Copy( _T("VerifyServices") ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (GetSectionNameToDo(hFile, &strTheSection))
|
|
{
|
|
if (ERROR_SUCCESS == FillStrListWithListOfSections(hFile, strList, strTheSection.QueryStr() ))
|
|
{
|
|
// loop thru the list returned back
|
|
if (strList.IsEmpty() == FALSE)
|
|
{
|
|
POSITION pos;
|
|
CString csEntry;
|
|
|
|
pos = strList.GetHeadPosition();
|
|
while (pos)
|
|
{
|
|
csEntry = strList.GetAt(pos);
|
|
|
|
// Display state of this service.
|
|
dwStatus = InetQueryServiceStatus(csEntry);
|
|
switch(dwStatus)
|
|
{
|
|
case SERVICE_STOPPED:
|
|
iisDebugOut((LOG_TYPE_PROGRAM_FLOW, _T("SERVICE_STOPPED [%s].\n"), csEntry));
|
|
break;
|
|
case SERVICE_START_PENDING:
|
|
iisDebugOut((LOG_TYPE_PROGRAM_FLOW, _T("SERVICE_START_PENDING [%s].\n"), csEntry));
|
|
break;
|
|
case SERVICE_STOP_PENDING:
|
|
iisDebugOut((LOG_TYPE_PROGRAM_FLOW, _T("SERVICE_STOP_PENDING [%s].\n"), csEntry));
|
|
break;
|
|
case SERVICE_RUNNING:
|
|
iisDebugOut((LOG_TYPE_PROGRAM_FLOW, _T("SERVICE_RUNNING [%s].\n"), csEntry));
|
|
break;
|
|
case SERVICE_CONTINUE_PENDING:
|
|
iisDebugOut((LOG_TYPE_PROGRAM_FLOW, _T("SERVICE_CONTINUE_PENDING [%s].\n"), csEntry));
|
|
break;
|
|
case SERVICE_PAUSE_PENDING:
|
|
iisDebugOut((LOG_TYPE_PROGRAM_FLOW, _T("SERVICE_PAUSE_PENDING [%s].\n"), csEntry));
|
|
break;
|
|
case SERVICE_PAUSED:
|
|
iisDebugOut((LOG_TYPE_PROGRAM_FLOW, _T("SERVICE_PAUSED [%s].\n"), csEntry));
|
|
break;
|
|
}
|
|
|
|
strList.GetNext(pos);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
#define MD_SIGNATURE_STRINGA "*&$MetaData$&*"
|
|
#define MD_SIGNATURE_STRINGW L##"*&$MetaData$&*"
|
|
|
|
int IsMetabaseCorrupt(void)
|
|
{
|
|
// We've had a problem where sometimes the metabase.bin file
|
|
// gets corrupted and set to only spaces...
|
|
// so this function is here to determine where and when the metabase.bin is hosed!
|
|
int iTheMetabaseIsCorrupt = FALSE;
|
|
TCHAR szSystemDir[_MAX_PATH];
|
|
TCHAR szFullPath[_MAX_PATH];
|
|
HANDLE hReadFileHandle = INVALID_HANDLE_VALUE;
|
|
BYTE *chBuffer = NULL;
|
|
DWORD dwSize = 0;
|
|
DWORD dwWideSignatureLen = 0;
|
|
DWORD dwAnsiSignatureLen = 0;
|
|
TCHAR buf[MAX_FAKE_METABASE_STRING_LEN];
|
|
|
|
// get the c:\winnt\system32 dir
|
|
if (0 == GetSystemDirectory(szSystemDir, _MAX_PATH))
|
|
{goto IsMetabaseCorrupt_Exit;}
|
|
|
|
// Tack on the inf\iis.inf subdir and filename
|
|
_stprintf(szFullPath, _T("%s\\inetsrv\\metabase.bin"),szSystemDir);
|
|
|
|
// Check if the file exists
|
|
if (TRUE != IsFileExist(szFullPath))
|
|
{
|
|
iTheMetabaseIsCorrupt = FALSE;
|
|
// this function only works on version less than or equal to iis5
|
|
// since that's the only versions which had a metabase.bin file
|
|
// so just return that the metabase is not corrupt
|
|
goto IsMetabaseCorrupt_Exit;
|
|
}
|
|
|
|
// okay, so the metabase.bin file exists...
|
|
// let's open it and see if we can get something out of it.
|
|
|
|
//
|
|
// Open the file.
|
|
//
|
|
hReadFileHandle = CreateFile(szFullPath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
|
|
if (hReadFileHandle == INVALID_HANDLE_VALUE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("IsMetabaseCorrupt: CreateFile on %s failed with 0x%x!\n"),szFullPath,GetLastError()));
|
|
goto IsMetabaseCorrupt_Exit;
|
|
}
|
|
|
|
dwSize = GetFileSize(hReadFileHandle, NULL);
|
|
dwWideSignatureLen = sizeof(MD_SIGNATURE_STRINGW);
|
|
dwAnsiSignatureLen = sizeof(MD_SIGNATURE_STRINGA);
|
|
|
|
// get the size of the whole file
|
|
//chBuffer = (BYTE *)HeapAlloc(GetProcessHeap(), 0, dwSize+1 );
|
|
if ((dwSize) >= dwWideSignatureLen)
|
|
{
|
|
chBuffer = (BYTE *)HeapAlloc(GetProcessHeap(), 0, dwWideSignatureLen+1);
|
|
dwSize = dwWideSignatureLen+1;
|
|
}
|
|
else
|
|
{
|
|
if ( dwSize >= dwAnsiSignatureLen)
|
|
{
|
|
chBuffer = (BYTE *)HeapAlloc(GetProcessHeap(), 0, dwAnsiSignatureLen+1 );
|
|
dwSize = dwAnsiSignatureLen+1;
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("IsMetabaseCorrupt: ReadFile on %s. Not enough data in there! Less than metabase signature len!\n"),szFullPath));
|
|
// Things are not kool
|
|
// This metabase must be hosed!
|
|
iTheMetabaseIsCorrupt = FALSE;
|
|
goto IsMetabaseCorrupt_Exit;
|
|
}
|
|
}
|
|
|
|
if (!chBuffer)
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("IsMetabaseCorrupt: HeapAlloc failed to get %d space.\n"),dwWideSignatureLen+1));
|
|
goto IsMetabaseCorrupt_Exit;
|
|
}
|
|
|
|
SetFilePointer(hReadFileHandle,0,0,FILE_BEGIN);
|
|
|
|
// kool, try to read the file
|
|
if (0 == ReadFile(hReadFileHandle, chBuffer, dwSize, &dwSize, NULL))
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("IsMetabaseCorrupt: ReadFile on %s failed with 0x%x!. size=%d\n"),szFullPath,GetLastError(),dwSize));
|
|
goto IsMetabaseCorrupt_Exit;
|
|
}
|
|
|
|
//
|
|
// take chBuffer and check if it matches the unicode/ansi signature.
|
|
//
|
|
if (0 == memcmp(MD_SIGNATURE_STRINGW,chBuffer,dwWideSignatureLen))
|
|
{
|
|
// things are kool, and this metabase should not be hosed.
|
|
iTheMetabaseIsCorrupt = FALSE;
|
|
goto IsMetabaseCorrupt_Exit;
|
|
}
|
|
if (0 == memcmp(MD_SIGNATURE_STRINGA,chBuffer,dwAnsiSignatureLen))
|
|
{
|
|
// if not, then check if it matches the ansi signature.
|
|
// things are kool, and this metabase should not be hosed.
|
|
iTheMetabaseIsCorrupt = FALSE;
|
|
goto IsMetabaseCorrupt_Exit;
|
|
}
|
|
|
|
// on other check...
|
|
// in iis6 there is a dummy fake metabase.bin put there by setup
|
|
// check if this is that dummy file.
|
|
if (chBuffer)
|
|
{HeapFree(GetProcessHeap(), 0, chBuffer); chBuffer = NULL;}
|
|
|
|
memset(buf, 0, _tcslen(buf) * sizeof(TCHAR));
|
|
// this iis.dll is always compiled unicode, so
|
|
// we know that buf is unicode
|
|
if (LoadString((HINSTANCE) g_MyModuleHandle, IDS_FAKE_METABASE_BIN_TEXT, buf, MAX_FAKE_METABASE_STRING_LEN))
|
|
{
|
|
dwSize = _tcslen(buf) * sizeof(TCHAR);
|
|
// add space for the FF and FE bytes
|
|
dwSize = dwSize + 2;
|
|
|
|
// open the file
|
|
SetFilePointer(hReadFileHandle,0,0,FILE_BEGIN);
|
|
|
|
chBuffer = (BYTE *)HeapAlloc(GetProcessHeap(), 0, dwSize);
|
|
|
|
// kool, try to read the file
|
|
if (0 == ReadFile(hReadFileHandle, chBuffer, dwSize, &dwSize, NULL))
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("IsMetabaseCorrupt: ReadFile on %s failed with 0x%x!. size=%d\n"),szFullPath,GetLastError(),dwSize));
|
|
goto IsMetabaseCorrupt_Exit;
|
|
}
|
|
|
|
// check if the input file is unicode
|
|
if (0xFF == chBuffer[0] && 0xFE == chBuffer[1])
|
|
{
|
|
// skip past these characters
|
|
chBuffer++;
|
|
chBuffer++;
|
|
|
|
// Compare what you got with what we think is in there
|
|
if (0 == memcmp(buf,chBuffer,dwSize))
|
|
{
|
|
// things are kool, and this metabase should not be hosed.
|
|
chBuffer--;
|
|
chBuffer--;
|
|
iTheMetabaseIsCorrupt = FALSE;
|
|
goto IsMetabaseCorrupt_Exit;
|
|
}
|
|
chBuffer--;
|
|
chBuffer--;
|
|
}
|
|
}
|
|
|
|
// if not then, it must be corrupt!
|
|
// Things are not kool
|
|
// This metabase must be hosed!
|
|
iTheMetabaseIsCorrupt = TRUE;
|
|
iisDebugOut((LOG_TYPE_WARN, _T("IsMetabaseCorrupt: unable to verify signature in Metabase.bin. Corrupt.\n")));
|
|
|
|
IsMetabaseCorrupt_Exit:
|
|
if (chBuffer)
|
|
{HeapFree(GetProcessHeap(), 0, chBuffer);}
|
|
if (hReadFileHandle != INVALID_HANDLE_VALUE)
|
|
{CloseHandle(hReadFileHandle);}
|
|
return iTheMetabaseIsCorrupt;
|
|
}
|
|
|
|
|
|
void iisDebugOut_Start(TCHAR *pszString, int iLogType)
|
|
{
|
|
iisDebugOut((iLogType, _T("%s:Start.\n"),pszString));
|
|
return;
|
|
}
|
|
void iisDebugOut_Start1(TCHAR *pszString1, TCHAR *pszString2, int iLogType)
|
|
{
|
|
iisDebugOut((iLogType, _T("%s:(%s)Start.\n"),pszString1,pszString2));
|
|
return;
|
|
}
|
|
void iisDebugOut_Start1(TCHAR *pszString1, CString pszString2, int iLogType)
|
|
{
|
|
iisDebugOut((iLogType, _T("%s:(%s)Start.\n"),pszString1,pszString2));
|
|
return;
|
|
}
|
|
void iisDebugOut_End(TCHAR *pszString, int iLogType)
|
|
{
|
|
iisDebugOut((iLogType, _T("%s:End.\n"),pszString));
|
|
return;
|
|
}
|
|
void iisDebugOut_End1(TCHAR *pszString1, TCHAR *pszString2, int iLogType)
|
|
{
|
|
iisDebugOut((iLogType, _T("%s(%s):End.\n"),pszString1, pszString2));
|
|
return;
|
|
}
|
|
void iisDebugOut_End1(TCHAR *pszString1, CString pszString2, int iLogType)
|
|
{
|
|
iisDebugOut((iLogType, _T("%s(%s):End.\n"),pszString1,pszString2));
|
|
return;
|
|
}
|
|
|
|
|
|
BOOL SetupFindFirstLine_Wrapped(
|
|
IN HINF InfHandle,
|
|
IN LPCTSTR Section,
|
|
IN LPCTSTR Key, OPTIONAL
|
|
INFCONTEXT *Context
|
|
)
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
BOOL bGoGetWhatTheyOriginallyWanted = TRUE;
|
|
|
|
// check for the alternate .inf file
|
|
if (g_pTheApp->m_hInfHandleAlternate && InfHandle != g_pTheApp->m_hInfHandleAlternate)
|
|
{
|
|
bReturn = SetupFindFirstLine(g_pTheApp->m_hInfHandleAlternate, Section, Key, Context);
|
|
if (bReturn)
|
|
{
|
|
iisDebugOut((LOG_TYPE_PROGRAM_FLOW, _T("Using alternate iis.inf section:[%s]"),Section));
|
|
bGoGetWhatTheyOriginallyWanted = FALSE;
|
|
}
|
|
}
|
|
|
|
if (bGoGetWhatTheyOriginallyWanted)
|
|
{bReturn = SetupFindFirstLine(InfHandle, Section, Key, Context);}
|
|
|
|
return bReturn;
|
|
}
|
|
|
|
|
|
int ReadUserConfigurable(HINF InfHandle)
|
|
{
|
|
int iReturn = TRUE;
|
|
INFCONTEXT Context;
|
|
TCHAR szTempString[_MAX_PATH] = _T("");
|
|
DWORD dwValue = 0x0;
|
|
|
|
DWORD dwSomethingSpecifiedHere = 0;
|
|
|
|
|
|
//
|
|
// Get the IUSR name
|
|
//
|
|
_tcscpy(szTempString, _T(""));
|
|
if (SetupFindFirstLine_Wrapped(InfHandle, _T("SetupConfig"), _T("IUSR"), &Context) )
|
|
{
|
|
if (SetupGetStringField(&Context, 1, szTempString, _MAX_PATH, NULL))
|
|
{
|
|
// WARNING: these values can be changed by a user supplied unattend file
|
|
// The User defined unattend file takes precidence over these!
|
|
if (!(g_pTheApp->dwUnattendConfig & USER_SPECIFIED_INFO_WWW_USER_NAME))
|
|
{
|
|
g_pTheApp->m_csWWWAnonyName_Unattend = szTempString;
|
|
dwSomethingSpecifiedHere |= USER_SPECIFIED_INFO_WWW_USER_NAME;
|
|
//g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_WWW_USER_NAME;
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("Custom iusr specified for www\n")));
|
|
}
|
|
|
|
if (!(g_pTheApp->dwUnattendConfig & USER_SPECIFIED_INFO_FTP_USER_NAME))
|
|
{
|
|
g_pTheApp->m_csFTPAnonyName_Unattend = szTempString;
|
|
dwSomethingSpecifiedHere |= USER_SPECIFIED_INFO_FTP_USER_NAME;
|
|
//g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_FTP_USER_NAME;
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("Custom iusr specified for ftp\n")));
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
// this stuff should not be configurable from the iis.inf file
|
|
|
|
//
|
|
// Get the IUSR password
|
|
//
|
|
_tcscpy(szTempString, _T(""));
|
|
if (SetupFindFirstLine_Wrapped(InfHandle, _T("SetupConfig"), _T("IUSR_PASS"), &Context) )
|
|
{
|
|
if (SetupGetStringField(&Context, 1, szTempString, _MAX_PATH, NULL))
|
|
{
|
|
// WARNING: these values can be changed by a user supplied unattend file
|
|
// The User defined unattend file takes precidence over these!
|
|
if (!(g_pTheApp->dwUnattendConfig & USER_SPECIFIED_INFO_WWW_USER_PASS))
|
|
{
|
|
if (_tcsicmp(szTempString, _T("")) != 0)
|
|
{
|
|
if (_tcsicmp(szTempString, _T("(blank)")) == 0)
|
|
{
|
|
_tcscpy(szTempString, _T(""));
|
|
}
|
|
g_pTheApp->m_csWWWAnonyPassword_Unattend = szTempString;
|
|
dwSomethingSpecifiedHere |= USER_SPECIFIED_INFO_WWW_USER_PASS;
|
|
//g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_WWW_USER_PASS;
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("Custom iusr pass specified for www\n")));
|
|
}
|
|
}
|
|
|
|
if (!(g_pTheApp->dwUnattendConfig & USER_SPECIFIED_INFO_FTP_USER_PASS))
|
|
{
|
|
if (_tcsicmp(szTempString, _T("")) != 0)
|
|
{
|
|
if (_tcsicmp(szTempString, _T("(blank)")) == 0)
|
|
{
|
|
_tcscpy(szTempString, _T(""));
|
|
}
|
|
g_pTheApp->m_csFTPAnonyPassword_Unattend = szTempString;
|
|
|
|
dwSomethingSpecifiedHere |= USER_SPECIFIED_INFO_FTP_USER_PASS;
|
|
//g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_FTP_USER_PASS;
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("Custom iusr pass specified for ftp\n")));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
|
|
//
|
|
// Get the IUSR name for WWW
|
|
//
|
|
_tcscpy(szTempString, _T(""));
|
|
if (SetupFindFirstLine_Wrapped(InfHandle, _T("SetupConfig"), _T("IUSR_WWW"), &Context) )
|
|
{
|
|
if (SetupGetStringField(&Context, 1, szTempString, _MAX_PATH, NULL))
|
|
{
|
|
// WARNING: these values can be changed by a user supplied unattend file
|
|
// The User defined unattend file takes precidence over these!
|
|
if (!(g_pTheApp->dwUnattendConfig & USER_SPECIFIED_INFO_WWW_USER_NAME))
|
|
{
|
|
g_pTheApp->m_csWWWAnonyName_Unattend = szTempString;
|
|
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_WWW_USER_NAME;
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("Custom iusr specified for www\n")));
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
// this stuff should not be configurable from the iis.inf file
|
|
|
|
//
|
|
// Get the IUSR pass for WWW
|
|
//
|
|
_tcscpy(szTempString, _T(""));
|
|
if (SetupFindFirstLine_Wrapped(InfHandle, _T("SetupConfig"), _T("IUSR_WWW_PASS"), &Context) )
|
|
{
|
|
if (SetupGetStringField(&Context, 1, szTempString, _MAX_PATH, NULL))
|
|
{
|
|
// WARNING: these values can be changed by a user supplied unattend file
|
|
// The User defined unattend file takes precidence over these!
|
|
if (!(g_pTheApp->dwUnattendConfig & USER_SPECIFIED_INFO_WWW_USER_PASS))
|
|
{
|
|
if (_tcsicmp(szTempString, _T("")) != 0)
|
|
{
|
|
if (_tcsicmp(szTempString, _T("(blank)")) == 0)
|
|
{
|
|
_tcscpy(szTempString, _T(""));
|
|
}
|
|
g_pTheApp->m_csWWWAnonyPassword_Unattend = szTempString;
|
|
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_WWW_USER_PASS;
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("Custom iusr pass specified for www\n")));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
//
|
|
// Get the IUSR name for FTP
|
|
//
|
|
_tcscpy(szTempString, _T(""));
|
|
if (SetupFindFirstLine_Wrapped(InfHandle, _T("SetupConfig"), _T("IUSR_FTP"), &Context) )
|
|
{
|
|
if (SetupGetStringField(&Context, 1, szTempString, _MAX_PATH, NULL))
|
|
{
|
|
// WARNING: these values can be changed by a user supplied unattend file
|
|
// The User defined unattend file takes precidence over these!
|
|
if (!(g_pTheApp->dwUnattendConfig & USER_SPECIFIED_INFO_FTP_USER_NAME))
|
|
{
|
|
g_pTheApp->m_csFTPAnonyName_Unattend = szTempString;
|
|
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_FTP_USER_NAME;
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("Custom iusr specified for ftp\n")));
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
// this stuff should not be configurable from the iis.inf file
|
|
|
|
//
|
|
// Get the IUSR password for FTP
|
|
//
|
|
_tcscpy(szTempString, _T(""));
|
|
if (SetupFindFirstLine_Wrapped(InfHandle, _T("SetupConfig"), _T("IUSR_FTP_PASS"), &Context) )
|
|
{
|
|
if (SetupGetStringField(&Context, 1, szTempString, _MAX_PATH, NULL))
|
|
{
|
|
// WARNING: these values can be changed by a user supplied unattend file
|
|
// The User defined unattend file takes precidence over these!
|
|
if (!(g_pTheApp->dwUnattendConfig & USER_SPECIFIED_INFO_FTP_USER_PASS))
|
|
{
|
|
if (_tcsicmp(szTempString, _T("")) != 0)
|
|
{
|
|
if (_tcsicmp(szTempString, _T("(blank)")) == 0)
|
|
{
|
|
_tcscpy(szTempString, _T(""));
|
|
}
|
|
g_pTheApp->m_csFTPAnonyPassword_Unattend = szTempString;
|
|
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_FTP_USER_PASS;
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("Custom iusr pass specified for ftp\n")));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
|
|
//
|
|
// Get the WAM username
|
|
//
|
|
_tcscpy(szTempString, _T(""));
|
|
if (SetupFindFirstLine_Wrapped(InfHandle, _T("SetupConfig"), _T("IWAM"), &Context) )
|
|
{
|
|
if (SetupGetStringField(&Context, 1, szTempString, _MAX_PATH, NULL))
|
|
{
|
|
// WARNING: these values can be changed by a user supplied unattend file
|
|
// The User defined unattend file takes precidence over these!
|
|
if (!(g_pTheApp->dwUnattendConfig & USER_SPECIFIED_INFO_WAM_USER_NAME))
|
|
{
|
|
g_pTheApp->m_csWAMAccountName_Unattend = szTempString;
|
|
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_WAM_USER_NAME;
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("Custom iwam specified for www\n")));
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
// this stuff should not be configurable from the iis.inf file
|
|
//
|
|
|
|
// Get the WAM password
|
|
//
|
|
_tcscpy(szTempString, _T(""));
|
|
if (SetupFindFirstLine_Wrapped(InfHandle, _T("SetupConfig"), _T("IWAM_PASS"), &Context) )
|
|
{
|
|
if (SetupGetStringField(&Context, 1, szTempString, _MAX_PATH, NULL))
|
|
{
|
|
// WARNING: these values can be changed by a user supplied unattend file
|
|
// The User defined unattend file takes precidence over these!
|
|
if (!(g_pTheApp->dwUnattendConfig & USER_SPECIFIED_INFO_WAM_USER_PASS))
|
|
{
|
|
if (_tcsicmp(szTempString, _T("")) != 0)
|
|
{
|
|
if (_tcsicmp(szTempString, _T("(blank)")) == 0)
|
|
{
|
|
_tcscpy(szTempString, _T(""));
|
|
}
|
|
g_pTheApp->m_csWAMAccountPassword_Unattend = szTempString;
|
|
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_WAM_USER_PASS;
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("Custom iwam pass specified for www\n")));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
*/
|
|
|
|
//
|
|
// Get Path for Inetpub
|
|
//
|
|
_tcscpy(szTempString, _T(""));
|
|
if (SetupFindFirstLine_Wrapped(InfHandle, _T("SetupConfig"), _T("PathInetpub"), &Context) )
|
|
{
|
|
if (SetupGetStringField(&Context, 1, szTempString, _MAX_PATH, NULL))
|
|
{
|
|
// WARNING: these values can be changed by a user supplied unattend file
|
|
// The User defined unattend file takes precidence over these!
|
|
if (!(g_pTheApp->dwUnattendConfig & USER_SPECIFIED_INFO_PATH_INETPUB))
|
|
{
|
|
if (_tcsicmp(szTempString, _T("")) != 0)
|
|
{
|
|
if (IsValidDirectoryName(szTempString))
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("Custom PathInetpub=%s\n"),szTempString));
|
|
g_pTheApp->m_csPathInetpub = szTempString;
|
|
g_pTheApp->SetInetpubDerivatives();
|
|
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_PATH_INETPUB;
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("Custom PathInetpub specified (%s), however path not valid.ignoring unattend value. WARNING.\n"),szTempString));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Get Path for ftp root
|
|
//
|
|
_tcscpy(szTempString, _T(""));
|
|
if (SetupFindFirstLine_Wrapped(InfHandle, _T("SetupConfig"), _T("PathFTPRoot"), &Context) )
|
|
{
|
|
if (SetupGetStringField(&Context, 1, szTempString, _MAX_PATH, NULL))
|
|
{
|
|
// WARNING: these values can be changed by a user supplied unattend file
|
|
// The User defined unattend file takes precidence over these!
|
|
if (!(g_pTheApp->dwUnattendConfig & USER_SPECIFIED_INFO_PATH_FTP))
|
|
{
|
|
if (_tcsicmp(szTempString, _T("")) != 0)
|
|
{
|
|
if (IsValidDirectoryName(szTempString))
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("Custom PathFTPRoot=%s\n"),szTempString));
|
|
CustomFTPRoot(szTempString);
|
|
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_PATH_FTP;
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("Custom PathFTPRoot specified (%s), however path not valid.ignoring unattend value. WARNING.\n"),szTempString));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Get Path for www root
|
|
//
|
|
_tcscpy(szTempString, _T(""));
|
|
if (SetupFindFirstLine_Wrapped(InfHandle, _T("SetupConfig"), _T("PathWWWRoot"), &Context) )
|
|
{
|
|
if (SetupGetStringField(&Context, 1, szTempString, _MAX_PATH, NULL))
|
|
{
|
|
// WARNING: these values can be changed by a user supplied unattend file
|
|
// The User defined unattend file takes precidence over these!
|
|
if (!(g_pTheApp->dwUnattendConfig & USER_SPECIFIED_INFO_PATH_WWW))
|
|
{
|
|
if (_tcsicmp(szTempString, _T("")) != 0)
|
|
{
|
|
if (IsValidDirectoryName(szTempString))
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("Custom PathWWWRoot=%s\n"),szTempString));
|
|
CustomWWWRoot(szTempString);
|
|
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_PATH_WWW;
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("Custom PathWWWRoot specified (%s), however path not valid.ignoring unattend value. WARNING.\n"),szTempString));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//ReadUserConfigurable_Exit:
|
|
if (dwSomethingSpecifiedHere & USER_SPECIFIED_INFO_WWW_USER_NAME){g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_WWW_USER_NAME;}
|
|
if (dwSomethingSpecifiedHere & USER_SPECIFIED_INFO_FTP_USER_NAME){g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_FTP_USER_NAME;}
|
|
if (dwSomethingSpecifiedHere & USER_SPECIFIED_INFO_WWW_USER_PASS){g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_WWW_USER_PASS;}
|
|
if (dwSomethingSpecifiedHere & USER_SPECIFIED_INFO_FTP_USER_PASS){g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_FTP_USER_PASS;}
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
INT IsThisOnNotStopList(IN HINF hFile, CString csInputName, BOOL bServiceFlag)
|
|
{
|
|
INT iReturn = FALSE;
|
|
CStringList strList;
|
|
TSTR strTheSection;
|
|
|
|
// if the entry is not a service name,
|
|
// then it must be a process filename,
|
|
// so make sure to get just the end of it
|
|
if (!bServiceFlag)
|
|
{
|
|
TCHAR szJustTheFileName[_MAX_FNAME];
|
|
// make sure to get only just the filename.
|
|
if (TRUE == ReturnFileNameOnly(csInputName, szJustTheFileName))
|
|
{
|
|
csInputName = szJustTheFileName;
|
|
}
|
|
}
|
|
|
|
if ( strTheSection.Copy( _T("NonStopList") ) &&
|
|
GetSectionNameToDo(hFile, &strTheSection)
|
|
)
|
|
{
|
|
if (ERROR_SUCCESS == FillStrListWithListOfSections(hFile, strList, strTheSection.QueryStr() ))
|
|
{
|
|
// loop thru the list returned back
|
|
if (strList.IsEmpty() == FALSE)
|
|
{
|
|
POSITION pos;
|
|
CString csEntry;
|
|
|
|
pos = strList.GetHeadPosition();
|
|
while (pos)
|
|
{
|
|
csEntry = strList.GetAt(pos);
|
|
|
|
// check if this entry matchs the entry that was passed in...
|
|
if (_tcsicmp(csEntry, csInputName) == 0)
|
|
{
|
|
// it matches so return TRUE;
|
|
iReturn = TRUE;
|
|
goto IsThisOnNotStopList_Exit;
|
|
}
|
|
|
|
strList.GetNext(pos);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
IsThisOnNotStopList_Exit:
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
HRESULT MofCompile(TCHAR * szPathMofFile)
|
|
{
|
|
HRESULT hRes = E_FAIL;
|
|
WCHAR wszFileName[_MAX_PATH];
|
|
IMofCompiler *pMofComp = NULL;
|
|
WBEM_COMPILE_STATUS_INFO Info;
|
|
|
|
hRes = CoInitialize(NULL);
|
|
if (FAILED(hRes))
|
|
{
|
|
goto MofCompile_Exit;
|
|
}
|
|
|
|
hRes = CoCreateInstance( CLSID_MofCompiler, NULL, CLSCTX_INPROC_SERVER, IID_IMofCompiler, (LPVOID *)&pMofComp);
|
|
if (FAILED(hRes))
|
|
{
|
|
goto MofCompile_Exit;
|
|
}
|
|
|
|
// Ensure that the string is WCHAR.
|
|
#if defined(UNICODE) || defined(_UNICODE)
|
|
_tcscpy(wszFileName, szPathMofFile);
|
|
#else
|
|
MultiByteToWideChar( CP_ACP, 0, szPathMofFile, -1, wszFileName, _MAX_PATH);
|
|
#endif
|
|
|
|
pMofComp->CompileFile (
|
|
(LPWSTR) wszFileName,
|
|
NULL, // load into namespace specified in MOF file
|
|
NULL, // use default User
|
|
NULL, // use default Authority
|
|
NULL, // use default Password
|
|
0, // no options
|
|
0, // no class flags
|
|
0, // no instance flags
|
|
&Info);
|
|
|
|
pMofComp->Release();
|
|
CoUninitialize();
|
|
|
|
MofCompile_Exit:
|
|
return hRes;
|
|
}
|
|
|
|
|
|
DWORD DoesEntryPointExist(LPCTSTR lpszDLLFile, LPCTSTR lpszProcedure)
|
|
{
|
|
DWORD dwReturn = ERROR_FILE_NOT_FOUND;
|
|
HINSTANCE hDll = NULL;
|
|
HCRET hProc = NULL;
|
|
TCHAR szDirName[_MAX_PATH], szFilePath[_MAX_PATH];
|
|
_tcscpy(szDirName, _T(""));
|
|
|
|
// Check if the file exists
|
|
if (!IsFileExist(lpszDLLFile))
|
|
{
|
|
dwReturn = ERROR_FILE_NOT_FOUND;
|
|
goto DoesEntryPointExist_Exit;
|
|
}
|
|
|
|
// Change Directory
|
|
GetCurrentDirectory( _MAX_PATH, szDirName );
|
|
InetGetFilePath(lpszDLLFile, szFilePath);
|
|
|
|
// Change to The Drive.
|
|
if (-1 == _chdrive( _totupper(szFilePath[0]) - 'A' + 1 )) {}
|
|
if (SetCurrentDirectory(szFilePath) == 0) {}
|
|
|
|
// Try to load the module,dll,ocx.
|
|
hDll = LoadLibraryEx(lpszDLLFile, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
|
|
if (!hDll)
|
|
{
|
|
dwReturn = ERROR_FILE_NOT_FOUND;
|
|
goto DoesEntryPointExist_Exit;
|
|
}
|
|
|
|
// Ok module was successfully loaded. now let's try to get the Address of the Procedure
|
|
// Convert the function name to ascii before passing it to GetProcAddress()
|
|
char AsciiProcedureName[255];
|
|
#if defined(UNICODE) || defined(_UNICODE)
|
|
// convert to ascii
|
|
WideCharToMultiByte( CP_ACP, 0, (TCHAR *)lpszProcedure, -1, AsciiProcedureName, 255, NULL, NULL );
|
|
#else
|
|
// the is already ascii so just copy
|
|
strcpy(AsciiProcedureName, lpszProcedure);
|
|
#endif
|
|
|
|
// see if the entry point exists...
|
|
hProc = (HCRET)GetProcAddress(hDll, AsciiProcedureName);
|
|
if (!hProc)
|
|
{
|
|
// failed to load,find or whatever this function.
|
|
dwReturn = ERROR_PROC_NOT_FOUND;
|
|
goto DoesEntryPointExist_Exit;
|
|
}
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("DoesEntryPointExist:%s=true\n"),lpszProcedure));
|
|
dwReturn = ERROR_SUCCESS;
|
|
|
|
DoesEntryPointExist_Exit:
|
|
if (hDll){FreeLibrary(hDll);}
|
|
if (_tcscmp(szDirName, _T("")) != 0){SetCurrentDirectory(szDirName);}
|
|
return dwReturn;
|
|
}
|
|
|
|
|
|
void CreateDummyMetabaseBin(void)
|
|
{
|
|
TCHAR szFullPath1[_MAX_PATH];
|
|
TCHAR szFullPath2[_MAX_PATH];
|
|
HANDLE hfile = INVALID_HANDLE_VALUE;
|
|
DWORD dwBytesWritten = 0;
|
|
TCHAR buf[MAX_FAKE_METABASE_STRING_LEN];
|
|
BYTE bOneByte = 0;
|
|
|
|
// check if there is an existing metabase.bin
|
|
// if there is then rename it to a unique filename.
|
|
// if we cannot rename it because its in use or something, then leave it and get out.
|
|
_stprintf(szFullPath1, _T("%s\\metabase.bin"),g_pTheApp->m_csPathInetsrv);
|
|
if (IsFileExist(szFullPath1))
|
|
{
|
|
// Check to see how big it is.
|
|
DWORD dwFileSize = ReturnFileSize(szFullPath1);
|
|
if (dwFileSize != 0xFFFFFFFF)
|
|
{
|
|
// if it's less than 2k then it must be the fake file already (must be an upgrade)
|
|
// leave it alone and don't replace it with the dummy (since it already is the dummy)
|
|
if (dwFileSize < 2000)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
int iCount = 0;
|
|
int iFlag = FALSE;
|
|
do
|
|
{
|
|
// check if the new unique file name exists...
|
|
_stprintf(szFullPath2, _T("%s.dfu.%d"),szFullPath1,iCount);
|
|
if (!IsFileExist(szFullPath2))
|
|
{
|
|
iFlag = TRUE;
|
|
}
|
|
} while (iFlag == FALSE && iCount < 9999);
|
|
|
|
// this is a unique filename, so let's use it and
|
|
// rename the metabase.bin to it
|
|
if (!MoveFileEx(szFullPath1, szFullPath2, MOVEFILE_COPY_ALLOWED|MOVEFILE_WRITE_THROUGH|MOVEFILE_REPLACE_EXISTING))
|
|
{
|
|
// log the failure at least
|
|
iisDebugOut((LOG_TYPE_WARN, _T("CreateDummyMetabaseBin: unable to rename existing metabase.bin file\n")));
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
// Create a unicode text file named metabase.bin
|
|
// and stick some sting into it (from our setup resource)
|
|
// should be localized when localization localizes the iis.dll
|
|
memset(buf, 0, _tcslen(buf) * sizeof(TCHAR));
|
|
|
|
// this iis.dll is always compiled unicode, so
|
|
// we know that buf is unicode
|
|
if (!LoadString((HINSTANCE) g_MyModuleHandle, IDS_FAKE_METABASE_BIN_TEXT, buf, MAX_FAKE_METABASE_STRING_LEN))
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("LoadString(%d) Failed.\n"), IDS_FAKE_METABASE_BIN_TEXT));
|
|
return;
|
|
}
|
|
DeleteFile(szFullPath1);
|
|
|
|
// create the new metabase.bin file
|
|
hfile = CreateFile((LPTSTR)szFullPath1, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
if( hfile == INVALID_HANDLE_VALUE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("CreateDummyMetabaseBin:CreateFile on %s failed with 0x%x!\n"),szFullPath1,GetLastError()));
|
|
return;
|
|
}
|
|
// write a couple of bytes to the beginning of the file say that it's "unicode"
|
|
bOneByte = 0xFF;
|
|
WriteFile(hfile, (LPCVOID) &bOneByte, 1, &dwBytesWritten, NULL);
|
|
bOneByte = 0xFE;
|
|
WriteFile(hfile, (LPCVOID) &bOneByte, 1, &dwBytesWritten, NULL);
|
|
if ( WriteFile( hfile, buf, _tcslen(buf) * sizeof(TCHAR), &dwBytesWritten, NULL ) == FALSE )
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_WARN, _T("WriteFile(%1!s!) Failed. Error=0x%2!x!.\n"), szFullPath1, GetLastError()));
|
|
}
|
|
|
|
CloseHandle(hfile);
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Check whether we are running as administrator on the machine
|
|
// or not
|
|
//
|
|
BOOL RunningAsAdministrator()
|
|
{
|
|
#ifdef _CHICAGO_
|
|
return TRUE;
|
|
#else
|
|
BOOL fReturn = FALSE;
|
|
PSID psidAdmin;
|
|
DWORD err;
|
|
|
|
SID_IDENTIFIER_AUTHORITY SystemSidAuthority= SECURITY_NT_AUTHORITY;
|
|
|
|
if ( AllocateAndInitializeSid ( &SystemSidAuthority, 2,
|
|
SECURITY_BUILTIN_DOMAIN_RID,
|
|
DOMAIN_ALIAS_RID_ADMINS,
|
|
0, 0, 0, 0, 0, 0, &psidAdmin) )
|
|
{
|
|
if (!CheckTokenMembership( NULL, psidAdmin, &fReturn )) {
|
|
err = GetLastError();
|
|
iisDebugOut((LOG_TYPE_ERROR, _T("CheckTokenMembership failed on err %d.\n"), err));
|
|
}
|
|
|
|
FreeSid ( psidAdmin);
|
|
}
|
|
|
|
return ( fReturn );
|
|
#endif //_CHICAGO_
|
|
}
|
|
|
|
|
|
void StopAllServicesRegardless(int iShowErrorsFlag)
|
|
{
|
|
#ifndef _CHICAGO_
|
|
// important: you must take iis clusters off line before doing anykind of upgrade\installs...
|
|
// but incase the user didn't do this... try to take them off line for the user
|
|
DWORD dwResult = ERROR_SUCCESS;
|
|
dwResult = BringALLIISClusterResourcesOffline();
|
|
|
|
if (StopServiceAndDependencies(_T("W3SVC"), FALSE) == FALSE)
|
|
{
|
|
if (iShowErrorsFlag)
|
|
{
|
|
MyMessageBox(NULL, IDS_UNABLE_TO_STOP_SERVICE,_T("W3SVC"), MB_OK | MB_SETFOREGROUND);
|
|
}
|
|
}
|
|
|
|
if (StopServiceAndDependencies(_T("MSFTPSVC"), FALSE) == FALSE)
|
|
{
|
|
if (iShowErrorsFlag)
|
|
{
|
|
MyMessageBox(NULL, IDS_UNABLE_TO_STOP_SERVICE,_T("MSFTPSVC"), MB_OK | MB_SETFOREGROUND);
|
|
}
|
|
}
|
|
|
|
if (StopServiceAndDependencies(_T("IISADMIN"), TRUE) == FALSE)
|
|
{
|
|
if (iShowErrorsFlag)
|
|
{
|
|
MyMessageBox(NULL, IDS_UNABLE_TO_STOP_SERVICE,_T("IISADMIN"), MB_OK | MB_SETFOREGROUND);
|
|
}
|
|
}
|
|
|
|
/*
|
|
DWORD dwStatus = 0;
|
|
dwStatus = InetQueryServiceStatus(_T("MSDTC"));
|
|
if (SERVICE_RUNNING == dwStatus)
|
|
{
|
|
// if the service is running, then let' stop it!
|
|
if (StopServiceAndDependencies(_T("MSDTC"), TRUE) == FALSE)
|
|
{
|
|
if (iShowErrorsFlag){MyMessageBox(NULL, IDS_UNABLE_TO_STOP_SERVICE,_T("MSDTC"), MB_OK | MB_SETFOREGROUND);}
|
|
}
|
|
}
|
|
*/
|
|
|
|
/*
|
|
dwStatus = InetQueryServiceStatus(_T("SPOOLER"));
|
|
if (SERVICE_RUNNING == dwStatus)
|
|
{
|
|
// if the service is running, then let' stop it!
|
|
if (StopServiceAndDependencies(_T("SPOOLER"), TRUE) == FALSE)
|
|
{
|
|
if (iShowErrorsFlag){MyMessageBox(NULL, IDS_UNABLE_TO_STOP_SERVICE,_T("SPOOLER"), MB_OK | MB_SETFOREGROUND);}
|
|
}
|
|
}
|
|
*/
|
|
|
|
#endif
|
|
|
|
// kill pwstray.exe in case of IIS4.0 Beta2 upgrade, to release admprox.dll
|
|
HWND hwndTray = NULL;
|
|
hwndTray = FindWindow(PWS_TRAY_WINDOW_CLASS, NULL);
|
|
if ( hwndTray ){::PostMessage( hwndTray, WM_CLOSE, 0, 0 );}
|
|
|
|
return;
|
|
}
|
|
|