// emshellView.cpp : implementation of the CEmshellView class // #include "stdafx.h" #include "emshell.h" #include "ConnectionDlg.h" #include "comdef.h" #include "AutomaticSessDlg.h" #include "RemoteSessDlg.h" #include "PropPageGeneral.h" #include "PropPageDumpFiles.h" #include "PropPageLogFiles.h" #include "PropPageGenLogDump.h" #include "ReadLogsDlg.h" #include "EmOptions.h" #include "MSInfoDlg.h" #include "emshellDoc.h" #include "emshellView.h" #include "afxdlgs.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define ISTREAM_BUFFER_SIZE 0X10000 extern const TCHAR* gtcNone; const TCHAR* gtcEmChm = _T("\\em.chm"); ///////////////////////////////////////////////////////////////////////////// // CEmshellView IMPLEMENT_DYNCREATE(CEmshellView, CFormView) BEGIN_MESSAGE_MAP(CEmshellView, CFormView) //{{AFX_MSG_MAP(CEmshellView) ON_WM_SIZE() ON_WM_DESTROY() ON_WM_TIMER() ON_UPDATE_COMMAND_UI(ID_VIEW_REFRESH, OnUpdateViewRefresh) ON_COMMAND(ID_REFRESH, OnViewRefresh) ON_UPDATE_COMMAND_UI(ID_PROCESSPOPUP_STOPSESSION, OnUpdateProcesspopupStopDebugSession) ON_COMMAND(ID_PROCESSPOPUP_STOPSESSION, OnProcesspopupStopDebugSession) ON_COMMAND(ID_PROCESSPOPUP_GENERATEMINIDUMP, OnProcesspopupGenerateminidump) ON_UPDATE_COMMAND_UI(ID_PROCESSPOPUP_GENERATEMINIDUMP, OnUpdateProcesspopupGenerateminidump) ON_COMMAND(ID_PROCESSPOPUP_GENERATEUSERDUMP, OnProcesspopupGenerateuserdump) ON_UPDATE_COMMAND_UI(ID_PROCESSPOPUP_GENERATEUSERDUMP, OnUpdateProcesspopupGenerateuserdump) ON_COMMAND(ID_PROCESSPOPUP_AUTOMATICSESSION, OnProcesspopupAutomaticsession) ON_UPDATE_COMMAND_UI(ID_PROCESSPOPUP_AUTOMATICSESSION, OnUpdateProcesspopupAutomaticsession) ON_UPDATE_COMMAND_UI(ID_PROCESSPOPUP_PROPERTIES, OnUpdateProcesspopupProperties) ON_COMMAND(ID_PROCESSPOPUP_PROPERTIES, OnProcesspopupProperties) ON_UPDATE_COMMAND_UI(ID_PROCESSPOPUP_MANUALSESSION, OnUpdateProcesspopupManualsession) ON_COMMAND(ID_PROCESSPOPUP_MANUALSESSION, OnProcesspopupManualsession) ON_COMMAND(ID_PROCESSPOPUP_REFRESH, OnProcesspopupRefresh) ON_UPDATE_COMMAND_UI(ID_PROCESSPOPUP_REFRESH, OnUpdateProcesspopupRefresh) ON_COMMAND(ID_VIEW_SERVICESANDAPPLICATIONS, OnViewServicesandapplications) ON_UPDATE_COMMAND_UI(ID_VIEW_SERVICESANDAPPLICATIONS, OnUpdateViewServicesandapplications) ON_COMMAND(ID_VIEW_LOGFILES, OnViewLogfiles) ON_UPDATE_COMMAND_UI(ID_VIEW_LOGFILES, OnUpdateViewLogfiles) ON_COMMAND(ID_VIEW_DUMPFILES, OnViewDumpfiles) ON_UPDATE_COMMAND_UI(ID_VIEW_DUMPFILES, OnUpdateViewDumpfiles) ON_UPDATE_COMMAND_UI(ID_LOGPOPUP_OPEN, OnUpdateLogpopupOpen) ON_COMMAND(ID_LOGPOPUP_OPEN, OnLogpopupOpen) ON_UPDATE_COMMAND_UI(ID_LOGPOPUP_PROPERTIES, OnUpdateLogpopupProperties) ON_COMMAND(ID_LOGPOPUP_PROPERTIES, OnLogpopupProperties) ON_COMMAND(ID_VIEW_APPLICATIONS, OnViewApplications) ON_UPDATE_COMMAND_UI(ID_VIEW_APPLICATIONS, OnUpdateViewApplications) ON_COMMAND(ID_VIEW_COMPLETEDSESSIONS, OnViewCompletedsessions) ON_UPDATE_COMMAND_UI(ID_VIEW_COMPLETEDSESSIONS, OnUpdateViewCompletedsessions) ON_COMMAND(ID_VIEW_SERVICES, OnViewServices) ON_UPDATE_COMMAND_UI(ID_VIEW_SERVICES, OnUpdateViewServices) ON_COMMAND(ID_PROCESSPOPUP_DELETESESSION, OnProcesspopupDeleteSession) ON_UPDATE_COMMAND_UI(ID_PROCESSPOPUP_DELETESESSION, OnUpdateProcesspopupDeleteSession) ON_COMMAND(IDM_TOOLS_OPTOINS, OnToolsOptions) ON_UPDATE_COMMAND_UI(IDM_TOOLS_OPTOINS, OnUpdateToolsOptoins) ON_COMMAND(ID_PROCESSPOPUP_CANCELSESSION, OnProcesspopupCancelDebugSession) ON_UPDATE_COMMAND_UI(ID_PROCESSPOPUP_CANCELSESSION, OnUpdateProcesspopupCancelDebugSession) ON_COMMAND(ID_LOGPOPUP_DELETE, OnLogpopupDelete) ON_UPDATE_COMMAND_UI(ID_LOGPOPUP_DELETE, OnUpdateLogpopupDelete) ON_COMMAND(ID_ACTION_GENERATENFOFILE, OnActionGenerateMSInfoFile) ON_UPDATE_COMMAND_UI(ID_ACTION_GENERATENFOFILE, OnUpdateActionGenerateMSInfoFile) ON_COMMAND(ID_VIEW_MSINFOFILES, OnViewMSInfoFiles) ON_UPDATE_COMMAND_UI(ID_VIEW_MSINFOFILES, OnUpdateViewMSInfoFiles) ON_COMMAND(ID_LOGPOPUP_EXPORT, OnLogpopupExport) ON_UPDATE_COMMAND_UI(ID_LOGPOPUP_EXPORT, OnUpdateLogpopupExport) ON_COMMAND(ID_VIEW_REFRESH, OnViewRefresh) ON_COMMAND(ID_HELP_CONTENTS, OnHelpContents) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CEmshellView construction/destruction CEmshellView::CEmshellView() : CFormView(CEmshellView::IDD), m_mainListControl(this) { //{{AFX_DATA_INIT(CEmshellView) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT memset ( &m_lastSelectedEmObj, 0, sizeof ( EmObject ) ); } CEmshellView::~CEmshellView() { } void CEmshellView::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CEmshellView) DDX_Control(pDX, IDC_LST_MAINLISTCTRL, m_mainListControl); //}}AFX_DATA_MAP } BOOL CEmshellView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CFormView::PreCreateWindow(cs); } void CEmshellView::OnInitialUpdate() { CFormView::OnInitialUpdate(); SetShellState(SHELLVIEW_ALL); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); } ///////////////////////////////////////////////////////////////////////////// // CEmshellView diagnostics #ifdef _DEBUG void CEmshellView::AssertValid() const { CFormView::AssertValid(); } void CEmshellView::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } CEmshellDoc* CEmshellView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CEmshellDoc))); return (CEmshellDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CEmshellView message handlers BSTR CopyBSTR ( LPBYTE pb, ULONG cb ) { return ::SysAllocStringByteLen ((LPCSTR)pb, cb); } void CEmshellView::OnSize(UINT nType, int cx, int cy) { CFormView::OnSize(nType, cx, cy); if (m_mainListControl.GetSafeHwnd()) { UINT delta = 0; // m_mainListControl.ResizeColumnsWithRatio(); m_mainListControl.MoveWindow(delta, delta, cx - (delta*2), cy- (delta*2)); } SetScrollSizes(MM_TEXT, CSize(cx, cy)); } PEmObject GetEmObj(BSTR bstrEmObj) { //Do a simple cast from a BSTR to an EmObject return ((PEmObject)bstrEmObj); } HRESULT CEmshellView::DisplayLogData(PEmObject pEmObject) { _ASSERTE(pEmObject != NULL); HRESULT hr = E_FAIL; CString strFileSize; CString strStartDate; LONG lRow = 0L; int nImage = 0; int nImageOffset = 0; do { if( pEmObject == NULL ){ hr = E_INVALIDARG; break; } strFileSize.Format(_T("%d"), pEmObject->dwBucket1); lRow = m_mainListControl.SetItemText(-1, 0, pEmObject->szName); if(lRow == -1L){ hr = E_FAIL; break; } //Set the itemData m_mainListControl.SetItemData(lRow, (ULONG_PTR) pEmObject); //Get the correct offset into the bitmap for the current status nImageOffset = GetImageOffsetFromStatus((EmSessionStatus)pEmObject->nStatus); //Call SetItem() with the index and image to show based on the state of pEmObject m_mainListControl.SetItem(lRow, 0, LVIF_IMAGE, NULL, nImageOffset, 0, 0, 0); lRow = m_mainListControl.SetItemText(lRow, 1, strFileSize); if(lRow == -1L){ hr = E_FAIL; break; } // // a-mando // if( pEmObject->dateStart ) { COleDateTime oleDtTm( pEmObject->dateStart ); strStartDate = oleDtTm.Format(_T("%c")); lRow = m_mainListControl.SetItemText(lRow, 2, strStartDate); if(lRow == -1L){ hr = E_FAIL; break; } } // a-mando hr = S_OK; } while( false ); return hr; } HRESULT CEmshellView::DisplayMSInfoData(PEmObject pEmObject) { return DisplayDumpData(pEmObject); } HRESULT CEmshellView::DisplayDumpData(PEmObject pEmObject) { _ASSERTE(pEmObject != NULL); HRESULT hr = E_FAIL; CString strFileSize; CString strStartDate; LONG lRow = 0L; int nImage = 0; int nImageOffset = 0; do { if( pEmObject == NULL ){ hr = E_INVALIDARG; break; } strFileSize.Format(_T("%d"), pEmObject->dwBucket1); lRow = m_mainListControl.SetItemText(-1, 0, pEmObject->szName); if(lRow == -1L){ hr = E_FAIL; break; } //Set the itemData m_mainListControl.SetItemData(lRow, (ULONG_PTR) pEmObject); //Get the correct offset into the bitmap for the current status nImageOffset = GetImageOffsetFromStatus((EmSessionStatus)pEmObject->nStatus); //Call SetItem() with the index and image to show based on the state of pEmObject m_mainListControl.SetItem(lRow, 0, LVIF_IMAGE, NULL, nImageOffset, 0, 0, 0); lRow = m_mainListControl.SetItemText(lRow, 1, strFileSize); if(lRow == -1L){ hr = E_FAIL; break; } // // a-mando // if( pEmObject->dateStart ) { COleDateTime oleDtTm( pEmObject->dateStart ); strStartDate = oleDtTm.Format(_T("%c")); lRow = m_mainListControl.SetItemText(lRow, 2, strStartDate); if(lRow == -1L){ hr = E_FAIL; break; } } // a-mando hr = S_OK; } while( false ); return hr; } HRESULT CEmshellView::DisplayServiceData(PEmObject pEmObject) { _ASSERTE(pEmObject != NULL); HRESULT hr = E_FAIL; TCHAR szPid[20] = {0}; LONG lRow = 0L; int nImage = 0; CString csPROCStatus; int nImageOffset = 0; do { if( pEmObject == NULL ){ hr = E_INVALIDARG; break; } _ltot(pEmObject->nId, szPid, 10); lRow = m_mainListControl.SetItemText(-1, 0, pEmObject->szName); if(lRow == -1L){ hr = E_FAIL; break; } //Set the itemData m_mainListControl.SetItemData(lRow, (ULONG_PTR) pEmObject); //Get the correct offset into the bitmap for the current status nImageOffset = GetImageOffsetFromStatus((EmSessionStatus)pEmObject->nStatus); //Call SetItem() with the index and image to show based on the state of pEmObject m_mainListControl.SetItem(lRow, 0, LVIF_IMAGE, NULL, nImageOffset, 0, 0, 0); lRow = m_mainListControl.SetItemText(lRow, 1, pEmObject->szSecName); if(lRow == -1L){ hr = E_FAIL; break; } lRow = m_mainListControl.SetItemText(lRow, 2, pEmObject->szBucket1); if(lRow == -1L){ hr = E_FAIL; break; } lRow = m_mainListControl.SetItemText(lRow, 3, szPid); if(lRow == -1L){ hr = E_FAIL; break; } // // a-mando // if( pEmObject->dateStart != 0L ) { COleDateTime oleDtTm(pEmObject->dateStart); CString strStartDate = oleDtTm.Format(_T("%c")); lRow = m_mainListControl.SetItemText(lRow, 4, strStartDate ); if(lRow == -1L){ hr = E_FAIL; break; } } if( pEmObject->dateEnd != 0L ) { COleDateTime oleDtTm(pEmObject->dateEnd); CString strEndDate = oleDtTm.Format(_T("%c")); lRow = m_mainListControl.SetItemText(lRow, 5, strEndDate ); if(lRow == -1L){ hr = E_FAIL; break; } } // a-mando ((CEmshellApp*)AfxGetApp())->GetStatusString(pEmObject->nStatus, csPROCStatus); lRow = m_mainListControl.SetItemText(lRow, 6, csPROCStatus); if(lRow == -1L){ hr = E_FAIL; break; } hr = S_OK; } while( false ); return hr; } HRESULT CEmshellView::DisplayProcessData(PEmObject pEmObject) { _ASSERTE(pEmObject != NULL); HRESULT hr = E_FAIL; TCHAR szPid[20] = {0}; LONG lRow = 0L; int nImage = 0; CString csPROCStatus; int nImageOffset = 0; do { if( pEmObject == NULL ){ hr = E_INVALIDARG; break; } _ltot(pEmObject->nId, szPid, 10); lRow = m_mainListControl.SetItemText(-1, 0, pEmObject->szName); if(lRow == -1L){ hr = E_FAIL; break; } //Set the itemData m_mainListControl.SetItemData(lRow, (ULONG_PTR) pEmObject); //Get the correct offset into the bitmap for the current status nImageOffset = GetImageOffsetFromStatus((EmSessionStatus)pEmObject->nStatus); //Call SetItem() with the index and image to show based on the state of pEmObject m_mainListControl.SetItem(lRow, 0, LVIF_IMAGE, NULL, nImageOffset, 0, 0, 0); lRow = m_mainListControl.SetItemText(lRow, 1, szPid); if(lRow == -1L){ hr = E_FAIL; break; } // // a-mando // if( pEmObject->dateStart != 0L ) { COleDateTime oleDtTm(pEmObject->dateStart); CString strStartDate = oleDtTm.Format(_T("%c")); lRow = m_mainListControl.SetItemText(lRow, 2, strStartDate ); if(lRow == -1L){ hr = E_FAIL; break; } } if( pEmObject->dateEnd != 0L ) { COleDateTime oleDtTm(pEmObject->dateEnd); CString strEndDate = oleDtTm.Format(_T("%c")); lRow = m_mainListControl.SetItemText(lRow, 3, strEndDate ); if(lRow == -1L){ hr = E_FAIL; break; } } // a-mando ((CEmshellApp*)AfxGetApp())->GetStatusString(pEmObject->nStatus, csPROCStatus); lRow = m_mainListControl.SetItemText(lRow, 4, csPROCStatus); if(lRow == -1L){ hr = E_FAIL; break; } hr = S_OK; } while( false ); return hr; } HRESULT CEmshellView::DisplayStoppedSessionData(PEmObject pEmObject) { _ASSERTE(pEmObject != NULL); return DisplayServiceData(pEmObject); } void CEmshellView::OnDestroy() { CFormView::OnDestroy(); //If we have sessions still open, there is a big problem ASSERT(m_SessionTable.GetSize() == 0); // m_ShellImageList.DeleteImageList(); } CPtrArray* CEmshellView::GetSessionTable() { return &m_SessionTable; } void CEmshellView::ClearSessionTable() { //Iterate through the collection removing all the elements and calling release on all the //session pointers. Also, call StopDebugSession CloseActiveSession and RemoveActiveSession //on all the active sessions IEmDebugSession* dsValue = NULL; INT_PTR nUpperBound = 0; PActiveSession pActiveSession = NULL; HRESULT hr = S_OK; do { //Get the size of the array, start at the end, and remove each element nUpperBound = m_SessionTable.GetUpperBound(); if( nUpperBound == -1 ) break; for ( ; nUpperBound >= 0; nUpperBound-- ) { pActiveSession = ( PActiveSession ) m_SessionTable.GetAt( nUpperBound ); if ( pActiveSession == NULL ) { hr = E_FAIL; break; } /* memcpy((void*)&emObject.guidstream, (void*)&pActiveSession->guid, sizeof( GUID )); //Call StopDebug on this active session if we're the master. if (pActiveSession->bMaster) { hr = pActiveSession->pIDebugSession->StopDebug(); //So what are we supposed to do if it fails? We should still remove it from the active //session table. } //Create bstr's for the journey ahead, and break if we can't bstrEmObj = CopyBSTR ( (LPBYTE)&emObject, sizeof( EmObject ) ); if( bstrEmObj == NULL ){ hr = E_OUTOFMEMORY; break; } //Call CloseSession on the pEmObject hr = GetDocument()->GetEmManager()->CloseSession(bstrEmObj); if (FAILED(hr)) { CString strErrorMsg; strErrorMsg.LoadString(IDS_ERROR_FAILEDCLOSESESSION); ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromString(strErrorMsg); //We've handled the error, so set hr back to S_OK for the next time round hr = S_OK; } */ //Delete the pActiveSession. This will release the interface too DeAllocActiveSession( pActiveSession ); //Remove the item from the array m_SessionTable.RemoveAt( nUpperBound ); } } while ( FALSE ); if ( FAILED( hr ) ) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR( hr ); } } HRESULT CEmshellView::StartManualDebugSession(EmObject* pEmObject) { IEmDebugSession* pIEmDebugSession = NULL; HRESULT hr = E_FAIL; BOOL bRetVal = FALSE; CString strMessage; INT_PTR nResult = 0; BSTR bstrPath = NULL; BSTR bstrEmObj = NULL; BSTR bstrECXEmObject = NULL; _variant_t varUsername; _variant_t varPort; _variant_t varPassword; _variant_t varAltSymPath; EmObject EmObjectFilter; PEmObject pEmObjectTmp = NULL; _variant_t var; //This will create and initialize the var variant LONG lParam = 0; do { //Create bstr's for the journey ahead, and break if we can't bstrEmObj = CopyBSTR ( (LPBYTE)pEmObject, sizeof( EmObject ) ); if( bstrEmObj == NULL ){ hr = E_OUTOFMEMORY; break; } memcpy(&EmObjectFilter, pEmObject, sizeof( EmObject ) ); EmObjectFilter.type = EMOBJ_CMDSET; bstrECXEmObject = CopyBSTR ( (LPBYTE)&EmObjectFilter, sizeof( EmObject ) ); //Start a debug session with OpenSession() hr = GetDocument()->GetEmManager()->OpenSession(bstrEmObj, &pIEmDebugSession); if ( hr == S_OK ) { //Get the EnumObjects for the ECX list control so we can pass it to the dlg hr = GetDocument()->GetEmManager()->EnumObjectsEx(bstrECXEmObject, &var); if ( FAILED(hr) ) break; PSessionSettings pSessionSettings = &((CEmshellApp*)AfxGetApp())->m_SessionSettings; //Create the Automatic Session Dialog CRemoteSessDlg dlg(pSessionSettings, &var); nResult = dlg.DoModal(); if ( nResult == IDOK ) { //Check if the user wanted to save the settings, if so, call UpdateSessionDlgData(FALSE) if ( dlg.m_bRememberSettings ) { ((CEmshellApp*)AfxGetApp())->UpdateSessionData( TRUE ); } if ( !dlg.m_strSelectedCommandSet.IsEmpty() && dlg.m_strSelectedCommandSet != gtcNone) { bstrPath = dlg.m_strSelectedCommandSet.AllocSysString(); if( bstrPath == NULL ){ hr = E_OUTOFMEMORY; break; } } else { bstrPath = ::SysAllocString( _T("") ); } varUsername = pSessionSettings->strUsername.AllocSysString(); varPassword = pSessionSettings->strPassword.AllocSysString(); varPort.ChangeType(VT_I4); varPort.lVal = _ttoi(pSessionSettings->strPort); varAltSymPath = pSessionSettings->strAltSymbolPath.AllocSysString(); //Init the var to nothing var.Clear(); //Time to call DebugEx(), get ready for the ride! hr = pIEmDebugSession->DebugEx(bstrEmObj, SessType_Manual, bstrPath, lParam, varUsername, varPassword, varPort, var, varAltSymPath); //We don't need the bstr's, release them. SysFreeString ( bstrPath ); if ( FAILED(hr) ) break; //Convert the bstrEmObj to an PEmObject and memcopy it into the itemdata's PEmObject pEmObjectTmp = GetEmObj(bstrEmObj); if( pEmObject == NULL ){ hr = E_FAIL; break; } memcpy(pEmObject, pEmObjectTmp, sizeof( EmObject ) ); AddActiveSession(pEmObject, pIEmDebugSession, TRUE); /* TCHAR szClientConnectString[_MAX_PATH] = {0}; //Start the local cdb session GetClientConnectString(szClientConnectString, _MAX_PATH, pEmObject, varPort.lVal); hr = StartCDBClient(szClientConnectString); if ( FAILED(hr) ) break; */ } else { //release the debugsession pointer, the user decided to cancel if ( pIEmDebugSession != NULL ) //If we got here, we shouldn't have created an active session, so just release the //debug interface SAFE_RELEASEIX(pIEmDebugSession); } } else if ( hr == S_FALSE ) { //We were not able to open a master session, ask the user if they //would like to be the owner if this is an orphan if ( pEmObject->nStatus & STAT_ORPHAN ) { if ( CommenceOrphanCustodyBattle( pIEmDebugSession ) ) { //Get the status of the EmObject hr = pIEmDebugSession->GetStatus( bstrEmObj ); if ( FAILED( hr ) ) break; //Convert the bstrEmObj to an PEmObject and memcopy it into the itemdata's PEmObject pEmObjectTmp = GetEmObj(bstrEmObj); if (pEmObjectTmp == NULL) break; memcpy(pEmObject, pEmObjectTmp, sizeof( EmObject ) ); AddActiveSession(pEmObject, pIEmDebugSession, TRUE); break; } } //We were not able to open a master session, ask the user if they //would like to spectate strMessage.LoadString( IDS_DEBUG_ERROR ); if ( ( (CEmshellApp*) AfxGetApp() )->DisplayErrMsgFromString( strMessage, MB_YESNO ) == IDYES ) { //Convert the bstrEmObj to an PEmObject and memcopy it into the itemdata's PEmObject pEmObjectTmp = GetEmObj(bstrEmObj); if (pEmObjectTmp == NULL) break; memcpy(pEmObject, pEmObjectTmp, sizeof( EmObject ) ); AddActiveSession(pEmObject, pIEmDebugSession, FALSE); break; } else { //Release the debug interface, we never created an activesession. SAFE_RELEASEIX(pIEmDebugSession); } } } while (FALSE); if (FAILED(hr)) { if ( pIEmDebugSession != NULL ) //If we got here, we shouldn't have created an active session, so just release the //debug interface SAFE_RELEASEIX(pIEmDebugSession); ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(hr); } SysFreeString ( bstrPath ); SysFreeString ( bstrEmObj ); SysFreeString ( bstrECXEmObject ); //Update the status of the EmObjects ListElement to reflect it's new status UpdateListElement(pEmObject); return hr; } HRESULT CEmshellView::StartAutomaticDebugSession(PEmObject pEmObject) { IEmDebugSession* pIEmDebugSession = NULL; HRESULT hr = E_FAIL; BOOL bRetVal = FALSE; CString strMessage; INT_PTR nResult = 0; BSTR bstrPath = NULL; BSTR bstrEmObj = NULL; BSTR bstrECXEmObject = NULL; _variant_t varAdminName; _variant_t varAltSymPath; PEmObject pEmObjectTmp = NULL; EmObject EmObjectFilter; _variant_t var; //This will create and initialize the var variant LONG lParam = 0; do { //Create bstr's for the journey ahead, and break if we can't bstrEmObj = CopyBSTR ( (LPBYTE)pEmObject, sizeof( EmObject ) ); memcpy(&EmObjectFilter, pEmObject, sizeof( EmObject ) ); EmObjectFilter.type = EMOBJ_CMDSET; bstrECXEmObject = CopyBSTR ( (LPBYTE)&EmObjectFilter, sizeof( EmObject ) ); if( bstrEmObj == NULL ){ hr = E_OUTOFMEMORY; break; } //Start a debug session with OpenSession() hr = GetDocument()->GetEmManager()->OpenSession(bstrEmObj, &pIEmDebugSession); if ( hr == S_OK ) { //Get the EnumObjects for the ECX list control so we can pass it to the dlg hr = GetDocument()->GetEmManager()->EnumObjectsEx(bstrECXEmObject, &var); if ( FAILED(hr) ) break; PSessionSettings pSessionSettings = &((CEmshellApp*)AfxGetApp())->m_SessionSettings; //Create the Automatic Session Dialog CAutomaticSessDlg dlg(pSessionSettings, &var, (EmObjectType)pEmObject->type); nResult = dlg.DoModal(); if ( nResult == IDOK ) { //Check if the user wanted to save the settings, if so, call UpdateRegistry() if ( dlg.m_bRememberSettings ) { ((CEmshellApp*)AfxGetApp())->UpdateSessionData( TRUE ); } bstrPath = dlg.m_strSelectedCommandSet.AllocSysString(); if( bstrPath == NULL ){ hr = E_OUTOFMEMORY; break; } varAdminName = pSessionSettings->strAdminName.AllocSysString(); varAltSymPath = pSessionSettings->strAltSymbolPath.AllocSysString(); //Init the var to nothing var.Clear(); if ( dlg.m_bRecursiveMode ) lParam = lParam | RECURSIVE_MODE; if ( dlg.m_bMiniDump ) lParam = lParam | PRODUCE_MINI_DUMP; if ( dlg.m_bUserDump ) lParam = lParam | PRODUCE_USER_DUMP; //Set the cursor to a wait cursor CWaitCursor wait; //Time to call DebugEx(), get ready for the ride! hr = pIEmDebugSession->DebugEx(bstrEmObj, SessType_Automatic, bstrPath, lParam, var, var, var, varAdminName, varAltSymPath); //We don't need the bstr's, release them. SysFreeString ( bstrPath ); if ( FAILED(hr) ) break; //Convert the bstrEmObj to an PEmObject and memcopy it into the itemdata's PEmObject pEmObjectTmp = GetEmObj(bstrEmObj); if( pEmObject == NULL ){ hr = E_FAIL; break; } memcpy(pEmObject, pEmObjectTmp, sizeof( EmObject ) ); AddActiveSession(pEmObject, pIEmDebugSession, TRUE); } else { //release the debugsession pointer, the user decided to cancel if ( pIEmDebugSession != NULL ) //If we got here, we shouldn't have created an active session, so just release the //debug interface SAFE_RELEASEIX(pIEmDebugSession); } } else if ( hr == S_FALSE ) { //We were not able to open a master session, ask the user if they //would like to be the owner if this is an orphan if ( pEmObject->nStatus & STAT_ORPHAN ) { if ( CommenceOrphanCustodyBattle( pIEmDebugSession ) ) { //Get the status of the EmObject hr = pIEmDebugSession->GetStatus( bstrEmObj ); if ( FAILED( hr ) ) break; //Convert the bstrEmObj to an PEmObject and memcopy it into the itemdata's PEmObject pEmObjectTmp = GetEmObj(bstrEmObj); if (pEmObjectTmp == NULL) break; memcpy(pEmObject, pEmObjectTmp, sizeof( EmObject ) ); AddActiveSession(pEmObject, pIEmDebugSession, TRUE); break; } } //We were not able to open a master session, ask the user if they //would like to spectate strMessage.LoadString( IDS_DEBUG_ERROR ); if (((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromString(strMessage, MB_YESNO) == IDYES) { //Convert the bstrEmObj to an PEmObject and memcopy it into the itemdata's PEmObject pEmObjectTmp = GetEmObj(bstrEmObj); if (pEmObjectTmp == NULL) break; memcpy(pEmObject, pEmObjectTmp, sizeof( EmObject ) ); AddActiveSession(pEmObject, pIEmDebugSession, FALSE); break; } else { //Release the debug interface, we never created an activesession. SAFE_RELEASEIX(pIEmDebugSession); } } } while (FALSE); if (FAILED(hr)) { if ( pIEmDebugSession != NULL ) //If we got here, we shouldn't have created an active session, so just release the //debug interface SAFE_RELEASEIX(pIEmDebugSession); ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(hr); } SysFreeString ( bstrPath ); SysFreeString ( bstrEmObj ); SysFreeString ( bstrECXEmObject ); //Update the status of the EmObjects ListElement to reflect it's new status UpdateListElement(pEmObject); return hr; } void CEmshellView::DeAllocActiveSession(PActiveSession pActiveSession) { //Release the DebugSession SAFE_RELEASEIX(pActiveSession->pIDebugSession); if (pActiveSession != NULL) delete pActiveSession; else ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(E_FAIL); } PActiveSession CEmshellView::AllocActiveSession(PEmObject pEmObject, IEmDebugSession* pIDebugSession) { HRESULT hr = E_FAIL; PActiveSession pActiveSession = NULL; do { //Allocate an ActiveSession object, initialize it, and return it pActiveSession = new ActiveSession; if (pActiveSession == NULL) { hr = E_OUTOFMEMORY; break; } //Initialize the members pActiveSession->pEmObject = pEmObject; pActiveSession->pIDebugSession = pIDebugSession; pActiveSession->bMaster = FALSE; memcpy((void*)&pActiveSession->guid, (void*)pEmObject->guidstream, sizeof( GUID )); hr = S_OK; } while (FALSE); if (FAILED(hr)) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(hr); } return pActiveSession; } void CEmshellView::OnTimer(UINT nIDEvent) { INT_PTR nUpperBound = 0; PActiveSession pActiveSession = NULL; HRESULT hr = S_OK; PEmObject pEmObject = NULL; BSTR bstrEmObj = NULL; PEmObject pEmObjectTmp = NULL; if ( m_SessionTable.GetSize() > 0 ) { //Step through all the elements in the session table updating the status if it has a valid pEmObject for ( nUpperBound = m_SessionTable.GetUpperBound(); nUpperBound >= 0; nUpperBound-- ) { pActiveSession = ( PActiveSession ) m_SessionTable.GetAt( nUpperBound ); if ( pActiveSession == NULL ) { hr = E_FAIL; break; } pEmObject = pActiveSession->pEmObject; //If we don't have an EmObject to refresh, we don't need to handle this one. if( pEmObject == NULL ) { continue; } //Create bstr's for the journey ahead, and break if we can't bstrEmObj = CopyBSTR ( ( LPBYTE )pEmObject, sizeof( EmObject ) ); if( bstrEmObj == NULL ){ hr = E_OUTOFMEMORY; break; } hr = pActiveSession->pIDebugSession->GetStatus( bstrEmObj ); //If we failed to get the status on this session, don't stop, just continue to the next session if (FAILED( hr )) { hr = S_OK; continue; } //Convert the bstrEmObj to an PEmObject and memcopy it into the itemdata's PEmObject pEmObjectTmp = GetEmObj( bstrEmObj ); if ( pEmObjectTmp == NULL ) { hr = E_FAIL; break; } SysFreeString( bstrEmObj ); memcpy( pEmObject, pEmObjectTmp, sizeof( EmObject ) ); //Update the ListCtl with the new info UpdateListElement( pEmObject ); } } if ( FAILED( hr ) ) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR( hr ); } SysFreeString ( bstrEmObj ); CFormView::OnTimer( nIDEvent ); } HRESULT CEmshellView::RemoveActiveSession( PEmObject pEmObject ) { INT_PTR nUpperBound = 0; PActiveSession pActiveSession = NULL; //Search the session table looking for pEmObject->guidstream, if found close it //We don't call FindActiveSession() because we don't get the position of the element, //so do our own search...again :/ for ( nUpperBound = m_SessionTable.GetUpperBound(); nUpperBound >= 0; nUpperBound-- ) { pActiveSession = ( PActiveSession ) m_SessionTable.GetAt( nUpperBound ); if ( pActiveSession == NULL ) { break; } if( memcmp( ( void * ) &pActiveSession->guid, ( void * ) pEmObject->guidstream, sizeof( GUID ) ) == 0 ) { //Delete the pActiveSession. This will release the interface DeAllocActiveSession( pActiveSession ); //Remove the item from the array m_SessionTable.RemoveAt( nUpperBound ); //We have found the element, stop the search break; } } return S_OK; } HRESULT CEmshellView::DeleteDebugSession( PEmObject pEmObject ) { HRESULT hr = E_FAIL; BSTR bstrEmObj = NULL; do { //Set the cursor to a wait cursor CWaitCursor wait; //Create bstr's for the journey ahead, and break if we can't bstrEmObj = CopyBSTR ( (LPBYTE)pEmObject, sizeof( EmObject ) ); if( bstrEmObj == NULL ){ hr = E_OUTOFMEMORY; break; } //Close the active session hr = GetDocument()->GetEmManager()->DeleteSession( bstrEmObj ); if ( FAILED( hr ) ) { break; } } while ( FALSE ); if ( FAILED( hr ) ) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR( hr ); } SysFreeString ( bstrEmObj ); return hr; } void CEmshellView::CancelDebugSession( PEmObject pEmObject ) { PActiveSession pActiveSession = NULL; HRESULT hr = S_OK; BSTR bstrEmObj = NULL; PEmObject pEmObjectTmp = NULL; IEmDebugSession* pTempDebugSession = NULL; do { pActiveSession = FindActiveSession( pEmObject ); if ( pActiveSession == NULL ) { //Create bstr's for the journey ahead, and break if we can't bstrEmObj = CopyBSTR ( ( LPBYTE ) pEmObject, sizeof( EmObject ) ); if( bstrEmObj == NULL ) { hr = E_OUTOFMEMORY; break; } //We don't have a session open, so open a temporary session hr = GetDocument()->GetEmManager()->OpenSession( bstrEmObj, &pTempDebugSession ); //If we can't get an S_OK, then it's not an orphan, just release the interface. if ( FAILED( hr ) ) { if ( pTempDebugSession ) { //Release the pTempDebugSession pointer SAFE_RELEASEIX( pTempDebugSession ); } break; } //If it's an orphan, ask the user if they want to take control, and if so, add it to our session table if ( CommenceOrphanCustodyBattle( pTempDebugSession ) ) { pActiveSession = AddActiveSession( pEmObject, pTempDebugSession, TRUE ); if ( !pActiveSession ) { if ( pTempDebugSession ) { //Release the pTempDebugSession pointer SAFE_RELEASEIX( pTempDebugSession ); } break; } } else { if ( pTempDebugSession ) { //Release the pTempDebugSession pointer SAFE_RELEASEIX( pTempDebugSession ); } break; } } else if ( !pActiveSession->bMaster ) { //We're not the master, so try to become one hr = pActiveSession->pIDebugSession->AdoptOrphan(); if ( SUCCEEDED( hr ) ) { //We're now the master, so update the bMaster flag and continue pActiveSession->bMaster = TRUE; } else { //We couldn't get ownership of the session, abort with a message. break; } } //Set the cursor to a wait cursor CWaitCursor wait; //Stop the debug session hr = pActiveSession->pIDebugSession->CancelDebug( TRUE ); if ( FAILED( hr ) ) { break; } //Create bstr's for the journey ahead, and break if we can't bstrEmObj = CopyBSTR ( ( LPBYTE ) pEmObject, sizeof( EmObject ) ); if( bstrEmObj == NULL ) { hr = E_OUTOFMEMORY; break; } //Get the status of the EmObject hr = pActiveSession->pIDebugSession->GetStatus( bstrEmObj ); if ( FAILED( hr ) ) break; //Convert the bstrEmObj to an PEmObject and memcopy it into the itemdata's PEmObject pEmObjectTmp = GetEmObj(bstrEmObj); if (pEmObjectTmp == NULL) { hr = E_FAIL; break; } SysFreeString( bstrEmObj ); //Remove the session from the active session table RemoveActiveSession( pEmObject ); //Update the ListCtl with the new info. The status should read Debug Completed or some such memcpy(pEmObject, pEmObjectTmp, sizeof( EmObject ) ); UpdateListElement( pEmObject ); } while( FALSE ); if ( FAILED( hr ) ) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR( hr ); } SysFreeString ( bstrEmObj ); } BOOL CEmshellView::CommenceOrphanCustodyBattle( IEmDebugSession* pIEmDebugSession ) { HRESULT hr; CString strMessage; BOOL bRetVal = FALSE; strMessage.LoadString( IDS_ORPHANCUSTODYCONFIRM ); //Ask the user if they want custody of the orphan if (((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromString( strMessage, MB_YESNO ) == IDYES) { //Take control and exit hr = pIEmDebugSession->AdoptOrphan(); if ( SUCCEEDED( hr ) ) { bRetVal = TRUE; } else { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR( hr ); } } return bRetVal; } void CEmshellView::StopDebugSession( PEmObject pEmObject ) { PActiveSession pActiveSession = NULL; HRESULT hr = S_OK; BSTR bstrEmObj = NULL; PEmObject pEmObjectTmp = NULL; IEmDebugSession* pTempDebugSession = NULL; do { pActiveSession = FindActiveSession( pEmObject ); if ( pActiveSession == NULL ) { //Create bstr's for the journey ahead, and break if we can't bstrEmObj = CopyBSTR ( ( LPBYTE ) pEmObject, sizeof( EmObject ) ); if( bstrEmObj == NULL ) { hr = E_OUTOFMEMORY; break; } //We don't have a session open, so open a temporary session hr = GetDocument()->GetEmManager()->OpenSession( bstrEmObj, &pTempDebugSession ); //Convert the bstrEmObj to an PEmObject and memcopy it into the itemdata's PEmObject pEmObjectTmp = GetEmObj(bstrEmObj); if (pEmObjectTmp == NULL) { hr = E_FAIL; break; } SysFreeString( bstrEmObj ); //If we can't get an S_OK, then it's not an orphan, just release the interface. if ( FAILED( hr ) ) { if ( pTempDebugSession ) { //Release the pTempDebugSession pointer SAFE_RELEASEIX( pTempDebugSession ); } break; } //If it's an orphan, ask the user if they want to take control, and if successfull, //add it to our session table if ( pEmObject->nStatus & STAT_ORPHAN && CommenceOrphanCustodyBattle( pTempDebugSession ) ) { pActiveSession = AddActiveSession( pEmObject, pTempDebugSession, TRUE ); if ( !pActiveSession ) { if ( pTempDebugSession ) { //Release the pTempDebugSession pointer SAFE_RELEASEIX( pTempDebugSession ); break; } } } else { if ( pTempDebugSession ) { //Release the pTempDebugSession pointer SAFE_RELEASEIX( pTempDebugSession ); } break; } } else if ( !pActiveSession->bMaster ) { //We're not the master, so try to become one hr = pActiveSession->pIDebugSession->AdoptOrphan(); if ( SUCCEEDED( hr ) ) { //We're now the master, so update the bMaster flag and continue pActiveSession->bMaster = TRUE; } else { //We couldn't get ownership of the session, just remove the session from the active session table. //Remove the session from the active session table RemoveActiveSession( pEmObject ); hr = S_OK; break; } } //Set the cursor to a wait cursor CWaitCursor wait; //Stop the debug session hr = pActiveSession->pIDebugSession->StopDebug( TRUE ); if ( FAILED( hr ) ) { break; } //Create bstr's for the journey ahead, and break if we can't bstrEmObj = CopyBSTR ( ( LPBYTE ) pEmObject, sizeof( EmObject ) ); if( bstrEmObj == NULL ) { hr = E_OUTOFMEMORY; break; } //Get the status of the EmObject hr = pActiveSession->pIDebugSession->GetStatus( bstrEmObj ); if ( FAILED( hr ) ) break; //Convert the bstrEmObj to an PEmObject and memcopy it into the itemdata's PEmObject pEmObjectTmp = GetEmObj(bstrEmObj); if (pEmObjectTmp == NULL) { hr = E_FAIL; break; } SysFreeString( bstrEmObj ); //Remove the session from the active session table // RemoveActiveSession( pEmObject ); //Update the ListCtl with the new info. The status should read Debug Completed or some such memcpy(pEmObject, pEmObjectTmp, sizeof( EmObject ) ); UpdateListElement( pEmObject ); } while( FALSE ); if ( FAILED( hr ) ) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR( hr ); } SysFreeString ( bstrEmObj ); } PActiveSession CEmshellView::AddActiveSession(PEmObject pEmObject, IEmDebugSession* pIEmDebugSession, BOOL bMaster) { PActiveSession pActiveSession = NULL; do { pActiveSession = AllocActiveSession(pEmObject, pIEmDebugSession); if (pActiveSession == NULL) break; //Initialize the bMaster flag of the active session object pActiveSession->bMaster = bMaster; //Set the session type pActiveSession->nSessionType = (SessionType) pEmObject->type2; //Set the object type pActiveSession->emObjType = (EmObjectType) pEmObject->type; //Add the pDebugSession to the session table if we succeeded in opening a debug session m_SessionTable.Add((void*&)pActiveSession); } while ( FALSE ); return pActiveSession; } void CEmshellView::UpdateListElement(PEmObject pEmObject) { switch (m_enumShellViewState) { case SHELLVIEW_ALL: RefreshAllViewElement(pEmObject); break; case SHELLVIEW_APPLICATIONS: RefreshProcessViewElement(pEmObject); break; case SHELLVIEW_SERVICES: RefreshServiceViewElement(pEmObject); break; case SHELLVIEW_COMPLETEDSESSIONS: RefreshCompletedSessionViewElement(pEmObject); break; case SHELLVIEW_LOGFILES: RefreshLogViewElement(pEmObject); break; case SHELLVIEW_DUMPFILES: RefreshDumpViewElement(pEmObject); break; case SHELLVIEW_NONE: default: break; } } void CEmshellView::RefreshProcessViewElement(PEmObject pEmObject) { CString strTempString = _T(""); int nImageOffset = 0; //Given an PEmObject, find the element in the ListCtl, update it's image //and call UpdateData on the ListControl PEmObject pListEmObject = NULL; //Step through every item in the list control searching for pEmObject int nCount = m_mainListControl.GetItemCount(); for (int i = 0;i < nCount; i++) { pListEmObject = (PEmObject)m_mainListControl.GetItemData(i); if (pListEmObject == NULL) break; if (memcmp((void *)pListEmObject->guidstream, (void *)pEmObject->guidstream, sizeof( GUID ) ) == 0) { //Get the correct offset into the bitmap for the current status nImageOffset = GetImageOffsetFromStatus((EmSessionStatus)pEmObject->nStatus); //We have found the item, update its image based on its state m_mainListControl.SetItem(i, 0, LVIF_IMAGE, NULL, nImageOffset, 0, 0, 0); //Image Name strTempString.Format(_T("%s"), pListEmObject->szName); m_mainListControl.SetItemText(i, 0, strTempString); //PID strTempString.Format(_T("%d"), pListEmObject->nId); m_mainListControl.SetItemText(i, 1, strTempString); // // a-mando // // Start Date if( pEmObject->dateStart != 0L ) { COleDateTime oleDtTm(pListEmObject->dateStart); CString strStartDate = oleDtTm.Format(_T("%c")); m_mainListControl.SetItemText(i, 2, strStartDate ); } // End Date if( pEmObject->dateEnd != 0L ) { COleDateTime oleDtTm(pListEmObject->dateEnd); CString strEndDate = oleDtTm.Format(_T("%c")); m_mainListControl.SetItemText(i, 3, strEndDate ); } // a-mando //Status ((CEmshellApp*)AfxGetApp())->GetStatusString(pListEmObject->nStatus, strTempString); m_mainListControl.SetItemText(i, 4, strTempString); m_mainListControl.Update(i); //We have found the element, stop the search break; } } } void CEmshellView::RefreshServiceViewElement(PEmObject pEmObject) { CString strTempString = _T(""); int nImageOffset = 0; //Given an PEmObject, find the element in the ListCtl, update it's image //and call UpdateData on the ListControl PEmObject pListEmObject = NULL; //Step through every item in the list control searching for pEmObject int nCount = m_mainListControl.GetItemCount(); for (int i = 0;i < nCount; i++) { pListEmObject = (PEmObject)m_mainListControl.GetItemData(i); if (pListEmObject == NULL) break; if (memcmp((void *)pListEmObject->guidstream, (void *)pEmObject->guidstream, sizeof( GUID ) ) == 0) { //Get the correct offset into the bitmap for the current status nImageOffset = GetImageOffsetFromStatus((EmSessionStatus)pEmObject->nStatus); //We have found the item, update its image based on its state m_mainListControl.SetItem(i, 0, LVIF_IMAGE, NULL, nImageOffset, 0, 0, 0); //Image Name strTempString.Format(_T("%s"), pListEmObject->szName); m_mainListControl.SetItemText(i, 0, strTempString); //Short Name strTempString.Format(_T("%s"), pListEmObject->szSecName); m_mainListControl.SetItemText(i, 1, strTempString); //Description Name strTempString.Format(_T("%s"), pListEmObject->szBucket1); m_mainListControl.SetItemText(i, 2, strTempString); //PID strTempString.Format(_T("%d"), pListEmObject->nId); m_mainListControl.SetItemText(i, 3, strTempString); // // a-mando // if( pEmObject->dateStart != 0L ) { COleDateTime oleDtTm(pListEmObject->dateStart); CString strStartDate = oleDtTm.Format(_T("%c")); m_mainListControl.SetItemText(i, 4, strStartDate ); } if( pEmObject->dateEnd != 0L ) { COleDateTime oleDtTm(pListEmObject->dateEnd); CString strEndDate = oleDtTm.Format(_T("%c")); m_mainListControl.SetItemText(i, 5, strEndDate ); } // a-mando //Status ((CEmshellApp*)AfxGetApp())->GetStatusString(pListEmObject->nStatus, strTempString); m_mainListControl.SetItemText(i, 6, strTempString); m_mainListControl.Update(i); //We have found the element, stop the search break; } } } void CEmshellView::RefreshCompletedSessionViewElement(PEmObject pEmObject) { RefreshServiceViewElement(pEmObject); } void CEmshellView::RefreshAllViewElement(PEmObject pEmObject) { RefreshServiceViewElement(pEmObject); } void CEmshellView::RefreshLogViewElement(PEmObject pEmObject) { CString strTempString = _T(""); int nImageOffset = 0; int nImage = 0; //Given an PEmObject, find the element in the ListCtl, update it's image //and call UpdateData on the ListControl PEmObject pListEmObject = NULL; //Step through every item in the list control searching for pEmObject int nCount = m_mainListControl.GetItemCount(); for (int i = 0;i < nCount; i++) { pListEmObject = (PEmObject)m_mainListControl.GetItemData(i); if (pListEmObject == NULL) break; if (memcmp((void *)pListEmObject->guidstream, (void *)pEmObject->guidstream, sizeof( GUID ) ) == 0) { //Get the correct offset into the bitmap for the current status nImageOffset = GetImageOffsetFromStatus((EmSessionStatus)pEmObject->nStatus); //We have found the item, update its image based on its state m_mainListControl.SetItem(i, 0, LVIF_IMAGE, NULL, nImageOffset, 0, 0, 0); //Image Name strTempString.Format(_T("%d bytes"), pListEmObject->szName); m_mainListControl.SetItemText(i, 0, strTempString); //File Size strTempString.Format(_T("%d"), pListEmObject->dwBucket1); m_mainListControl.SetItemText(i, 1, strTempString); m_mainListControl.Update(i); //We have found the element, stop the search break; } } } void CEmshellView::RefreshDumpViewElement(PEmObject pEmObject) { RefreshLogViewElement(pEmObject); } void CEmshellView::ReSynchApplications() { //iterate through all the sessions and find the corrisponding GUID in the ListCtrl //Clear the list control PEmObject pEmObject = NULL; INT_PTR nUpperBound = 0; PActiveSession pActiveSession = NULL; HRESULT hr = S_OK; BOOL bFound = FALSE; do { nUpperBound = m_SessionTable.GetUpperBound(); if (nUpperBound == -1) break; //Get the GUID and look it up in the session table //If found, map the pEmObject to the session, else remove it. for (; nUpperBound >= 0; nUpperBound--) { pActiveSession = (PActiveSession) m_SessionTable.GetAt(nUpperBound); if (pActiveSession == NULL) { hr = E_FAIL; break; } //If the pActiveSession is not process, continue if ( pActiveSession->emObjType != EMOBJ_PROCESS ) continue; //Step through every item in the list control int nCount = m_mainListControl.GetItemCount(); for (int i = 0;i < nCount; i++) { pEmObject = (PEmObject)m_mainListControl.GetItemData(i); if (pEmObject == NULL) { hr = E_FAIL; break; } if(memcmp((void *)&pActiveSession->guid, (void *)pEmObject->guidstream, sizeof( GUID ) ) == 0) { //Assign the pEmObject to the pActiveSession pActiveSession->pEmObject = pEmObject; //We have found the element, stop the search bFound = TRUE; break; } } if (!bFound) { //We have a session table element that does not map to a list element //Notify the error of the anomoly and remove it from the session table CString strMessage; strMessage.LoadString(IDS_SESSIONLISTANOMOLY); ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromString(strMessage); //Delete the pActiveSession. This will release the interface too DeAllocActiveSession(pActiveSession); //Remove the item from the session table m_SessionTable.RemoveAt(nUpperBound); break; } } } while (FALSE); if (FAILED(hr)) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(hr); } } void CEmshellView::ReSynchServices() { //iterate through all the sessions and find the corrisponding GUID in the ListCtrl //Clear the list control PEmObject pEmObject = NULL; INT_PTR nUpperBound = 0; PActiveSession pActiveSession = NULL; HRESULT hr = S_OK; BOOL bFound = FALSE; do { nUpperBound = m_SessionTable.GetUpperBound(); if (nUpperBound == -1) break; //Get the GUID and look it up in the session table //If found, map the pEmObject to the session, else remove it. for (; nUpperBound >= 0; nUpperBound--) { pActiveSession = (PActiveSession) m_SessionTable.GetAt(nUpperBound); if (pActiveSession == NULL) { hr = E_FAIL; break; } //If the pActiveSession is not service, continue if ( pActiveSession->emObjType != EMOBJ_SERVICE ) continue; //Step through every item in the list control int nCount = m_mainListControl.GetItemCount(); for (int i = 0;i < nCount; i++) { pEmObject = (PEmObject)m_mainListControl.GetItemData(i); if (pEmObject == NULL) { hr = E_FAIL; break; } if(memcmp((void *)&pActiveSession->guid, (void *)pEmObject->guidstream, sizeof( GUID ) ) == 0) { //Assign the pEmObject to the pActiveSession pActiveSession->pEmObject = pEmObject; //We have found the element, stop the search bFound = TRUE; break; } } if (!bFound) { //We have a session table element that does not map to a list element //Notify the error of the anomoly and remove it from the session table CString strMessage; strMessage.LoadString(IDS_SESSIONLISTANOMOLY); ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromString(strMessage); //Delete the pActiveSession. This will release the interface too DeAllocActiveSession(pActiveSession); //Remove the item from the session table m_SessionTable.RemoveAt(nUpperBound); break; } } } while (FALSE); if (FAILED(hr)) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(hr); } } void CEmshellView::ReSynchStoppedSessions() { //iterate through all the sessions and find the corrisponding GUID in the ListCtrl //Clear the list control PEmObject pEmObject = NULL; INT_PTR nUpperBound = 0; PActiveSession pActiveSession = NULL; HRESULT hr = S_OK; BOOL bFound = FALSE; do { nUpperBound = m_SessionTable.GetUpperBound(); if (nUpperBound == -1) break; //Get the GUID and look it up in the session table //If found, map the pEmObject to the session, else remove it. for (; nUpperBound >= 0; nUpperBound--) { pActiveSession = (PActiveSession) m_SessionTable.GetAt(nUpperBound); if (pActiveSession == NULL) { hr = E_FAIL; break; } //Step through every item in the list control int nCount = m_mainListControl.GetItemCount(); for (int i = 0;i < nCount; i++) { pEmObject = (PEmObject)m_mainListControl.GetItemData(i); if (pEmObject == NULL) { hr = E_FAIL; break; } if(memcmp((void *)&pActiveSession->guid, (void *)pEmObject->guidstream, sizeof( GUID ) ) == 0) { //Assign the pEmObject to the pActiveSession pActiveSession->pEmObject = pEmObject; //We have found the element, stop the search bFound = TRUE; break; } } } } while (FALSE); if (FAILED(hr)) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(hr); } } void CEmshellView::GenerateDump(PEmObject pEmObject, BOOL bMiniDump) { INT_PTR nUpperBound = 0; PActiveSession pActiveSession = NULL; HRESULT hr = E_FAIL; BSTR bstrEmObj = NULL; IEmDebugSession* pTempDebugSession = NULL; BOOL bTempSession = FALSE; PEmObject pEmObjectTmp = NULL; //Set the cursor to a wait cursor CWaitCursor wait; do { //Find the element in the session table pActiveSession = FindActiveSession( pEmObject ); //Create bstr's for the journey ahead, and break if we can't bstrEmObj = CopyBSTR ( (LPBYTE)pEmObject, sizeof( EmObject ) ); if( bstrEmObj == NULL ){ hr = E_OUTOFMEMORY; break; } if (pActiveSession == NULL) { //Get a temporary IDebugSession* hr = GetDocument()->GetEmManager()->OpenSession(bstrEmObj, &pTempDebugSession); if (FAILED(hr)) break; bTempSession = TRUE; } else { //Generate the dumpfile pTempDebugSession = pActiveSession->pIDebugSession; if ( pTempDebugSession == NULL ) break; } //Generate the dumpfile hr = pTempDebugSession->GenerateDumpFile(bMiniDump); if (FAILED(hr)) break; hr = pTempDebugSession->GetStatus(bstrEmObj); if (FAILED(hr)) break; //Convert the bstrEmObj to an PEmObject and memcopy it into the itemdata's PEmObject pEmObjectTmp = GetEmObj(bstrEmObj); if (pEmObjectTmp == NULL) break; SysFreeString( bstrEmObj ); memcpy(pEmObject, pEmObjectTmp, sizeof( EmObject ) ); //Update the ListCtl with the new info UpdateListElement(pEmObject); } while (FALSE); if (FAILED(hr)) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(hr); } SysFreeString( bstrEmObj ); if ( bTempSession && pTempDebugSession ) { //Release the pTempDebugSession pointer SAFE_RELEASEIX( pTempDebugSession ); } } void CEmshellView::OnViewRefresh() { RefreshListCtl(); } void CEmshellView::RefreshListCtl() { //refresh the list control based on it's contents if ( GetDocument()->GetConnectedToServerState() ) { //Refresh everything. Rebuild the list. ListCtrlClear(); //Pass in the current view ListCtrlPopulate(m_enumShellViewState); m_mainListControl.RefreshList(); } } //******** Right click popup menu item updateUI handlers ***********// //*********************************************************// void CEmshellView::OnUpdateProcesspopupStopDebugSession( CCmdUI* pCmdUI ) { PEmObject pEmObject = NULL; BOOL bEnable = FALSE; PActiveSession pActiveSession = NULL; do { if ( !GetDocument()->GetConnectedToServerState() ) break; if ( m_enumShellViewState != SHELLVIEW_ALL && m_enumShellViewState != SHELLVIEW_APPLICATIONS && m_enumShellViewState != SHELLVIEW_SERVICES && m_enumShellViewState != SHELLVIEW_COMPLETEDSESSIONS ) break; // Update the state of this button based on the state of the currently selected item //Get the currently selected emObject pEmObject = GetSelectedEmObject(); if ( pEmObject == NULL ) break; pActiveSession = FindActiveSession( pEmObject ); //Determine if the status of pActiveSession and enable this appropriately if ( pEmObject->nStatus & STAT_SESS_DEBUG_IN_PROGRESS && ( pEmObject->nStatus & STAT_ORPHAN || pActiveSession ) ) bEnable = TRUE; }while ( FALSE ); pCmdUI->Enable( bEnable); } void CEmshellView::OnUpdateProcesspopupCancelDebugSession( CCmdUI* pCmdUI ) { PEmObject pEmObject = NULL; BOOL bEnable = FALSE; PActiveSession pActiveSession = NULL; do { if ( !GetDocument()->GetConnectedToServerState() ) break; if ( m_enumShellViewState != SHELLVIEW_ALL && m_enumShellViewState != SHELLVIEW_APPLICATIONS && m_enumShellViewState != SHELLVIEW_SERVICES && m_enumShellViewState != SHELLVIEW_COMPLETEDSESSIONS ) break; // Update the state of this button based on the state of the currently selected item //Get the currently selected emObject pEmObject = GetSelectedEmObject(); if ( pEmObject == NULL ) break; pActiveSession = FindActiveSession( pEmObject ); //Determine if the status of pActiveSession and enable this apprpriately if ( pEmObject->nStatus & STAT_SESS_DEBUG_IN_PROGRESS && ( pEmObject->nStatus & STAT_ORPHAN || ( pActiveSession && pActiveSession->bMaster ) ) ) bEnable = TRUE; }while (FALSE); pCmdUI->Enable( bEnable); } void CEmshellView::OnUpdateViewRefresh(CCmdUI* pCmdUI) { //We get this call everytime the menu is about to be shown pCmdUI->Enable ( GetDocument()->GetConnectedToServerState() ); } void CEmshellView::OnUpdateProcesspopupGenerateminidump(CCmdUI* pCmdUI) { PEmObject pEmObject = NULL; BOOL bEnable = FALSE; do { if ( !GetDocument()->GetConnectedToServerState() ) break; if ( m_enumShellViewState != SHELLVIEW_ALL && m_enumShellViewState != SHELLVIEW_APPLICATIONS && m_enumShellViewState != SHELLVIEW_SERVICES && m_enumShellViewState != SHELLVIEW_COMPLETEDSESSIONS ) break; // Update the state of this button based on the state of the currently selected item // If we are the master, then we can stop this session //Get the currently selected emObject pEmObject = GetSelectedEmObject(); if ( pEmObject == NULL ) break; if ( !( pEmObject->nStatus & STAT_NOTRUNNING ) && !( pEmObject->nStatus & STAT_SESS_STOPPED ) && ( pEmObject->type & EMOBJ_PROCESS || pEmObject->type & EMOBJ_SERVICE ) ) { bEnable = TRUE; } }while (FALSE); pCmdUI->Enable( bEnable); } void CEmshellView::OnUpdateProcesspopupGenerateuserdump(CCmdUI* pCmdUI) { PEmObject pEmObject = NULL; BOOL bEnable = FALSE; do { if ( !GetDocument()->GetConnectedToServerState() ) break; if ( m_enumShellViewState != SHELLVIEW_ALL && m_enumShellViewState != SHELLVIEW_APPLICATIONS && m_enumShellViewState != SHELLVIEW_SERVICES && m_enumShellViewState != SHELLVIEW_COMPLETEDSESSIONS ) break; // Update the state of this button based on the state of the currently selected item // If we are the master, then we can stop this session //Get the currently selected emObject pEmObject = GetSelectedEmObject(); if ( pEmObject == NULL ) break; if ( !( pEmObject->nStatus & STAT_NOTRUNNING ) && !( pEmObject->nStatus & STAT_SESS_STOPPED ) && ( pEmObject->type & EMOBJ_PROCESS || pEmObject->type & EMOBJ_SERVICE ) ) { bEnable = TRUE; } }while (FALSE); pCmdUI->Enable( bEnable); } void CEmshellView::OnUpdateProcesspopupAutomaticsession(CCmdUI* pCmdUI) { PEmObject pEmObject = NULL; BOOL bEnable = FALSE; PActiveSession pActiveSession = NULL; // Allow if this isn't being debugged do { if ( !GetDocument()->GetConnectedToServerState() ) break; if ( m_enumShellViewState != SHELLVIEW_ALL && m_enumShellViewState != SHELLVIEW_APPLICATIONS && m_enumShellViewState != SHELLVIEW_SERVICES && m_enumShellViewState != SHELLVIEW_COMPLETEDSESSIONS ) break; // Update the state of this button based on the state of the currently selected item //Get the currently selected emObject pEmObject = GetSelectedEmObject(); if ( pEmObject == NULL ) break; //Find the element in the session table pActiveSession = FindActiveSession( pEmObject ); //Determine the status of pActiveSession and enable this apprpriately if ( !pActiveSession && (pEmObject->nStatus & STAT_SESS_NOT_STARTED) || ( pEmObject->type2 == SessType_Automatic && pEmObject->nStatus & STAT_ORPHAN ) ) { bEnable = TRUE; } }while (FALSE); pCmdUI->Enable( bEnable); } void CEmshellView::OnUpdateProcesspopupManualsession(CCmdUI* pCmdUI) { PEmObject pEmObject = NULL; BOOL bEnable = FALSE; PActiveSession pActiveSession = NULL; // Allow if this isn't being debugged do { if ( !GetDocument()->GetConnectedToServerState() ) break; if ( m_enumShellViewState != SHELLVIEW_ALL && m_enumShellViewState != SHELLVIEW_APPLICATIONS && m_enumShellViewState != SHELLVIEW_SERVICES && m_enumShellViewState != SHELLVIEW_COMPLETEDSESSIONS ) break; // Update the state of this button based on the state of the currently selected item // If we are the master, then we can stop this session //Get the currently selected emObject pEmObject = GetSelectedEmObject(); if ( pEmObject == NULL ) break; //Find the element in the session table pActiveSession = FindActiveSession( pEmObject ); //Determine if the status of pActiveSession and enable this apprpriately // if ( pEmObject->nStatus & STAT_SESS_NOT_STARTED ) { if ( !pActiveSession && (pEmObject->nStatus & STAT_SESS_NOT_STARTED) || ( pEmObject->type2 == SessType_Manual && pEmObject->nStatus & STAT_ORPHAN ) ) { bEnable = TRUE; } }while (FALSE); pCmdUI->Enable( bEnable); } void CEmshellView::OnUpdateProcesspopupProperties(CCmdUI* pCmdUI) { BOOL bEnable = FALSE; do { if ( !GetDocument()->GetConnectedToServerState() ) break; if ( GetSelectedEmObject() == NULL ) break; bEnable = TRUE; } while ( FALSE ); // Always allow properties pCmdUI->Enable( bEnable ); } void CEmshellView::OnUpdateProcesspopupRefresh(CCmdUI* pCmdUI) { // Only allow refresh if the current item is in our session table PEmObject pEmObject = NULL; BOOL bEnable = FALSE; do { if ( !GetDocument()->GetConnectedToServerState() ) break; if ( m_enumShellViewState != SHELLVIEW_ALL && m_enumShellViewState != SHELLVIEW_APPLICATIONS && m_enumShellViewState != SHELLVIEW_SERVICES && m_enumShellViewState != SHELLVIEW_COMPLETEDSESSIONS ) break; // Update the state of this button based on the state of the currently selected item // If we are the master, then we can stop this session //Get the currently selected emObject pEmObject = GetSelectedEmObject(); if ( pEmObject == NULL ) break; bEnable = TRUE; }while (FALSE); pCmdUI->Enable( bEnable); } //******** Right click popup menu item handlers ***********// //*********************************************************// void CEmshellView::OnProcesspopupStopDebugSession() { //Stop the session for the current item selected PEmObject pEmObject = NULL; HRESULT hr = E_FAIL; do { pEmObject = GetSelectedEmObject(); if ( pEmObject == NULL ) break; //Stop and remove the session StopDebugSession( pEmObject ); hr = S_OK; } while ( FALSE ); if ( FAILED( hr ) ) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR( hr ); } } void CEmshellView::OnProcesspopupGenerateminidump() { PEmObject pEmObject = NULL; HRESULT hr = E_FAIL; do { pEmObject = GetSelectedEmObject(); if (pEmObject == NULL) break; //Generate the MiniDump file GenerateDump(pEmObject, TRUE); hr = S_OK; } while (FALSE); if (FAILED(hr)) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(hr); } } void CEmshellView::OnProcesspopupGenerateuserdump() { PEmObject pEmObject = NULL; HRESULT hr = E_FAIL; do { pEmObject = GetSelectedEmObject(); if (pEmObject == NULL) break; //Generate the UserDump file GenerateDump(pEmObject, FALSE); hr = S_OK; } while(FALSE); if (FAILED(hr)) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(hr); } } void CEmshellView::OnProcesspopupAutomaticsession() { PEmObject pEmObject = NULL; HRESULT hr = E_FAIL; do { pEmObject = GetSelectedEmObject(); if ( pEmObject == NULL ) break; //Start the automatic session hr = StartAutomaticDebugSession(pEmObject); } while (FALSE); } void CEmshellView::OnProcesspopupManualsession() { // Start a manual session with the server PEmObject pEmObject = NULL; HRESULT hr = E_FAIL; do { pEmObject = GetSelectedEmObject(); if (pEmObject == NULL) break; //Start the manual session hr = StartManualDebugSession(pEmObject); } while (FALSE); if (FAILED(hr)) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(hr); } } void CEmshellView::OnProcesspopupProperties() { PEmObject pEmObject = NULL; IEmDebugSession* pIDebugSession = NULL; do { pEmObject = GetSelectedEmObject(); if ( pEmObject == NULL ) break; if ( pEmObject ) { //Get the current view state from the shell switch ( GetViewState() ) { case SHELLVIEW_LOGFILES: case SHELLVIEW_DUMPFILES: case SHELLVIEW_MSINFOFILES: ShowProperties( pEmObject ); break; default: DoModalPropertySheet( pEmObject ); } } } while (FALSE); } void CEmshellView::OnProcesspopupRefresh() { // Refresh the currently selected item // Get the currently selected EmObject PEmObject pEmObject = NULL; HRESULT hr = E_FAIL; PActiveSession pActiveSession = NULL; BSTR bstrEmObj = NULL; PEmObject pEmObjectTmp = NULL; IEmDebugSession* pTempDebugSession = NULL; BOOL bTempSession = FALSE; do { pEmObject = GetSelectedEmObject(); if (pEmObject == NULL) break; //Find the element in the session table pActiveSession = FindActiveSession( pEmObject ); //Create bstr's for the journey ahead, and break if we can't bstrEmObj = CopyBSTR ( (LPBYTE)pEmObject, sizeof( EmObject ) ); if( bstrEmObj == NULL ){ hr = E_OUTOFMEMORY; break; } if ( pActiveSession == NULL ) { hr = GetDocument()->GetEmManager()->OpenSession(bstrEmObj, &pTempDebugSession); if (FAILED(hr)) break; bTempSession = TRUE; hr = pTempDebugSession->GetStatus(bstrEmObj); if (FAILED(hr)) break; } else { hr = pActiveSession->pIDebugSession->GetStatus(bstrEmObj); if (FAILED(hr)) break; } //Convert the bstrEmObj to an PEmObject and memcopy it into the itemdata's PEmObject pEmObjectTmp = GetEmObj(bstrEmObj); if (pEmObjectTmp == NULL) break; SysFreeString( bstrEmObj ); memcpy(pEmObject, pEmObjectTmp, sizeof( EmObject ) ); //Update the element UpdateListElement(pEmObject); hr = S_OK; } while (FALSE); if (FAILED(hr)) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(hr); } SysFreeString ( bstrEmObj ); if ( pTempDebugSession ) { //Release the pTempDebugSession pointer SAFE_RELEASEIX( pTempDebugSession ); } } PEmObject CEmshellView::GetSelectedEmObject() { PEmObject pEmObject = NULL; int nIndex = -1; do { nIndex = GetSelectedItemIndex(); if (nIndex == -1) break; pEmObject = (PEmObject) m_mainListControl.GetItemData(nIndex); } while (FALSE); return pEmObject; } int CEmshellView::GetSelectedItemIndex() { POSITION pos = 0; int nIndex = -1; do { pos = m_mainListControl.GetFirstSelectedItemPosition(); if(pos == NULL) break; //Get the nIndex for the currently selected item nIndex = m_mainListControl.GetNextSelectedItem(pos); } while (FALSE); return nIndex; } PActiveSession CEmshellView::FindActiveSession(PEmObject pEmObject) { //iterate through all the sessions and find the corrisponding pEmObject INT_PTR nUpperBound = 0; PActiveSession pActiveSession = NULL; BOOL bFound = FALSE; PActiveSession pRetVal = NULL; do { nUpperBound = m_SessionTable.GetUpperBound(); if ( nUpperBound == -1 ) break; if ( pEmObject == NULL ) break; //look up the pEmObject in the session table //If found, map the pEmObject to the session, else remove it. for (; nUpperBound >= 0; nUpperBound--) { pActiveSession = (PActiveSession) m_SessionTable.GetAt(nUpperBound); if ( pActiveSession == NULL ) break; if( memcmp( ( void * ) &pActiveSession->guid, ( void * ) pEmObject->guidstream, sizeof( GUID ) ) == 0 ) { pRetVal = pActiveSession; } } } while ( FALSE ); return pRetVal; } int CEmshellView::GetImageOffsetFromStatus(EmSessionStatus em) { int retVal = 0; //Use a switch/case statement to determine the correct offset into the bitmap switch (em) { case STAT_SESS_NONE_STAT_NONE: retVal = 0; break; case STAT_SESS_NOT_STARTED_NOTRUNNING: retVal = 1; break; case STAT_SESS_NOT_STARTED_RUNNING: retVal = 2; break; case STAT_SESS_NOT_STARTED_FILECREATED_SUCCESSFULLY: retVal = 3; break; case STAT_SESS_NOT_STARTED_FILECREATION_FAILED: retVal = 4; break; case STAT_SESS_DEBUG_IN_PROGRESS_NONE: retVal = 5; break; case STAT_SESS_DEBUG_IN_PROGRESS_FILECREATED_SUCESSFULLY: retVal = 6; break; case STAT_SESS_DEBUG_IN_PROGRESS_FILECREATION_FAILED: retVal = 7; break; case STAT_SESS_DEBUG_IN_PROGRESS_ORPHAN_NONE: retVal = 8; break; case STAT_SESS_DEBUG_IN_PROGRESS_ORPHAN_FILECREATED_SUCESSFULLY: retVal = 9; break; case STAT_SESS_DEBUG_IN_PROGRESS_ORPHAN_FILECREATION_FAILED: retVal = 10; break; case STAT_SESS_STOPPED_SUCCESS: retVal = 11; break; case STAT_SESS_STOPPED_FAILED: retVal = 12; break; case STAT_SESS_STOPPED_ORPHAN_SUCCESS: retVal = 13; break; case STAT_SESS_STOPPED_ORPHAN_FAILED: retVal = 14; break; case STAT_SESS_STOPPED_DEBUGGEE_KILLED: retVal = 15; break; case STAT_SESS_STOPPED_DEBUGGEE_EXITED: retVal = 16; break; case STAT_SESS_STOPPED_EXCEPTION_OCCURED: retVal = 17; break; case STAT_SESS_STOPPED_ORPHAN_DEBUGGEE_KILLED: retVal = 18; break; case STAT_SESS_STOPPED_ORPHAN_DEBUGGEE_EXITED: retVal = 19; break; case STAT_SESS_STOPPED_ORPHAN_EXCEPTION_OCCURED: retVal = 20; break; case STAT_SESS_STOPPED_ACCESSVIOLATION_OCCURED: retVal = 21; break; case STAT_SESS_STOPPED_ORPHAN_ACCESSVIOLATION_OCCURED: retVal = 22; break; } return retVal; } void CEmshellView::InitializeAllView() { InitializeServiceView(); } void CEmshellView::InitializeCompletedSessionsView() { InitializeServiceView(); } void CEmshellView::InitializeProcessView() { //This gets called only when the user is first starting the app or when //the user is changing views. //Reset the list control m_mainListControl.ResetListCtrl(); //Load the string resources for the CListCtrl columns CString strImageName, strPID, strStatus, strStartDate, strEndDate; strImageName.LoadString(IDS_LC_IMAGENAME); strPID.LoadString(IDS_LC_PID); strStatus.LoadString(IDS_LC_STATUS); strStartDate.LoadString(IDS_LC_STARTDATE); strEndDate.LoadString(IDS_LC_ENDDATE); //Unload the last image resources, if there are any m_ShellImageList.DeleteImageList(); //Load the image resources for the CListCtrl items m_ShellImageList.Create(IDB_STATUS_BITMAP, 16, 1, CLR_NONE); m_mainListControl.SetImageList(&m_ShellImageList, LVSIL_SMALL); //Add the columns to the list control m_mainListControl.BeginSetColumn(5); m_mainListControl.AddColumn(strImageName); m_mainListControl.AddColumn(strPID, VT_I4); m_mainListControl.AddColumn(strStartDate); m_mainListControl.AddColumn(strEndDate); m_mainListControl.AddColumn(strStatus); m_mainListControl.EndSetColumn(); m_mainListControl.ResizeColumnsFitScreen(); m_mainListControl.SetExtendedStyle(LVS_EX_FULLROWSELECT); } void CEmshellView::InitializeServiceView() { //This gets called only when the user is first starting the app or when //the user is changing views. //Reset the list control m_mainListControl.ResetListCtrl(); //Load the string resources for the CListCtrl columns CString strImageName, strPID, strStatus, strShortName, strDescription, strStartDate, strEndDate; strImageName.LoadString(IDS_LC_IMAGENAME); strPID.LoadString(IDS_LC_PID); strStatus.LoadString(IDS_LC_STATUS); strShortName.LoadString(IDS_LC_SHORTNAME); strDescription.LoadString(IDS_LC_DESCRIPTION); strStartDate.LoadString(IDS_LC_STARTDATE); strEndDate.LoadString(IDS_LC_ENDDATE); //Unload the last image resources, if there are any m_ShellImageList.DeleteImageList(); //Load the image resources for the CListCtrl items m_ShellImageList.Create(IDB_STATUS_BITMAP, 16, 1, CLR_NONE); m_mainListControl.SetImageList(&m_ShellImageList, LVSIL_SMALL); //Add the columns to the list control m_mainListControl.BeginSetColumn(7); m_mainListControl.AddColumn(strImageName); m_mainListControl.AddColumn(strShortName); m_mainListControl.AddColumn(strDescription); m_mainListControl.AddColumn(strPID, VT_I4); m_mainListControl.AddColumn(strStartDate); m_mainListControl.AddColumn(strEndDate); m_mainListControl.AddColumn(strStatus); m_mainListControl.EndSetColumn(); m_mainListControl.ResizeColumnsFitScreen(); m_mainListControl.SetExtendedStyle(LVS_EX_FULLROWSELECT); } void CEmshellView::InitializeLogView() { //Reset the list control m_mainListControl.ResetListCtrl(); //Load the string resources for the CListCtrl columns CString strFileName, strSize, strTime; //, strProc; strFileName.LoadString(IDS_LC_FILENAME); strSize.LoadString(IDS_LC_FILESIZE); strTime.LoadString(IDS_LC_FILETIME); // strProc.LoadString(IDS_LC_FILEPROCESS); //Unload the last image resources, if there are any m_ShellImageList.DeleteImageList(); //Load the image resources for the CListCtrl items m_ShellImageList.Create(IDB_STATUS_BITMAP, 16, 1, CLR_NONE); m_mainListControl.SetImageList(&m_ShellImageList, LVSIL_SMALL); //Add the columns to the list control m_mainListControl.BeginSetColumn(3); m_mainListControl.AddColumn(strFileName); m_mainListControl.AddColumn(strSize, VT_I4); m_mainListControl.AddColumn(strTime); // m_mainListControl.AddColumn(strProc); m_mainListControl.EndSetColumn(); m_mainListControl.ResizeColumnsFitScreen(); m_mainListControl.SetExtendedStyle(LVS_EX_FULLROWSELECT); } void CEmshellView::InitializeDumpView() { InitializeLogView(); } void CEmshellView::PopulateProcessType() { _variant_t var; //This will create and initialize the var variant HRESULT hr = E_FAIL; LONG lLBound = 0; LONG lUBound = 0; BSTR bstrEmObj = NULL; BSTR bstrEmObjectFilter = NULL; PEmObject pCurrentObj = NULL; EmObject EmObjectFilter; memset(&EmObjectFilter, 0, sizeof( EmObject )); do { EmObjectFilter.type = EMOBJ_PROCESS; bstrEmObjectFilter = CopyBSTR ( (LPBYTE)&EmObjectFilter, sizeof( EmObject ) ); //Populate the list control based on the EmObjectType //Enumerate all the objects and stick them in the variant //hr = GetDocument()->GetEmManager()->EnumObjectsEx(bstrEmObjectFilter, &var); hr = GetDocument()->GetEmManager()->EnumObjects(EMOBJ_PROCESS, &var ); if(FAILED(hr)) break; //Get the lower and upper bounds of the variant array hr = SafeArrayGetLBound(var.parray, 1, &lLBound); if(FAILED(hr)) break; hr = SafeArrayGetUBound(var.parray, 1, &lUBound); if(FAILED(hr)) break; //There are elements at both the lower bound and upper bound, so include them for(; lLBound <= lUBound; lLBound++) { //Get a BSTR object from the safe array hr = SafeArrayGetElement(var.parray, &lLBound, &bstrEmObj); if (FAILED(hr)) break; //Create a local copy of the EmObject (there aren't any pointers in //EmObject structure, so don't worry about doing a deep copy pCurrentObj = ((CEmshellApp*)AfxGetApp())->AllocEmObject(); if ( pCurrentObj != NULL ) { *pCurrentObj = *GetEmObj( bstrEmObj ); } SysFreeString( bstrEmObj ); //Unallocate the EmObject if it has an hr of E_FAIL if (FAILED(pCurrentObj->hr)) { ((CEmshellApp*)AfxGetApp())->DeAllocEmObject( pCurrentObj ); continue; } if ( !( (CEmshellApp*)AfxGetApp() )->CanDisplayProcess( pCurrentObj->szName ) ){ ((CEmshellApp*)AfxGetApp())->DeAllocEmObject( pCurrentObj ); continue; } //Depending on the current view, use the correct DisplayData routine if ( m_enumShellViewState == SHELLVIEW_APPLICATIONS ) { //Convert the BSTR object to an EmObject and pass it to DisplayData DisplayProcessData( pCurrentObj ); } else { DisplayServiceData( pCurrentObj ); } } } while (FALSE); SafeArrayDestroyData(var.parray); SysFreeString ( bstrEmObjectFilter ); SysFreeString ( bstrEmObj ); if (FAILED(hr)) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(hr); } } void CEmshellView::PopulateServiceType() { _variant_t var; //This will create and initialize the var variant HRESULT hr = E_FAIL; LONG lLBound = 0; LONG lUBound = 0; BSTR bstrEmObj = NULL; BSTR bstrEmObjectFilter = NULL; PEmObject pCurrentObj = NULL; EmObject EmObjectFilter; memset(&EmObjectFilter, 0, sizeof( EmObject )); do { EmObjectFilter.type = EMOBJ_SERVICE; bstrEmObjectFilter = CopyBSTR ( (LPBYTE)&EmObjectFilter, sizeof( EmObject ) ); //Populate the list control based on the EmObjectType //Enumerate all the objects and stick them in the variant //hr = GetDocument()->GetEmManager()->EnumObjectsEx(bstrEmObjectFilter, &var); hr = GetDocument()->GetEmManager()->EnumObjects(EMOBJ_SERVICE, &var ); if(FAILED(hr)) break; //Get the lower and upper bounds of the variant array hr = SafeArrayGetLBound(var.parray, 1, &lLBound); if(FAILED(hr)) break; hr = SafeArrayGetUBound(var.parray, 1, &lUBound); if(FAILED(hr)) break; //There are elements at both the lower bound and upper bound, so include them for(; lLBound <= lUBound; lLBound++) { //Get a BSTR object from the safe array hr = SafeArrayGetElement(var.parray, &lLBound, &bstrEmObj); if (FAILED(hr)) break; //Create a local copy of the EmObject (there aren't any pointers in //EmObject structure, so don't worry about doing a deep copy pCurrentObj = ((CEmshellApp*)AfxGetApp())->AllocEmObject(); if (pCurrentObj == NULL) { hr = E_FAIL; break; } *pCurrentObj = *GetEmObj( bstrEmObj ); SysFreeString( bstrEmObj ); //Unallocate the EmObject if it has an hr of E_FAIL if ( (_tcscmp(pCurrentObj->szName, _T("")) == 0) && FAILED(pCurrentObj->hr)) { ((CEmshellApp*)AfxGetApp())->DeAllocEmObject( pCurrentObj ); continue; } if ( !( (CEmshellApp*)AfxGetApp() )->CanDisplayService( pCurrentObj->szName, pCurrentObj->szSecName ) ){ ((CEmshellApp*)AfxGetApp())->DeAllocEmObject( pCurrentObj ); continue; } //Convert the BSTR object to an EmObject and pass it to DisplayData DisplayServiceData( pCurrentObj ); } } while (FALSE); SafeArrayDestroyData(var.parray); SysFreeString ( bstrEmObjectFilter ); SysFreeString ( bstrEmObj ); if (FAILED(hr)) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(hr); } } void CEmshellView::PopulateDumpType() { _variant_t var; //This will create and initialize the var variant HRESULT hr = E_FAIL; LONG lLBound = 0; LONG lUBound = 0; BSTR bstrEmObj = NULL; BSTR bstrEmObjectFilter = NULL; EmObject *pCurrentObj = NULL; EmObject EmObjectFilter; memset(&EmObjectFilter, 0, sizeof( EmObject ) ); do { EmObjectFilter.type = EMOBJ_MINIDUMP; bstrEmObjectFilter = CopyBSTR ( (LPBYTE)&EmObjectFilter, sizeof( EmObject ) ); //Populate the list control based on the EmObjectType //Enumerate all the objects and stick them in the variant hr = GetDocument()->GetEmManager()->EnumObjectsEx(bstrEmObjectFilter, &var); if(FAILED(hr)) break; //Get the lower and upper bounds of the variant array hr = SafeArrayGetLBound(var.parray, 1, &lLBound); if(FAILED(hr)) break; hr = SafeArrayGetUBound(var.parray, 1, &lUBound); if(FAILED(hr)) break; //There are elements at both the lower bound and upper bound, so include them for(; lLBound <= lUBound; lLBound++) { //Get a BSTR object from the safe array hr = SafeArrayGetElement(var.parray, &lLBound, &bstrEmObj); if (FAILED(hr)) break; //Create a local copy of the EmObject (there aren't any pointers in //EmObject structure, so don't worry about doing a deep copy pCurrentObj = ((CEmshellApp*)AfxGetApp())->AllocEmObject(); if (pCurrentObj != NULL) { *pCurrentObj = *GetEmObj( bstrEmObj ); } SysFreeString( bstrEmObj ); //Unallocate the EmObject if it has an hr of E_FAIL if (FAILED(pCurrentObj->hr)) { ((CEmshellApp*)AfxGetApp())->DeAllocEmObject( pCurrentObj ); continue; } //Convert the BSTR object to an EmObject and pass it to DisplayData DisplayDumpData( pCurrentObj ); } } while (FALSE); SafeArrayDestroyData(var.parray); SysFreeString ( bstrEmObjectFilter ); SysFreeString ( bstrEmObj ); if (FAILED(hr)) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(hr); } } void CEmshellView::PopulateCompletedSessionsType() { _variant_t var; //This will create and initialize the var variant HRESULT hr = E_FAIL; LONG lLBound = 0; LONG lUBound = 0; BSTR bstrEmObj = NULL; BSTR bstrEmObjectFilter = NULL; EmObject *pCurrentObj = NULL; EmObject EmObjectFilter; memset(&EmObjectFilter, 0, sizeof( EmObject ) ); do { EmObjectFilter.type = EMOBJ_PROCESS; EmObjectFilter.nStatus = STAT_SESS_STOPPED; // only the HIWORD is the filter. bstrEmObjectFilter = CopyBSTR ( (LPBYTE)&EmObjectFilter, sizeof( EmObject ) ); //Populate the list control based on the EmObjectType //Enumerate all the objects and stick them in the variant hr = GetDocument()->GetEmManager()->EnumObjectsEx(bstrEmObjectFilter, &var); if(hr != S_OK) break; //Get the lower and upper bounds of the variant array hr = SafeArrayGetLBound(var.parray, 1, &lLBound); if(FAILED(hr)) break; hr = SafeArrayGetUBound(var.parray, 1, &lUBound); if(FAILED(hr)) break; //There are elements at both the lower bound and upper bound, so include them for(; lLBound <= lUBound; lLBound++) { //Get a BSTR object from the safe array hr = SafeArrayGetElement(var.parray, &lLBound, &bstrEmObj); if (FAILED(hr)) break; //Create a local copy of the EmObject (there aren't any pointers in //EmObject structure, so don't worry about doing a deep copy pCurrentObj = ((CEmshellApp*)AfxGetApp())->AllocEmObject(); if (pCurrentObj != NULL) { *pCurrentObj = *GetEmObj( bstrEmObj ); } SysFreeString( bstrEmObj ); //Unallocate the EmObject if it has an hr of E_FAIL if (FAILED(pCurrentObj->hr)) { ((CEmshellApp*)AfxGetApp())->DeAllocEmObject( pCurrentObj ); continue; } //Convert the BSTR object to an EmObject and pass it to DisplayData DisplayStoppedSessionData( pCurrentObj ); } } while (FALSE); SafeArrayDestroyData(var.parray); SysFreeString ( bstrEmObjectFilter ); SysFreeString ( bstrEmObj ); if (FAILED(hr)) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(hr); } } void CEmshellView::PopulateLogType() { _variant_t var; //This will create and initialize the var variant HRESULT hr = E_FAIL; LONG lLBound = 0; LONG lUBound = 0; BSTR bstrEmObj = NULL; BSTR bstrEmObjectFilter = NULL; EmObject *pCurrentObj = NULL; EmObject EmObjectFilter; memset(&EmObjectFilter, 0, sizeof( EmObject ) ); do { EmObjectFilter.type = EMOBJ_LOGFILE; bstrEmObjectFilter = CopyBSTR ( (LPBYTE)&EmObjectFilter, sizeof( EmObject ) ); //Populate the list control based on the EmObjectType //Enumerate all the objects and stick them in the variant hr = GetDocument()->GetEmManager()->EnumObjectsEx(bstrEmObjectFilter, &var); if(FAILED(hr)) break; //Get the lower and upper bounds of the variant array hr = SafeArrayGetLBound(var.parray, 1, &lLBound); if(FAILED(hr)) break; hr = SafeArrayGetUBound(var.parray, 1, &lUBound); if(FAILED(hr)) break; //There are elements at both the lower bound and upper bound, so include them for(; lLBound <= lUBound; lLBound++) { //Get a BSTR object from the safe array hr = SafeArrayGetElement(var.parray, &lLBound, &bstrEmObj); if (FAILED(hr)) break; //Create a local copy of the EmObject (there aren't any pointers in //EmObject structure, so don't worry about doing a deep copy pCurrentObj = ((CEmshellApp*)AfxGetApp())->AllocEmObject(); if (pCurrentObj != NULL) { *pCurrentObj = *GetEmObj( bstrEmObj ); } SysFreeString( bstrEmObj ); //Unallocate the EmObject if it has an hr of E_FAIL if (FAILED(pCurrentObj->hr)) { ((CEmshellApp*)AfxGetApp())->DeAllocEmObject( pCurrentObj ); continue; } //Convert the BSTR object to an EmObject and pass it to DisplayData DisplayLogData( pCurrentObj ); } } while (FALSE); SafeArrayDestroyData(var.parray); SysFreeString ( bstrEmObjectFilter ); SysFreeString ( bstrEmObj ); if (FAILED(hr)) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(hr); } } void CEmshellView::StoreOffSelectedEmObject() { PEmObject pEmObject = NULL; //Get the currently selected emObject pEmObject = GetSelectedEmObject(); if ( pEmObject != NULL ) { //store off it's name m_lastSelectedEmObj = *pEmObject; } else { memset ( &m_lastSelectedEmObj, 0, sizeof ( EmObject ) ); } } void CEmshellView::SetShellState(EMShellViewState eState) { StoreOffSelectedEmObject(); //Clear the current view ListCtrlClear(); //Set the view style to the appropriate enum view state m_enumShellViewState = eState; //Initialize the new view state ListCtrlInitialize(m_enumShellViewState); } void CEmshellView::ListCtrlInitialize(EMShellViewState eShellViewState) { switch (eShellViewState) { case SHELLVIEW_ALL: InitializeAllView(); break; case SHELLVIEW_APPLICATIONS: InitializeProcessView(); break; case SHELLVIEW_COMPLETEDSESSIONS: InitializeCompletedSessionsView(); break; case SHELLVIEW_SERVICES: InitializeServiceView(); break; case SHELLVIEW_LOGFILES: InitializeLogView(); break; case SHELLVIEW_DUMPFILES: InitializeDumpView(); break; case SHELLVIEW_MSINFOFILES: InitializeMSInfoView(); break; case SHELLVIEW_NONE: break; } } void CEmshellView::SelectItemBySZNAME(TCHAR* pszName, int nId) { //Search through the list selecting the item whose itemdata.szname matches pszName //Given a pszName, find the element in the ListCtl PEmObject pListEmObject = NULL; BOOL bFound = FALSE; int nFirstMatch = -1; //Step through every item in the list control searching for pEmObject int nCount = m_mainListControl.GetItemCount(); for (int i = 0;i < nCount; i++) { pListEmObject = (PEmObject) m_mainListControl.GetItemData(i); if (pListEmObject == NULL) break; if (wcscmp(pListEmObject->szName, pszName) == 0 ) { if (nFirstMatch == -1 ) nFirstMatch = i; if (pListEmObject->nId == nId) { m_mainListControl.SelectItem(i); bFound = TRUE; //We have found the element, stop the search break; } } } //If the we didn't find a perfect match, select the first near match //And if we didn't find any, select the first item in the list if ( !bFound ) { if (nFirstMatch == -1) { m_mainListControl.SelectItem(0); } else { m_mainListControl.SelectItem(nFirstMatch); } } } void CEmshellView::ListCtrlPopulate(EMShellViewState eShellViewState) { DWORD dwPollSessionsFreq = 30L; // default is 30 secs ((CEmshellApp*)AfxGetApp())->GetEmShellRegOptions( TRUE, &dwPollSessionsFreq ); switch (eShellViewState) { case SHELLVIEW_ALL: PopulateProcessType(); PopulateServiceType(); ReSynchServices(); ReSynchApplications(); SetTimer( 1, dwPollSessionsFreq*1000, 0); break; case SHELLVIEW_APPLICATIONS: PopulateProcessType(); ReSynchApplications(); SetTimer( 1, dwPollSessionsFreq*1000, 0); break; case SHELLVIEW_SERVICES: PopulateServiceType(); ReSynchServices(); SetTimer( 1, dwPollSessionsFreq*1000, 0); break; case SHELLVIEW_COMPLETEDSESSIONS: PopulateCompletedSessionsType(); ReSynchStoppedSessions(); break; case SHELLVIEW_LOGFILES: PopulateLogType(); break; case SHELLVIEW_DUMPFILES: PopulateDumpType(); break; case SHELLVIEW_MSINFOFILES: PopulateMSInfoType(); break; case SHELLVIEW_NONE: break; } //Select the last selected item //Try to select the last emobject name selected. If not, select the first item in the view. SelectItemBySZNAME( m_lastSelectedEmObj.szName, m_lastSelectedEmObj.nId ); } /*void CEmshellView::CloseAllSessions() { } */ void CEmshellView::ListCtrlClear() { INT_PTR nUpperBound = 0; PActiveSession pActiveSession = NULL; HRESULT hr = E_FAIL; PEmObject pEmObject = NULL; INT_PTR nCount = m_mainListControl.GetItemCount(); //We need to make sure the timer doesn't get through when the list is empty //Destroy the timer first KillTimer(1); //Step through every item in the list control and delete the pEmObjects //and the item. for (int i = 0;i < nCount; i++) { pEmObject = (PEmObject)m_mainListControl.GetItemData(i); //Cast dwData to a EmObject and call delete on it ((CEmshellApp*)AfxGetApp())->DeAllocEmObject(pEmObject); } //Remove all the items from the list control i = m_mainListControl.DeleteAllItems(); ASSERT(m_mainListControl.GetItemCount() == 0); //Set all the pEmObjects to NULL for (nUpperBound = m_SessionTable.GetUpperBound(); nUpperBound >= 0; nUpperBound--) { pActiveSession = (PActiveSession) m_SessionTable.GetAt(nUpperBound); ASSERT(pActiveSession != NULL); pActiveSession->pEmObject = NULL; } } void CEmshellView::OnViewServicesandapplications() { if ( m_enumShellViewState == SHELLVIEW_ALL ) return; SetShellState(SHELLVIEW_ALL); ListCtrlPopulate(SHELLVIEW_ALL); } void CEmshellView::OnUpdateViewServicesandapplications(CCmdUI* pCmdUI) { BOOL bEnable = FALSE; BOOL bChecked = FALSE; if ( GetDocument()->GetConnectedToServerState() == TRUE ) { bEnable = TRUE; if ( m_enumShellViewState == SHELLVIEW_ALL ) { bChecked = TRUE; } } pCmdUI->Enable ( bEnable ); pCmdUI->SetCheck( bChecked ); } void CEmshellView::OnViewLogfiles() { if ( m_enumShellViewState == SHELLVIEW_LOGFILES ) return; SetShellState(SHELLVIEW_LOGFILES); ListCtrlPopulate(SHELLVIEW_LOGFILES); } void CEmshellView::OnUpdateViewLogfiles(CCmdUI* pCmdUI) { BOOL bEnable = FALSE; BOOL bChecked = FALSE; if ( GetDocument()->GetConnectedToServerState() == TRUE ) { bEnable = TRUE; if ( m_enumShellViewState == SHELLVIEW_LOGFILES ) bChecked = TRUE; } pCmdUI->Enable ( bEnable ); pCmdUI->SetCheck( bChecked ); } void CEmshellView::OnViewDumpfiles() { if ( m_enumShellViewState == SHELLVIEW_DUMPFILES ) return; SetShellState(SHELLVIEW_DUMPFILES); ListCtrlPopulate(SHELLVIEW_DUMPFILES); } void CEmshellView::OnUpdateViewDumpfiles(CCmdUI* pCmdUI) { BOOL bEnable = FALSE; BOOL bChecked = FALSE; if ( GetDocument()->GetConnectedToServerState() == TRUE ) { bEnable = TRUE; if ( m_enumShellViewState == SHELLVIEW_DUMPFILES ) bChecked = TRUE; } pCmdUI->Enable ( bEnable ); pCmdUI->SetCheck( bChecked ); } void CEmshellView::OnUpdateLogpopupOpen(CCmdUI* pCmdUI) { BOOL bEnable = FALSE; //TODO: Enable the button when display a log file is supported pCmdUI->Enable ( m_enumShellViewState == SHELLVIEW_LOGFILES ); } void CEmshellView::OnLogpopupOpen() { // TODO: Add your command handler code here PEmObject pEmObject = NULL; pEmObject = GetSelectedEmObject(); if ( pEmObject == NULL ) return; CReadLogsDlg ReadLogDlg(pEmObject, GetDocument()->GetEmManager()); ReadLogDlg.DoModal(); } void CEmshellView::OnUpdateLogpopupProperties(CCmdUI* pCmdUI) { BOOL bEnable = FALSE; //TODO: Enable the button when properties of a log file is supported pCmdUI->Enable ( TRUE ); } void CEmshellView::OnLogpopupProperties() { // TODO: Add your command handler code here PEmObject pEmObject = GetSelectedEmObject(); if ( pEmObject ) { ShowProperties( pEmObject ); } } void CEmshellView::ShowProperties( PEmObject pEmObject ) { CPropertySheet propsheet; CPropPageGenLogDump genLogDumpPropPage; genLogDumpPropPage.m_pEmObj = pEmObject; genLogDumpPropPage.m_pParentPropSheet = &propsheet; propsheet.AddPage(&genLogDumpPropPage); propsheet.SetTitle( pEmObject->szName, PSH_PROPTITLE ); propsheet.DoModal(); if( genLogDumpPropPage.m_bDeleteFile ) { OnLogpopupDelete(); } } EMShellViewState CEmshellView::GetViewState() { return m_enumShellViewState; } HRESULT CEmshellView::StartCDBClient(IN LPTSTR lpszConnectString) { STARTUPINFO sp; PROCESS_INFORMATION pi; ZeroMemory(&sp, sizeof( sp ) ); ZeroMemory(&pi, sizeof( pi ) ); BOOL bCdbCreated = CreateProcess(// This has to be obtained from the registry... _T("C:\\Debuggers\\cdb.exe"), lpszConnectString, NULL, NULL, FALSE, CREATE_NEW_PROCESS_GROUP | CREATE_NEW_CONSOLE, NULL, NULL, &sp, &pi ); // // Wait till CDB does some initializations.. // Don't know how long to wait.. have to figure out a way.. // Sleep(2000); if(bCdbCreated == FALSE){ return HRESULT_FROM_WIN32(GetLastError()); } return S_OK; } HRESULT CEmshellView::GetClientConnectString(IN OUT LPTSTR pszConnectString, IN DWORD dwBuffSize, PEmObject pEmSessObj, int nPort) { _ASSERTE(pszConnectString != NULL); _ASSERTE(dwBuffSize > 0L); HRESULT hr = E_FAIL; DWORD dwBuff = MAX_COMPUTERNAME_LENGTH; do { if( pszConnectString == NULL || dwBuffSize <= 0L ) break; if( nPort != 0 ){ _stprintf(pszConnectString, _T(" -remote tcp:server=%s,port=%d"), GetDocument()->GetServerName(), nPort); } else { _stprintf(pszConnectString, _T(" -remote npipe:server=%s,pipe=EM_%d"), GetDocument()->GetServerName(), pEmSessObj->nId); } hr = S_OK; } while( false ); return hr; } void CEmshellView::DoModalPropertySheet(PEmObject pEmObject) { CPropertySheet propsheet; CPropPageGeneral generalPropPage; CPropPageLogFiles logFilesPropPage; CPropPageDumpFiles dumpFilesPropPage; BOOL bInActiveSessionTable = FALSE; generalPropPage.m_pEmObject = pEmObject; logFilesPropPage.m_pEmObject = pEmObject; logFilesPropPage.m_pIEmManager = GetDocument()->GetEmManager(); dumpFilesPropPage.m_pEmObject = pEmObject; dumpFilesPropPage.m_pIEmManager = GetDocument()->GetEmManager(); propsheet.AddPage(&generalPropPage); propsheet.AddPage(&logFilesPropPage); propsheet.AddPage(&dumpFilesPropPage); // // a-mando // propsheet.SetTitle( pEmObject->szName, PSH_PROPTITLE ); propsheet.DoModal(); } void CEmshellView::OnViewApplications() { if ( m_enumShellViewState == SHELLVIEW_APPLICATIONS ) return; SetShellState(SHELLVIEW_APPLICATIONS); ListCtrlPopulate(SHELLVIEW_APPLICATIONS); } void CEmshellView::OnUpdateViewApplications(CCmdUI* pCmdUI) { BOOL bEnable = FALSE; BOOL bChecked = FALSE; if ( GetDocument()->GetConnectedToServerState() == TRUE ) { bEnable = TRUE; if ( m_enumShellViewState == SHELLVIEW_APPLICATIONS ) bChecked = TRUE; } pCmdUI->Enable ( bEnable ); pCmdUI->SetCheck( bChecked ); } void CEmshellView::OnViewCompletedsessions() { if ( m_enumShellViewState == SHELLVIEW_COMPLETEDSESSIONS ) return; SetShellState(SHELLVIEW_COMPLETEDSESSIONS); ListCtrlPopulate(SHELLVIEW_COMPLETEDSESSIONS); } void CEmshellView::OnUpdateViewCompletedsessions(CCmdUI* pCmdUI) { BOOL bEnable = FALSE; BOOL bChecked = FALSE; if ( GetDocument()->GetConnectedToServerState() == TRUE ) { bEnable = TRUE; if ( m_enumShellViewState == SHELLVIEW_COMPLETEDSESSIONS ) bChecked = TRUE; } pCmdUI->Enable ( bEnable ); pCmdUI->SetCheck( bChecked ); } void CEmshellView::OnViewServices() { if ( m_enumShellViewState == SHELLVIEW_SERVICES ) return; SetShellState(SHELLVIEW_SERVICES); ListCtrlPopulate(SHELLVIEW_SERVICES); } void CEmshellView::OnUpdateViewServices(CCmdUI* pCmdUI) { BOOL bEnable = FALSE; BOOL bChecked = FALSE; if ( GetDocument()->GetConnectedToServerState() == TRUE ) { bEnable = TRUE; if ( m_enumShellViewState == SHELLVIEW_SERVICES ) bChecked = TRUE; } pCmdUI->Enable ( bEnable ); pCmdUI->SetCheck( bChecked ); } void CEmshellView::OnProcesspopupDeleteSession() { //Delete the session for the current item selected PEmObject pEmObject = NULL; HRESULT hr = E_FAIL; int nIndex = -1; PActiveSession pActiveSession = NULL; IEmDebugSession* pTempDebugSession = NULL; BSTR bstrEmObj = NULL; do { nIndex = GetSelectedItemIndex(); if ( nIndex == -1 ) break; pEmObject = ( PEmObject ) m_mainListControl.GetItemData( nIndex ); if ( pEmObject == NULL ) break; //Find the element in the session table pActiveSession = FindActiveSession( pEmObject ); if ( pActiveSession == NULL ) { //Create bstr's for the journey ahead, and break if we can't bstrEmObj = CopyBSTR ( (LPBYTE)pEmObject, sizeof( EmObject ) ); if( bstrEmObj == NULL ){ hr = E_OUTOFMEMORY; break; } //We don't have a session open, so open a temporary session hr = GetDocument()->GetEmManager()->OpenSession( bstrEmObj, &pTempDebugSession ); if (FAILED(hr)) break; SysFreeString( bstrEmObj ); if ( hr == S_OK ) { //We are the master now... Delete the debug session hr = DeleteDebugSession( pEmObject ); if ( FAILED( hr ) ) break; } else if ( hr == S_FALSE ) { //Adopt the orphan if the user wants if ( CommenceOrphanCustodyBattle( pTempDebugSession ) ) { hr = DeleteDebugSession( pEmObject ); if ( FAILED( hr ) ) break; } else break; } else if ( hr == E_FAIL ) { //Notify the user that the process currently belongs to someone else break; } } else { //Close and remove the currently selected session hr = DeleteDebugSession( pEmObject ); if ( FAILED( hr ) ) break; hr = RemoveActiveSession( pEmObject ); if ( FAILED( hr ) ) break; } //Cast dwData to a EmObject and call delete on it ((CEmshellApp*)AfxGetApp())->DeAllocEmObject(pEmObject); //Remove the item from the list control m_mainListControl.DeleteItem( nIndex ); } while ( FALSE ); if ( FAILED( hr ) ) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR( hr ); } if ( pTempDebugSession ) { //Release the pTempDebugSession pointer SAFE_RELEASEIX( pTempDebugSession ); } SysFreeString ( bstrEmObj ); } void CEmshellView::OnUpdateProcesspopupDeleteSession( CCmdUI* pCmdUI ) { PEmObject pEmObject = NULL; PActiveSession pActiveSession = NULL; BOOL bEnable = FALSE; do { if ( !GetDocument()->GetConnectedToServerState() ) break; // Update the state of this button based on the state of the currently selected item //Get the currently selected emObject pEmObject = GetSelectedEmObject(); if ( pEmObject == NULL ) break; pActiveSession = FindActiveSession( pEmObject ); //Determine if the status of pActiveSession and enable this apprpriately //If it's status is stopped && (it's an orphan || it's in our session table) if ( pEmObject->nStatus & STAT_SESS_STOPPED && ( pEmObject->nStatus & STAT_ORPHAN || pActiveSession ) ) { bEnable = TRUE; } }while ( FALSE ); pCmdUI->Enable( bEnable ); } void CEmshellView::OnToolsOptions() { // TODO: Add your command handler code here CEmOptions EmOpts; DWORD dwPollSessionsFreq = 30L; // default if( EmOpts.DoModal() == IDOK ) { ((CEmshellApp*)AfxGetApp())->GetEmShellRegOptions( FALSE, &dwPollSessionsFreq ); KillTimer( 1 ); SetTimer( 1, dwPollSessionsFreq*1000, 0); } } void CEmshellView::OnUpdateToolsOptoins(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here } void CEmshellView::OnProcesspopupCancelDebugSession() { //Stop the session for the current item selected PEmObject pEmObject = NULL; HRESULT hr = E_FAIL; do { pEmObject = GetSelectedEmObject(); if ( pEmObject == NULL ) break; //Stop and remove the session CancelDebugSession( pEmObject ); hr = S_OK; } while ( FALSE ); if ( FAILED( hr ) ) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR( hr ); } } // // a-mando // void CEmshellView::OnLogpopupDelete() { //Stop the session for the current item selected PEmObject pEmObject = NULL; HRESULT hr = E_FAIL; BSTR bstrEmObj = NULL; UINT nIndex = -1; do { nIndex = GetSelectedItemIndex(); if ( nIndex == -1 ) break; pEmObject = GetSelectedEmObject(); if ( pEmObject == NULL ) break; bstrEmObj = CopyBSTR ( (LPBYTE)pEmObject, sizeof( EmObject ) ); if( bstrEmObj == NULL ){ hr = E_OUTOFMEMORY; break; } hr = GetDocument()->GetEmManager()->DeleteFile( bstrEmObj ); if( FAILED(hr) ) break; //Remove the item from the list control m_mainListControl.DeleteItem( nIndex ); if( !m_mainListControl.SelectItem( nIndex ) ) { m_mainListControl.SelectItem( nIndex-1 ); } } while ( FALSE ); if ( FAILED( hr ) ) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR( hr ); } } void CEmshellView::OnUpdateLogpopupDelete(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here } // a-mando void CEmshellView::OnActionGenerateMSInfoFile() { // TODO: Add your command handler code here CMSInfoDlg DlgMsInfo; BSTR bstrCategories = NULL; HRESULT hr = S_OK; CWaitCursor wait; // we won't show this dialog if the user doesn't want it. if( !((CEmshellApp*)AfxGetApp())->m_dwShowMSInfoDlg || DlgMsInfo.DoModal() == IDOK ) { ((CEmshellApp*)AfxGetApp())->m_dwShowMSInfoDlg = !DlgMsInfo.m_bDlgNoShow; bstrCategories = DlgMsInfo.m_csCategories.AllocSysString(); hr = GetDocument()->GetEmManager()->MakeNFO( NULL, NULL, bstrCategories ); } SysFreeString( bstrCategories ); if ( FAILED( hr ) ) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR( hr ); } } void CEmshellView::OnUpdateActionGenerateMSInfoFile(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable( GetDocument()->GetConnectedToServerState() ); } void CEmshellView::OnViewMSInfoFiles() { if ( m_enumShellViewState == SHELLVIEW_MSINFOFILES ) return; SetShellState(SHELLVIEW_MSINFOFILES); ListCtrlPopulate(SHELLVIEW_MSINFOFILES); } void CEmshellView::OnUpdateViewMSInfoFiles(CCmdUI* pCmdUI) { BOOL bEnable = FALSE; BOOL bChecked = FALSE; if ( GetDocument()->GetConnectedToServerState() == TRUE ) { bEnable = TRUE; if ( m_enumShellViewState == SHELLVIEW_MSINFOFILES ) bChecked = TRUE; } pCmdUI->Enable ( bEnable ); pCmdUI->SetCheck( bChecked ); } void CEmshellView::PopulateMSInfoType() { _variant_t var; //This will create and initialize the var variant HRESULT hr = E_FAIL; LONG lLBound = 0; LONG lUBound = 0; BSTR bstrEmObj = NULL; BSTR bstrEmObjectFilter = NULL; EmObject *pCurrentObj = NULL; EmObject EmObjectFilter; memset(&EmObjectFilter, 0, sizeof( EmObject ) ); do { EmObjectFilter.type = EMOBJ_MSINFO; bstrEmObjectFilter = CopyBSTR ( (LPBYTE)&EmObjectFilter, sizeof( EmObject ) ); //Populate the list control based on the EmObjectType //Enumerate all the objects and stick them in the variant hr = GetDocument()->GetEmManager()->EnumObjectsEx(bstrEmObjectFilter, &var); if(FAILED(hr)) break; //Get the lower and upper bounds of the variant array hr = SafeArrayGetLBound(var.parray, 1, &lLBound); if(FAILED(hr)) break; hr = SafeArrayGetUBound(var.parray, 1, &lUBound); if(FAILED(hr)) break; //There are elements at both the lower bound and upper bound, so include them for(; lLBound <= lUBound; lLBound++) { //Get a BSTR object from the safe array hr = SafeArrayGetElement(var.parray, &lLBound, &bstrEmObj); if (FAILED(hr)) break; //Create a local copy of the EmObject (there aren't any pointers in //EmObject structure, so don't worry about doing a deep copy pCurrentObj = ((CEmshellApp*)AfxGetApp())->AllocEmObject(); if (pCurrentObj != NULL) { *pCurrentObj = *GetEmObj( bstrEmObj ); } SysFreeString( bstrEmObj ); //Unallocate the EmObject if it has an hr of E_FAIL if (FAILED(pCurrentObj->hr)) { ((CEmshellApp*)AfxGetApp())->DeAllocEmObject( pCurrentObj ); continue; } //Convert the BSTR object to an EmObject and pass it to DisplayData DisplayMSInfoData( pCurrentObj ); } } while (FALSE); SafeArrayDestroyData(var.parray); SysFreeString ( bstrEmObjectFilter ); SysFreeString( bstrEmObj ); if (FAILED(hr)) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(hr); } } void CEmshellView::InitializeMSInfoView() { InitializeLogView(); } void CEmshellView::OnLogpopupExport() { PEmObject pEmObject = NULL; CString strDirPath; do { pEmObject = GetSelectedEmObject(); if ( pEmObject == NULL ) break; //Get the path if ( ( (CEmshellApp*) AfxGetApp() )->AskForPath( strDirPath ) ) { //Export the file ((CEmshellApp*)AfxGetApp())->ExportLog( pEmObject, strDirPath, GetDocument()->GetEmManager() ); } } while ( FALSE ); } void CEmshellView::OnUpdateLogpopupExport(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here } void CEmshellView::OnHelpContents() { // TODO: Add your command handler code here HWND hwnd = HtmlHelp( ::GetDesktopWindow(), ((CEmshellApp*)AfxGetApp())->m_strApplicationPath + gtcEmChm, HH_DISPLAY_TOPIC, NULL ); }