311 lines
7.9 KiB
C++
311 lines
7.9 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation 1996-2001.
|
||
|
//
|
||
|
// File: perfanal.cpp
|
||
|
//
|
||
|
// Contents: implementation of CPerformAnalysis
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "wsecmgr.h"
|
||
|
#include "snapmgr.h"
|
||
|
#include "PerfAnal.h"
|
||
|
#include "wrapper.h"
|
||
|
#include "util.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CPerformAnalysis dialog
|
||
|
|
||
|
|
||
|
CPerformAnalysis::CPerformAnalysis(CWnd * pParent, UINT nTemplateID)
|
||
|
: CHelpDialog(a215HelpIDs, nTemplateID ? nTemplateID : IDD, pParent)
|
||
|
{
|
||
|
//{{AFX_DATA_INIT(CPerformAnalysis)
|
||
|
m_strLogFile = _T("");
|
||
|
//}}AFX_DATA_INIT
|
||
|
}
|
||
|
|
||
|
|
||
|
void CPerformAnalysis::DoDataExchange(CDataExchange* pDX)
|
||
|
{
|
||
|
CDialog::DoDataExchange(pDX);
|
||
|
//{{AFX_DATA_MAP(CPerformAnalysis)
|
||
|
DDX_Control(pDX, IDOK, m_ctlOK);
|
||
|
DDX_Text(pDX, IDC_ERROR, m_strError);
|
||
|
DDX_Text(pDX, IDC_LOG_FILE, m_strLogFile);
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CPerformAnalysis, CHelpDialog)
|
||
|
//{{AFX_MSG_MAP(CPerformAnalysis)
|
||
|
ON_BN_CLICKED(IDOK, OnOK)
|
||
|
ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
|
||
|
ON_EN_CHANGE(IDC_LOG_FILE, OnChangeLogFile)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CPerformAnalysis message handlers
|
||
|
|
||
|
void CPerformAnalysis::OnBrowse()
|
||
|
{
|
||
|
CString strLogFileExt;
|
||
|
CString strLogFileFilter;
|
||
|
CString strTitle;
|
||
|
|
||
|
OPENFILENAME ofn;
|
||
|
::ZeroMemory (&ofn, sizeof (OPENFILENAME));
|
||
|
ofn.lStructSize = sizeof(OPENFILENAME);
|
||
|
|
||
|
UpdateData(TRUE);
|
||
|
|
||
|
strLogFileExt.LoadString(IDS_LOGFILE_DEF_EXT);
|
||
|
strLogFileFilter.LoadString(IDS_LOGFILE_FILTER);
|
||
|
strTitle.LoadString(IDS_LOGFILE_PICKER_TITLE);
|
||
|
|
||
|
// Translate filter into commdlg format (lots of \0)
|
||
|
LPTSTR szFilter = strLogFileFilter.GetBuffer(0); // modify the buffer in place
|
||
|
// MFC delimits with '|' not '\0'
|
||
|
|
||
|
LPTSTR pch = szFilter;
|
||
|
while ((pch = _tcschr(pch, '|')) != NULL)
|
||
|
*pch++ = '\0';
|
||
|
// do not call ReleaseBuffer() since the string contains '\0' characters
|
||
|
|
||
|
ofn.lpstrFilter = szFilter;
|
||
|
ofn.lpstrFile = m_strLogFile.GetBuffer(MAX_PATH),
|
||
|
ofn.nMaxFile = MAX_PATH;
|
||
|
ofn.lpstrDefExt = strLogFileExt,
|
||
|
ofn.hwndOwner = m_hWnd;
|
||
|
ofn.Flags = OFN_HIDEREADONLY |
|
||
|
OFN_EXPLORER |
|
||
|
OFN_DONTADDTORECENT|
|
||
|
OFN_NOREADONLYRETURN,
|
||
|
ofn.lpstrTitle = strTitle;
|
||
|
|
||
|
//
|
||
|
// Default to the currently picked log file
|
||
|
//
|
||
|
|
||
|
if (GetOpenFileName(&ofn)) {
|
||
|
m_strLogFile.ReleaseBuffer();
|
||
|
UpdateData(FALSE);
|
||
|
} else {
|
||
|
m_strLogFile.ReleaseBuffer();
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
//+--------------------------------------------------------------------------
|
||
|
//
|
||
|
// Method: DoIt
|
||
|
//
|
||
|
// Synopsis: Actually Analyzes the system (separated from OnOK so it can
|
||
|
// be overridden to Configure the system, etc. while still using
|
||
|
// the same OnOK shell code
|
||
|
//
|
||
|
//---------------------------------------------------------------------------
|
||
|
DWORD CPerformAnalysis::DoIt() {
|
||
|
//
|
||
|
// Store the log file we're using for next time
|
||
|
//
|
||
|
LPTSTR szLogFile = m_strLogFile.GetBuffer(0);
|
||
|
m_pComponentData->GetWorkingDir(GWD_ANALYSIS_LOG,&szLogFile,TRUE,TRUE);
|
||
|
m_strLogFile.ReleaseBuffer();
|
||
|
//
|
||
|
// InspectSystem will handle multi-threading and progress UI so
|
||
|
// SCE doesn't get wierd on the user
|
||
|
//
|
||
|
return InspectSystem(
|
||
|
NULL, // Always use the configuration assigned to the DB
|
||
|
m_strDataBase.IsEmpty() ? NULL: (LPCTSTR)m_strDataBase,
|
||
|
(LPCTSTR)m_strLogFile,
|
||
|
AREA_ALL
|
||
|
);
|
||
|
}
|
||
|
|
||
|
//+--------------------------------------------------------------------------
|
||
|
//
|
||
|
// Method: OnOK
|
||
|
//
|
||
|
// Synopsis: Analyzes the system
|
||
|
//
|
||
|
//---------------------------------------------------------------------------
|
||
|
afx_msg void CPerformAnalysis::OnOK()
|
||
|
{
|
||
|
CWnd *cwnd;
|
||
|
HANDLE hLogFile;
|
||
|
|
||
|
UpdateData(TRUE);
|
||
|
|
||
|
//
|
||
|
// We require a log file that we can write to
|
||
|
//
|
||
|
if (m_strLogFile.IsEmpty()) {
|
||
|
return;
|
||
|
}
|
||
|
else {
|
||
|
m_strLogFile = ExpandEnvironmentStringWrapper(m_strLogFile);
|
||
|
}
|
||
|
|
||
|
LONG dwPosLow = 0, dwPosHigh = 0;
|
||
|
hLogFile = CreateFile(m_strLogFile, // pointer to name of the file
|
||
|
GENERIC_WRITE, // access (read-write) mode
|
||
|
0, // share mode
|
||
|
NULL, // pointer to security attributes
|
||
|
OPEN_ALWAYS, // how to create
|
||
|
FILE_ATTRIBUTE_NORMAL, // file attributes
|
||
|
NULL // handle to file with attributes to copy
|
||
|
);
|
||
|
|
||
|
if (INVALID_HANDLE_VALUE == hLogFile) {
|
||
|
CString strFormat;
|
||
|
CString strError;
|
||
|
CString strTitle;
|
||
|
|
||
|
strFormat.LoadString(IDS_CANT_OPEN_LOG_FILE);
|
||
|
strError.Format(strFormat,m_strLogFile);
|
||
|
strTitle.LoadString(IDS_ANALYSIS_VIEWER_NAME);
|
||
|
|
||
|
MessageBox(strError,strTitle,MB_OK);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
dwPosLow = SetFilePointer(hLogFile, 0, &dwPosHigh, FILE_END );
|
||
|
CloseHandle(hLogFile);
|
||
|
|
||
|
|
||
|
CWaitCursor wc;
|
||
|
|
||
|
DWORD smstatus = ERROR_SUCCESS;
|
||
|
|
||
|
LPNOTIFY pNotify = m_pComponentData->GetNotifier();
|
||
|
ASSERT(pNotify);
|
||
|
|
||
|
//
|
||
|
// Lock the analysis pane since its data is invalid while we're inspecting
|
||
|
//
|
||
|
if (pNotify) {
|
||
|
pNotify->LockAnalysisPane(TRUE);
|
||
|
}
|
||
|
CFolder *pFolder = m_pComponentData->GetAnalFolder();
|
||
|
|
||
|
//
|
||
|
// Force the Analysis root node to be selected so that we display
|
||
|
// the generating information message. If we forse this repaint to happen
|
||
|
// now then we don't seem to have that AV problem.
|
||
|
//
|
||
|
if(pFolder && pNotify){
|
||
|
pNotify->SelectScopeItem(pFolder->GetScopeItem()->ID);
|
||
|
}
|
||
|
//
|
||
|
// Make sure we don't have the database open. That'll prevent us
|
||
|
// from being able to configure.
|
||
|
//
|
||
|
m_pComponentData->UnloadSadInfo();
|
||
|
|
||
|
|
||
|
//
|
||
|
// Disable the child windows so they don't respond to input while we're
|
||
|
// performing the inspection
|
||
|
//
|
||
|
cwnd = GetWindow(GW_CHILD);
|
||
|
while(cwnd) {
|
||
|
cwnd->EnableWindow(FALSE);
|
||
|
cwnd = cwnd->GetNextWindow();
|
||
|
}
|
||
|
|
||
|
//Raid #358503, 4/17/2001
|
||
|
HWND framehwnd = NULL;
|
||
|
LPCONSOLE pconsole = m_pComponentData->GetConsole();
|
||
|
if( pconsole )
|
||
|
{
|
||
|
pconsole->GetMainWindow(&framehwnd);
|
||
|
if( framehwnd )
|
||
|
{
|
||
|
::EnableWindow(framehwnd, FALSE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
smstatus = DoIt();
|
||
|
|
||
|
//Raid #358503, 4/17/2001
|
||
|
if( framehwnd )
|
||
|
{
|
||
|
::EnableWindow(framehwnd, TRUE);
|
||
|
}
|
||
|
//
|
||
|
// The inspection data is valid now, so let people back at it
|
||
|
//
|
||
|
if (pNotify) {
|
||
|
pNotify->LockAnalysisPane(false, false);
|
||
|
}
|
||
|
m_pComponentData->SetErroredLogFile(m_strLogFile, dwPosLow );
|
||
|
//
|
||
|
// There was an error so display the log file (if any)
|
||
|
//
|
||
|
if (ERROR_SUCCESS != smstatus) {
|
||
|
m_pComponentData->SetFlags( CComponentDataImpl::flag_showLogFile );
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// We're done inspecting so reenable input to the child windows
|
||
|
//
|
||
|
cwnd = GetWindow(GW_CHILD);
|
||
|
while(cwnd) {
|
||
|
cwnd->EnableWindow(TRUE);
|
||
|
cwnd = cwnd->GetNextWindow();
|
||
|
}
|
||
|
|
||
|
//CDialog::OnOK();
|
||
|
UpdateData();
|
||
|
DestroyWindow();
|
||
|
}
|
||
|
|
||
|
BOOL CPerformAnalysis::OnInitDialog()
|
||
|
{
|
||
|
CDialog::OnInitDialog();
|
||
|
|
||
|
UpdateData(FALSE);
|
||
|
if (m_strLogFile.IsEmpty()) {
|
||
|
m_ctlOK.EnableWindow(FALSE);
|
||
|
}
|
||
|
|
||
|
m_strOriginalLogFile = m_strLogFile;
|
||
|
|
||
|
return TRUE; // return TRUE unless you set the focus to a control
|
||
|
// EXCEPTION: OCX Property Pages should return FALSE
|
||
|
}
|
||
|
|
||
|
void CPerformAnalysis::OnChangeLogFile()
|
||
|
{
|
||
|
UpdateData(TRUE);
|
||
|
if (m_strLogFile.IsEmpty())
|
||
|
m_ctlOK.EnableWindow(FALSE);
|
||
|
else
|
||
|
m_ctlOK.EnableWindow(TRUE);
|
||
|
|
||
|
m_strError.Empty();
|
||
|
UpdateData(FALSE);
|
||
|
}
|
||
|
|
||
|
|
||
|
void CPerformAnalysis::OnCancel() {
|
||
|
// CDialog::OnCancel();
|
||
|
|
||
|
m_strLogFile = m_strOriginalLogFile;
|
||
|
DestroyWindow();
|
||
|
}
|