mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3772 lines
103 KiB
3772 lines
103 KiB
// 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 );
|
|
}
|