|
|
//
// checker.h <start>
//
#include <lmaccess.h>
#include <lmserver.h>
#include <lmapibuf.h>
#include <lmerr.h>
#define SECURITY_WIN32
#define ISSP_LEVEL 32
#define ISSP_MODE 1
#include <sspi.h>
#ifndef _CHICAGO_
int CheckConfig_DoIt(HWND hDlg, CStringList &strListOfWhatWeDid); BOOL ValidatePassword(IN LPCWSTR UserName,IN LPCWSTR Domain,IN LPCWSTR Password); #endif
DWORD WINAPI ChkConfig_MessageDialogThread(void *p); BOOL CALLBACK ChkConfig_MessageDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); void CheckConfig(void); int g_BigCancel = FALSE; //
// checker.h <end>
//
#ifndef _CHICAGO_
BOOL ValidatePassword(IN LPCWSTR UserName,IN LPCWSTR Domain,IN LPCWSTR Password) /*++
Routine Description: Uses SSPI to validate the specified password Arguments: UserName - Supplies the user name Domain - Supplies the user's domain Password - Supplies the password Return Value: TRUE if the password is valid. FALSE otherwise. --*/ { SECURITY_STATUS SecStatus; SECURITY_STATUS AcceptStatus; SECURITY_STATUS InitStatus; CredHandle ClientCredHandle; CredHandle ServerCredHandle; BOOL ClientCredAllocated = FALSE; BOOL ServerCredAllocated = FALSE; CtxtHandle ClientContextHandle; CtxtHandle ServerContextHandle; TimeStamp Lifetime; ULONG ContextAttributes; PSecPkgInfo PackageInfo = NULL; ULONG ClientFlags; ULONG ServerFlags; TCHAR TargetName[100]; SEC_WINNT_AUTH_IDENTITY_W AuthIdentity; BOOL Validated = FALSE;
SecBufferDesc NegotiateDesc; SecBuffer NegotiateBuffer;
SecBufferDesc ChallengeDesc; SecBuffer ChallengeBuffer;
SecBufferDesc AuthenticateDesc; SecBuffer AuthenticateBuffer;
AuthIdentity.User = (LPWSTR)UserName; AuthIdentity.UserLength = lstrlenW(UserName); AuthIdentity.Domain = (LPWSTR)Domain; AuthIdentity.DomainLength = lstrlenW(Domain); AuthIdentity.Password = (LPWSTR)Password; AuthIdentity.PasswordLength = lstrlenW(Password); AuthIdentity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
NegotiateBuffer.pvBuffer = NULL; ChallengeBuffer.pvBuffer = NULL; AuthenticateBuffer.pvBuffer = NULL;
//
// Get info about the security packages.
//
SecStatus = QuerySecurityPackageInfo( _T("NTLM"), &PackageInfo );
if ( SecStatus != STATUS_SUCCESS ) { goto error_exit; }
//
// Acquire a credential handle for the server side
//
SecStatus = AcquireCredentialsHandle( NULL, _T("NTLM"), SECPKG_CRED_INBOUND, NULL, &AuthIdentity, NULL, NULL, &ServerCredHandle, &Lifetime );
if ( SecStatus != STATUS_SUCCESS ) { goto error_exit; } ServerCredAllocated = TRUE;
//
// Acquire a credential handle for the client side
//
SecStatus = AcquireCredentialsHandle( NULL, // New principal
_T("NTLM"), SECPKG_CRED_OUTBOUND, NULL, &AuthIdentity, NULL, NULL, &ClientCredHandle, &Lifetime );
if ( SecStatus != STATUS_SUCCESS ) { goto error_exit; } ClientCredAllocated = TRUE;
//
// Get the NegotiateMessage (ClientSide)
//
NegotiateDesc.ulVersion = 0; NegotiateDesc.cBuffers = 1; NegotiateDesc.pBuffers = &NegotiateBuffer;
NegotiateBuffer.cbBuffer = PackageInfo->cbMaxToken; NegotiateBuffer.BufferType = SECBUFFER_TOKEN; NegotiateBuffer.pvBuffer = LocalAlloc( 0, NegotiateBuffer.cbBuffer ); if ( NegotiateBuffer.pvBuffer == NULL ) { goto error_exit; }
ClientFlags = ISC_REQ_MUTUAL_AUTH | ISC_REQ_REPLAY_DETECT;
InitStatus = InitializeSecurityContext( &ClientCredHandle, NULL, // No Client context yet
NULL, ClientFlags, 0, // Reserved 1
SECURITY_NATIVE_DREP, NULL, // No initial input token
0, // Reserved 2
&ClientContextHandle, &NegotiateDesc, &ContextAttributes, &Lifetime );
if ( !NT_SUCCESS(InitStatus) ) { goto error_exit; }
//
// Get the ChallengeMessage (ServerSide)
//
NegotiateBuffer.BufferType |= SECBUFFER_READONLY; ChallengeDesc.ulVersion = 0; ChallengeDesc.cBuffers = 1; ChallengeDesc.pBuffers = &ChallengeBuffer;
ChallengeBuffer.cbBuffer = PackageInfo->cbMaxToken; ChallengeBuffer.BufferType = SECBUFFER_TOKEN; ChallengeBuffer.pvBuffer = LocalAlloc( 0, ChallengeBuffer.cbBuffer ); if ( ChallengeBuffer.pvBuffer == NULL ) { goto error_exit; } ServerFlags = ASC_REQ_EXTENDED_ERROR;
AcceptStatus = AcceptSecurityContext( &ServerCredHandle, NULL, // No Server context yet
&NegotiateDesc, ServerFlags, SECURITY_NATIVE_DREP, &ServerContextHandle, &ChallengeDesc, &ContextAttributes, &Lifetime );
if ( !NT_SUCCESS(AcceptStatus) ) { goto error_exit; }
if (InitStatus != STATUS_SUCCESS) {
//
// Get the AuthenticateMessage (ClientSide)
//
ChallengeBuffer.BufferType |= SECBUFFER_READONLY; AuthenticateDesc.ulVersion = 0; AuthenticateDesc.cBuffers = 1; AuthenticateDesc.pBuffers = &AuthenticateBuffer;
AuthenticateBuffer.cbBuffer = PackageInfo->cbMaxToken; AuthenticateBuffer.BufferType = SECBUFFER_TOKEN; AuthenticateBuffer.pvBuffer = LocalAlloc( 0, AuthenticateBuffer.cbBuffer ); if ( AuthenticateBuffer.pvBuffer == NULL ) { goto error_exit; }
SecStatus = InitializeSecurityContext( NULL, &ClientContextHandle, TargetName, 0, 0, // Reserved 1
SECURITY_NATIVE_DREP, &ChallengeDesc, 0, // Reserved 2
&ClientContextHandle, &AuthenticateDesc, &ContextAttributes, &Lifetime );
if ( !NT_SUCCESS(SecStatus) ) { goto error_exit; }
if (AcceptStatus != STATUS_SUCCESS) {
//
// Finally authenticate the user (ServerSide)
//
AuthenticateBuffer.BufferType |= SECBUFFER_READONLY;
SecStatus = AcceptSecurityContext( NULL, &ServerContextHandle, &AuthenticateDesc, ServerFlags, SECURITY_NATIVE_DREP, &ServerContextHandle, NULL, &ContextAttributes, &Lifetime );
if ( !NT_SUCCESS(SecStatus) ) { goto error_exit; } Validated = TRUE;
}
}
error_exit: if (ServerCredAllocated) { FreeCredentialsHandle( &ServerCredHandle ); } if (ClientCredAllocated) { FreeCredentialsHandle( &ClientCredHandle ); }
//
// Final Cleanup
//
if ( NegotiateBuffer.pvBuffer != NULL ) { (VOID) LocalFree( NegotiateBuffer.pvBuffer ); }
if ( ChallengeBuffer.pvBuffer != NULL ) { (VOID) LocalFree( ChallengeBuffer.pvBuffer ); }
if ( AuthenticateBuffer.pvBuffer != NULL ) { (VOID) LocalFree( AuthenticateBuffer.pvBuffer ); } return(Validated); } #endif
DWORD WINAPI ChkConfig_MessageDialogThread(void *p) { HWND hDlg = (HWND)p; int iReturn = TRUE; CStringList strWhatWeDidList; CString csBigString;
SetWindowText(GetDlgItem(hDlg, IDC_STATIC_TOPLINE), _T("Scanning..."));
// call our function
#ifndef _CHICAGO_
CheckConfig_DoIt(hDlg, strWhatWeDidList); #endif
// check for cancellation
if (g_BigCancel == TRUE) goto ChkConfig_MessageDialogThread_Cancelled;
SetWindowText(GetDlgItem(hDlg, IDC_STATIC_TOPLINE), _T("Completed."));
// Hide the Search window
ShowWindow(hDlg, SW_HIDE);
// Loop thru the what we did list and display the messages:
//strWhatWeDidList
if (strWhatWeDidList.IsEmpty() == FALSE) { POSITION pos = NULL; CString csEntry; pos = strWhatWeDidList.GetHeadPosition(); while (pos) { csEntry = strWhatWeDidList.GetAt(pos); //iisDebugOutSafeParams((LOG_TYPE_WARN, _T("%1!s!\n"), csEntry));
csBigString = csBigString + csEntry; csBigString = csBigString + _T("\n");
strWhatWeDidList.GetNext(pos); } } else { csBigString = _T("No changes."); }
TCHAR szBiggerString[_MAX_PATH]; _stprintf(szBiggerString, _T("Changes:\n%s"), csBigString);
MyMessageBox((HWND) GetDesktopWindow(), szBiggerString, _T("Check Config Done"), MB_OK);
ChkConfig_MessageDialogThread_Cancelled: PostMessage(hDlg, WM_COMMAND, IDCANCEL, 0); return iReturn; }
//***************************************************************************
//*
//* purpose: display the wait dailog and spawn thread to do stuff
//*
//***************************************************************************
BOOL CALLBACK ChkConfig_MessageDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { static HANDLE hProc = NULL; DWORD id;
switch (uMsg) { case WM_INITDIALOG: uiCenterDialog(hDlg); hProc = CreateThread(NULL, 0, ChkConfig_MessageDialogThread, (LPVOID)hDlg, 0, &id); if (hProc == NULL) { MyMessageBox((HWND) GetDesktopWindow(), _T("Failed to CreateThread MessageDialogThread.\n"), MB_ICONSTOP); EndDialog(hDlg, -1); } UpdateWindow(hDlg); break;
case WM_COMMAND: switch (wParam) { case IDOK: case IDCANCEL: g_BigCancel = TRUE; EndDialog(hDlg, (int)wParam); return TRUE; } break;
default: return(FALSE); } return(TRUE); }
void CheckConfig(void) { _tcscpy(g_MyLogFile.m_szLogPreLineInfo2, _T("CheckConfig:")); DWORD err = FALSE; // Search for the ie setup program
g_BigCancel = FALSE; if (-1 == DialogBox((HINSTANCE) g_MyModuleHandle, MAKEINTRESOURCE(IDD_DIALOG_MSG), NULL, (DLGPROC) ChkConfig_MessageDialogProc)) { GetErrorMsg(GetLastError(), _T(": on CheckConfig")); }
_tcscpy(g_MyLogFile.m_szLogPreLineInfo2, _T("")); return; }
//
// Function will open the metabase and check the iusr_ and iwam_ usernames.
// it will check if the names are still valid and if the passwords are still valid.
//
#ifndef _CHICAGO_
#define CheckConfig_DoIt_log _T("CheckConfig_DoIt")
int CheckConfig_DoIt(HWND hDlg, CStringList &strListOfWhatWeDid) { int iReturn = FALSE; iisDebugOut_Start(CheckConfig_DoIt_log,LOG_TYPE_PROGRAM_FLOW);
TCHAR szAnonyName_WAM[_MAX_PATH]; TCHAR szAnonyPass_WAM[LM20_PWLEN+1]; TCHAR szAnonyName_WWW[_MAX_PATH]; TCHAR szAnonyPass_WWW[LM20_PWLEN+1]; TCHAR szAnonyName_FTP[_MAX_PATH]; TCHAR szAnonyPass_FTP[LM20_PWLEN+1]; int iGotName_WWW = FALSE; int iGotPass_WWW = FALSE; int iGotName_WAM = FALSE; int iGotPass_WAM = FALSE; int iGotName_FTP = FALSE; int iGotPass_FTP = FALSE;
INT iUserWasNewlyCreated = 0;
TCHAR szEntry[_MAX_PATH];
// Call CreatePassword to fill
LPTSR pszPassword = NULL; pszPassword = CreatePassword(LM20_PWLEN+1); if (!pszPassword) { goto CheckConfig_DoIt_Exit; }
SetWindowText(GetDlgItem(hDlg, IDC_STATIC_TOPLINE), _T("Checking for IISADMIN Service..."));
if (CheckifServiceExist(_T("IISADMIN")) != 0 ) { // the iisadmin service does not exist
// so there is no way we can do anything with the metabase.
goto CheckConfig_DoIt_Exit; }
//
// Get the WAM username and password
//
SetWindowText(GetDlgItem(hDlg, IDC_STATIC_TOPLINE), _T("Lookup iWam username...")); if (g_BigCancel == TRUE) goto CheckConfig_DoIt_Exit; if (TRUE == GetDataFromMetabase(_T("LM/W3SVC"), MD_WAM_USER_NAME, (PBYTE)szAnonyName_WAM, _MAX_PATH)) {iGotName_WAM = TRUE;} if (g_BigCancel == TRUE) goto CheckConfig_DoIt_Exit; if (TRUE == GetDataFromMetabase(_T("LM/W3SVC"), MD_WAM_PWD, (PBYTE)szAnonyPass_WAM, _MAX_PATH)) {iGotPass_WAM = TRUE;}
//
// Get the WWW username and password
//
SetWindowText(GetDlgItem(hDlg, IDC_STATIC_TOPLINE), _T("Lookup iUsr username...")); if (g_BigCancel == TRUE) goto CheckConfig_DoIt_Exit; if (TRUE == GetDataFromMetabase(_T("LM/W3SVC"), MD_ANONYMOUS_USER_NAME, (PBYTE)szAnonyName_WWW, _MAX_PATH)) {iGotName_WWW = TRUE;} if (g_BigCancel == TRUE) goto CheckConfig_DoIt_Exit; if (TRUE == GetDataFromMetabase(_T("LM/W3SVC"), MD_ANONYMOUS_PWD, (PBYTE)szAnonyPass_WWW, _MAX_PATH)) {iGotPass_WWW = TRUE;}
//
// Get the FTP username and password
//
SetWindowText(GetDlgItem(hDlg, IDC_STATIC_TOPLINE), _T("Lookup iUsr (ftp) username...")); if (g_BigCancel == TRUE) goto CheckConfig_DoIt_Exit; if (TRUE == GetDataFromMetabase(_T("LM/MSFTPSVC"), MD_ANONYMOUS_USER_NAME, (PBYTE)szAnonyName_FTP, _MAX_PATH)) {iGotName_FTP = TRUE;} if (g_BigCancel == TRUE) goto CheckConfig_DoIt_Exit; if (TRUE == GetDataFromMetabase(_T("LM/MSFTPSVC"), MD_ANONYMOUS_PWD, (PBYTE)szAnonyPass_FTP, _MAX_PATH)) {iGotPass_FTP = TRUE;}
// Now check if the actual user accounts actually exist....
if (g_BigCancel == TRUE) goto CheckConfig_DoIt_Exit; if (iGotName_WAM) { // check if username is blank
if (szAnonyName_WAM) { // Check if this user actually exists...
SetWindowText(GetDlgItem(hDlg, IDC_STATIC_TOPLINE), _T("Checking if Wam user exists...")); if (IsUserExist(szAnonyName_WAM)) { // Fine, the user exists.... let's validate the password too
// Let's validate that the user has at least the appropriate rights...
if (iGotPass_WAM) { ChangeUserPassword((LPTSTR) szAnonyName_WAM, (LPTSTR) szAnonyPass_WAM); } } else { if (g_BigCancel == TRUE) goto CheckConfig_DoIt_Exit; // the user does not exist, so let's create it
SetWindowText(GetDlgItem(hDlg, IDC_STATIC_TOPLINE), _T("Creating Wam Account..."));
// Add it if it is not already there.
_stprintf(szEntry,_T("Created the iwam_ account = %s."),szAnonyName_WAM); if (TRUE != IsThisStringInThisCStringList(strListOfWhatWeDid, szEntry)) {strListOfWhatWeDid.AddTail(szEntry);} if (iGotPass_WAM) { // We were able to get the password from the metabase
// so lets create the user with that password
CreateIWAMAccount(szAnonyName_WAM,szAnonyPass_WAM,&iUserWasNewlyCreated); if (1 == iUserWasNewlyCreated) { // Add to the list
g_pTheApp->UnInstallList_Add(_T("IUSR_WAM"),szAnonyName_WAM); } } else { // we were not able to get the password from the metabase
// so let's just create one and write it back to the metabase
CreateIWAMAccount(szAnonyName_WAM,pszPassword,&iUserWasNewlyCreated); if (1 == iUserWasNewlyCreated) { // Add to the list
g_pTheApp->UnInstallList_Add(_T("IUSR_WAM"),szAnonyName_WAM); } if (g_BigCancel == TRUE) goto CheckConfig_DoIt_Exit;
// write it to the metabase.
SetWindowText(GetDlgItem(hDlg, IDC_STATIC_TOPLINE), _T("Writing Wam Account to Metabase...")); g_pTheApp->m_csWAMAccountName = szAnonyName_WAM; g_pTheApp->m_csWAMAccountPassword = pszPassword; WriteToMD_IWamUserName_WWW(); }
// Do Dcomcnfg?????
} } }
// Now check if the actual user accounts actually exist....
if (g_BigCancel == TRUE) goto CheckConfig_DoIt_Exit; if (iGotName_WWW) { // check if username is blank
if (szAnonyName_WWW) { // Check if this user actually exists...
SetWindowText(GetDlgItem(hDlg, IDC_STATIC_TOPLINE), _T("Checking if iUsr user exists...")); if (IsUserExist(szAnonyName_WWW)) { // Fine, the user exists.... let's validate the password too
// Let's validate that the user has at least the appropriate rights...
if (iGotPass_WWW) { ChangeUserPassword((LPTSTR) szAnonyName_WWW, (LPTSTR) szAnonyPass_WWW); } } else { if (g_BigCancel == TRUE) goto CheckConfig_DoIt_Exit; // the user does not exist, so let's create it
SetWindowText(GetDlgItem(hDlg, IDC_STATIC_TOPLINE), _T("Creating iUsr Account...")); // Add it if it is not already there.
_stprintf(szEntry,_T("Created the iusr_ account = %s."),szAnonyName_WWW); if (TRUE != IsThisStringInThisCStringList(strListOfWhatWeDid, szEntry)) {strListOfWhatWeDid.AddTail(szEntry);}
if (iGotPass_WWW) { // We were able to get the password from the metabase
// so lets create the user with that password
CreateIUSRAccount(szAnonyName_WWW,szAnonyPass_WWW,&iUserWasNewlyCreated); if (1 == iUserWasNewlyCreated) { // Add to the list
g_pTheApp->UnInstallList_Add(_T("IUSR_WWW"),szAnonyName_WWW); } } else { // see if we can enumerate thru the lower nodes to find the password??????
// check if maybe the ftp stuff has the password there????
// we were not able to get the password from the metabase
// so let's just create one and write it back to the metabase
CreateIUSRAccount(szAnonyName_WWW,pszPassword,&iUserWasNewlyCreated); if (1 == iUserWasNewlyCreated) { // Add to the list
g_pTheApp->UnInstallList_Add(_T("IUSR_WWW"),szAnonyName_WWW); } if (g_BigCancel == TRUE) goto CheckConfig_DoIt_Exit;
// write it to the metabase.
SetWindowText(GetDlgItem(hDlg, IDC_STATIC_TOPLINE), _T("Writing iUsr Account to Metabase...")); g_pTheApp->m_csWWWAnonyName = szAnonyName_WAM; g_pTheApp->m_csWWWAnonyPassword = pszPassword; WriteToMD_AnonymousUserName_WWW(FALSE); }
// Do Dcomcnfg?????
} } }
// Now check if the actual user accounts actually exist....
if (g_BigCancel == TRUE) goto CheckConfig_DoIt_Exit; if (iGotName_FTP) { // check if username is blank
if (szAnonyName_FTP) { // Check if this user actually exists...
SetWindowText(GetDlgItem(hDlg, IDC_STATIC_TOPLINE), _T("Checking if iUsr (ftp) user exists...")); if (IsUserExist(szAnonyName_FTP)) { // Fine, the user exists.... let's validate the password too
// Let's validate that the user has at least the appropriate rights...
if (iGotPass_FTP) { ChangeUserPassword((LPTSTR) szAnonyName_FTP, (LPTSTR) szAnonyPass_FTP); } } else { SetWindowText(GetDlgItem(hDlg, IDC_STATIC_TOPLINE), _T("Creating iUsr (ftp) Account...")); if (g_BigCancel == TRUE) goto CheckConfig_DoIt_Exit;
// Add it if it is not already there.
_stprintf(szEntry,_T("Created the iusr_ account = %s."),szAnonyName_FTP); if (TRUE != IsThisStringInThisCStringList(strListOfWhatWeDid, szEntry)) {strListOfWhatWeDid.AddTail(szEntry);}
// the user does not exist, so let's create it
if (iGotPass_FTP) { // We were able to get the password from the metabase
// so lets create the user with that password
CreateIUSRAccount(szAnonyName_FTP,szAnonyPass_FTP,&iUserWasNewlyCreated); if (1 == iUserWasNewlyCreated) { // Add to the list
g_pTheApp->UnInstallList_Add(_T("IUSR_FTP"),szAnonyName_FTP); } } else { // see if we can enumerate thru the lower nodes to find the password??????
// check if maybe the www stuff has the password there????
// we were not able to get the password from the metabase
// so let's just create one and write it back to the metabase
CreateIUSRAccount(szAnonyName_FTP,pszPassword,&iUserWasNewlyCreated); if (1 == iUserWasNewlyCreated) { // Add to the list
g_pTheApp->UnInstallList_Add(_T("IUSR_FTP"),szAnonyName_FTP); } if (g_BigCancel == TRUE) goto CheckConfig_DoIt_Exit;
// write it to the metabase.
SetWindowText(GetDlgItem(hDlg, IDC_STATIC_TOPLINE), _T("Writing iUsr (ftp) Account to Metabase...")); g_pTheApp->m_csFTPAnonyName = szAnonyName_WAM; g_pTheApp->m_csFTPAnonyPassword = pszPassword; WriteToMD_AnonymousUserName_FTP(FALSE); }
// Do Dcomcnfg?????
} } }
// If we did anything, then popup a messagebox to the user
// about the warnings: changes....
CheckConfig_DoIt_Exit: if (pszPassword) {GlobalFree(pszPassword);pszPassword = NULL;} iisDebugOut_End(CheckConfig_DoIt_log,LOG_TYPE_PROGRAM_FLOW); return iReturn; } #endif
const TCHAR REG_MTS_INSTALLED_KEY1[] = _T("SOFTWARE\\Microsoft\\Transaction Server\\Setup(OCM)"); const TCHAR REG_MTS_INSTALLED_KEY2[] = _T("SOFTWARE\\Microsoft\\Transaction Server\\Setup"); int ReturnTrueIfMTSInstalled(void) { int iReturn = TRUE;
if (!g_pTheApp->m_fInvokedByNT) { int bMTSInstalledFlag = FALSE; CRegKey regMTSInstalledKey1( HKEY_LOCAL_MACHINE, REG_MTS_INSTALLED_KEY1, KEY_READ); CRegKey regMTSInstalledKey2( HKEY_LOCAL_MACHINE, REG_MTS_INSTALLED_KEY2, KEY_READ);
if ( (HKEY)regMTSInstalledKey1 ) {bMTSInstalledFlag = TRUE;} if ( (HKEY)regMTSInstalledKey2 ) {bMTSInstalledFlag = TRUE;} if (bMTSInstalledFlag == TRUE) { // check if we can get to the MTS catalog object
if (NOERROR != DoesMTSCatalogObjectExist()) { bMTSInstalledFlag = FALSE; iReturn = FALSE; MyMessageBox(NULL, IDS_MTS_INCORRECTLY_INSTALLED, MB_OK | MB_SETFOREGROUND); goto ReturnTrueIfMTSInstalled_Exit; } }
if (bMTSInstalledFlag != TRUE) { iReturn = FALSE; MyMessageBox(NULL, IDS_MTS_NOT_INSTALLED, MB_OK | MB_SETFOREGROUND); goto ReturnTrueIfMTSInstalled_Exit; } }
ReturnTrueIfMTSInstalled_Exit: return iReturn; }
#ifndef _CHICAGO_
/*===================================================================
DoGoryCoInitialize
Description: CoInitialize() of COM is extremely funny function. It can fail and respond with S_FALSE which is to be ignored by the callers! On other error conditions it is possible that there is a threading mismatch. Rather than replicate the code in multiple places, here we try to consolidate the functionality in some rational manner.
Arguments: None
Returns: HRESULT = NOERROR on (S_OK & S_FALSE) other errors if any failure ===================================================================*/ HRESULT DoGoryCoInitialize(void) { HRESULT hr;
// do the call to CoInitialize()
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("ole32:CoInitializeEx().Start."))); hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("ole32:CoInitializeEx().End."))); //
// S_FALSE and S_OK are success. Everything else is a failure and you don't need to call CoUninitialize.
//
if ( S_OK == hr || S_FALSE == hr) { //
// It is okay to have failure (S_FALSE) in CoInitialize()
// This error is to be ignored and balanced with CoUninitialize()
// We will reset the hr so that subsequent use is rational
//
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("DoGoryCoInitialize found duplicate CoInitialize\n"))); hr = NOERROR; } else if (FAILED (hr)) { iisDebugOut((LOG_TYPE_ERROR, _T("DoGoryCoInitialize found Failed error 0x%x\n"), hr)); }
return ( hr); } #endif // _CHICAGO_
HRESULT DoesMTSCatalogObjectExist(void) { HRESULT hr = NOERROR; #ifndef _CHICAGO_
ICatalog* m_pCatalog = NULL; ICatalogCollection* m_pPkgCollection = NULL;
hr = DoGoryCoInitialize(); if ( FAILED(hr)) {return ( hr);}
// Create instance of the catalog object
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("ole32:CoCreateInstance().Start."))); hr = CoCreateInstance(CLSID_Catalog, NULL, CLSCTX_SERVER, IID_ICatalog, (void**)&m_pCatalog); iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("ole32:CoCreateInstance().End."))); if (FAILED(hr)) { iisDebugOut((LOG_TYPE_ERROR, _T("Failed to CoCreateInstance of Catalog Object.,hr = %08x\n"), hr)); } else { BSTR bstr; //
// Get the Packages collection
//
bstr = SysAllocString(L"Packages"); if (bstr) { hr = m_pCatalog->GetCollection(bstr, (IDispatch**)&m_pPkgCollection); FREEBSTR(bstr); if (FAILED(hr)) { iisDebugOut((LOG_TYPE_ERROR, _T("m_pCatalog(%08x)->GetCollection() failed, hr = %08x\n"), m_pCatalog, hr)); } else { iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("m_pCatalog(%08x)->GetCollection() Succeeded!, hr = %08x\n"), m_pCatalog, hr)); //DBG_ASSERT( m_pPkgCollection != NULL);
} } else { iisDebugOut((LOG_TYPE_ERROR, _T("m_pCatalog(%08x)->GetCollection() failed. out of memory!\n"), m_pCatalog)); } }
if (m_pPkgCollection != NULL ) { RELEASE(m_pPkgCollection); m_pPkgCollection = NULL; }
if (m_pCatalog != NULL ) { RELEASE(m_pCatalog); m_pCatalog = NULL; }
//iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("ole32:CoUninitialize().Start.")));
CoUninitialize(); //iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("ole32:CoUninitialize().End.")));
#endif // _CHICAGO_
return hr; }
|