373 lines
11 KiB
C++
373 lines
11 KiB
C++
|
//
|
||
|
// Driver Verifier UI
|
||
|
// Copyright (c) Microsoft Corporation, 1999
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// module: CntPage.cxx
|
||
|
// author: DMihai
|
||
|
// created: 01/04/98
|
||
|
//
|
||
|
// Description:
|
||
|
//
|
||
|
// Global Counters PropertyPage.
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "drvvctrl.hxx"
|
||
|
#include "CntPage.hxx"
|
||
|
|
||
|
#include "DrvCSht.hxx"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
// timer ID
|
||
|
#define REFRESH_TIMER_ID 0x4321
|
||
|
|
||
|
// manual, high, normal, low speed
|
||
|
#define REFRESH_SPEED_VARS 4
|
||
|
|
||
|
// timer intervals in millisec for manual, high, normal, low speed
|
||
|
static UINT uTimerIntervals[ REFRESH_SPEED_VARS ] =
|
||
|
{
|
||
|
0, // Manual
|
||
|
1000, // High Speed
|
||
|
5000, // Normal Speed
|
||
|
10000 // Low Speed
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// help IDs
|
||
|
//
|
||
|
|
||
|
static DWORD MyHelpIds[] =
|
||
|
{
|
||
|
IDC_COUNT_RAISEIRQL_EDIT, IDH_DV_CountersTab_other_irql,
|
||
|
IDC_COUNT_ACQSPINL_EDIT, IDH_DV_CountersTab_other_spinlocks,
|
||
|
IDC_COUNT_SYNCREX_EDIT, IDH_DV_CountersTab_other_sync,
|
||
|
IDC_COUNT_TRIMS_EDIT, IDH_DV_CountersTab_other_trims,
|
||
|
IDC_COUNT_ALLOC_ATTEMPT_EDIT, IDH_DV_CountersTab_allocations_attempt,
|
||
|
IDC_COUNT_ALLOC_SUCC_EDIT, IDH_DV_CountersTab_allocations_succeed,
|
||
|
IDC_COUNT_ALLOCSUCC_SPECPOOL_EDIT, IDH_DV_CountersTab_allocations_succeed_pool,
|
||
|
IDC_COUNT_ALLOC_NOTAG_EDIT, IDH_DV_CountersTab_allocations_wotag,
|
||
|
IDC_COUNT_ALLOC_FAILED_EDIT, IDH_DV_CountersTab_allocations_failed,
|
||
|
IDC_COUNT_ALLOC_FAILEDDEL_EDIT, IDH_DV_CountersTab_other_faults,
|
||
|
|
||
|
IDC_COUNT_REFRESH_BUTTON, IDH_DV_common_refresh_nowbutton,
|
||
|
IDC_COUNT_MANUAL_RADIO, IDH_DV_common_refresh_manual,
|
||
|
IDC_COUNT_HSPEED_RADIO, IDH_DV_common_refresh_high,
|
||
|
IDC_COUNT_NORM_RADIO, IDH_DV_common_refresh_normal,
|
||
|
IDC_COUNT_LOW_RADIO, IDH_DV_common_refresh_low,
|
||
|
0, 0
|
||
|
};
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////
|
||
|
static void GetStringFromULONG( CString &strValue, ULONG uValue )
|
||
|
{
|
||
|
LPTSTR lptstrValue = strValue.GetBuffer( 64 );
|
||
|
if( lptstrValue != NULL )
|
||
|
{
|
||
|
_stprintf( lptstrValue, _T( "%lu" ), uValue );
|
||
|
strValue.ReleaseBuffer();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ASSERT( FALSE );
|
||
|
strValue.Empty();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////
|
||
|
// CCountersPage property page
|
||
|
|
||
|
IMPLEMENT_DYNCREATE(CCountersPage, CPropertyPage)
|
||
|
|
||
|
CCountersPage::CCountersPage()
|
||
|
: CPropertyPage(CCountersPage::IDD)
|
||
|
{
|
||
|
//{{AFX_DATA_INIT(CCountersPage)
|
||
|
m_strAcqSpinlEdit = _T("");
|
||
|
m_strAllocAttemptEdit = _T("");
|
||
|
m_strAllocFailed = _T("");
|
||
|
m_strAllocFailedDelEdit = _T("");
|
||
|
m_strAllocNoTagEdit = _T("");
|
||
|
m_strAllocSucc = _T("");
|
||
|
m_strAllocSuccSpecPool = _T("");
|
||
|
m_strRaiseIrqLevelEdit = _T("");
|
||
|
m_strSyncrExEdit = _T("");
|
||
|
m_strTrimsEdit = _T("");
|
||
|
m_nUpdateIntervalIndex = 2;
|
||
|
//}}AFX_DATA_INIT
|
||
|
|
||
|
m_uTimerHandler = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CCountersPage::DoDataExchange(CDataExchange* pDX)
|
||
|
{
|
||
|
if( ! pDX->m_bSaveAndValidate )
|
||
|
{
|
||
|
// query the kernel
|
||
|
if( KrnGetSystemVerifierState( &m_KrnVerifState ) &&
|
||
|
m_KrnVerifState.DriverCount > 0 )
|
||
|
{
|
||
|
// RaiseIrqls
|
||
|
GetStringFromULONG( m_strRaiseIrqLevelEdit,
|
||
|
m_KrnVerifState.RaiseIrqls );
|
||
|
|
||
|
// AcquireSpinLocks
|
||
|
GetStringFromULONG( m_strAcqSpinlEdit,
|
||
|
m_KrnVerifState.AcquireSpinLocks );
|
||
|
|
||
|
// SynchronizeExecutions
|
||
|
GetStringFromULONG( m_strSyncrExEdit,
|
||
|
m_KrnVerifState.SynchronizeExecutions );
|
||
|
|
||
|
// AllocationsAttempted
|
||
|
GetStringFromULONG( m_strAllocAttemptEdit,
|
||
|
m_KrnVerifState.AllocationsAttempted );
|
||
|
|
||
|
// AllocationsSucceeded
|
||
|
GetStringFromULONG( m_strAllocSucc,
|
||
|
m_KrnVerifState.AllocationsSucceeded );
|
||
|
|
||
|
// AllocationsSucceededSpecialPool
|
||
|
GetStringFromULONG( m_strAllocSuccSpecPool,
|
||
|
m_KrnVerifState.AllocationsSucceededSpecialPool );
|
||
|
|
||
|
// AllocationsWithNoTag
|
||
|
GetStringFromULONG( m_strAllocNoTagEdit,
|
||
|
m_KrnVerifState.AllocationsWithNoTag );
|
||
|
|
||
|
// Trims
|
||
|
GetStringFromULONG( m_strTrimsEdit,
|
||
|
m_KrnVerifState.Trims );
|
||
|
|
||
|
// AllocationsFailed
|
||
|
GetStringFromULONG( m_strAllocFailed,
|
||
|
m_KrnVerifState.AllocationsFailed );
|
||
|
|
||
|
// AllocationsFailedDeliberately
|
||
|
GetStringFromULONG( m_strAllocFailedDelEdit,
|
||
|
m_KrnVerifState.AllocationsFailedDeliberately );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// RaiseIrqls
|
||
|
VERIFY( m_strRaiseIrqLevelEdit.LoadString( IDS_ZERO ) );
|
||
|
|
||
|
// AcquireSpinLocks
|
||
|
VERIFY( m_strAcqSpinlEdit.LoadString( IDS_ZERO ) );
|
||
|
|
||
|
// SynchronizeExecutions
|
||
|
VERIFY( m_strSyncrExEdit.LoadString( IDS_ZERO ) );
|
||
|
|
||
|
// AllocationsAttempted
|
||
|
VERIFY( m_strAllocAttemptEdit.LoadString( IDS_ZERO ) );
|
||
|
|
||
|
// AllocationsSucceeded
|
||
|
VERIFY( m_strAllocSucc.LoadString( IDS_ZERO ) );
|
||
|
|
||
|
// AllocationsSucceededSpecialPool
|
||
|
VERIFY( m_strAllocSuccSpecPool.LoadString( IDS_ZERO ) );
|
||
|
|
||
|
// AllocationsWithNoTag
|
||
|
VERIFY( m_strAllocNoTagEdit.LoadString( IDS_ZERO ) );
|
||
|
|
||
|
// Trims
|
||
|
VERIFY( m_strTrimsEdit.LoadString( IDS_ZERO ) );
|
||
|
|
||
|
// AllocationsFailed
|
||
|
VERIFY( m_strAllocFailed.LoadString( IDS_ZERO ) );
|
||
|
|
||
|
// AllocationsFailedDeliberately
|
||
|
VERIFY( m_strAllocFailedDelEdit.LoadString( IDS_ZERO ) );
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CPropertyPage::DoDataExchange(pDX);
|
||
|
//{{AFX_DATA_MAP(CCountersPage)
|
||
|
DDX_Text(pDX, IDC_COUNT_ACQSPINL_EDIT, m_strAcqSpinlEdit);
|
||
|
DDX_Text(pDX, IDC_COUNT_ALLOC_ATTEMPT_EDIT, m_strAllocAttemptEdit);
|
||
|
DDX_Text(pDX, IDC_COUNT_ALLOC_FAILED_EDIT, m_strAllocFailed);
|
||
|
DDX_Text(pDX, IDC_COUNT_ALLOC_FAILEDDEL_EDIT, m_strAllocFailedDelEdit);
|
||
|
DDX_Text(pDX, IDC_COUNT_ALLOC_NOTAG_EDIT, m_strAllocNoTagEdit);
|
||
|
DDX_Text(pDX, IDC_COUNT_ALLOC_SUCC_EDIT, m_strAllocSucc);
|
||
|
DDX_Text(pDX, IDC_COUNT_ALLOCSUCC_SPECPOOL_EDIT, m_strAllocSuccSpecPool);
|
||
|
DDX_Text(pDX, IDC_COUNT_RAISEIRQL_EDIT, m_strRaiseIrqLevelEdit);
|
||
|
DDX_Text(pDX, IDC_COUNT_SYNCREX_EDIT, m_strSyncrExEdit);
|
||
|
DDX_Text(pDX, IDC_COUNT_TRIMS_EDIT, m_strTrimsEdit);
|
||
|
DDX_Radio(pDX, IDC_COUNT_MANUAL_RADIO, m_nUpdateIntervalIndex);
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CCountersPage, CPropertyPage)
|
||
|
//{{AFX_MSG_MAP(CCountersPage)
|
||
|
ON_BN_CLICKED(IDC_COUNT_REFRESH_BUTTON, OnCountRefreshButton)
|
||
|
ON_WM_TIMER()
|
||
|
ON_BN_CLICKED(IDC_COUNT_HSPEED_RADIO, OnCountHspeedRadio)
|
||
|
ON_BN_CLICKED(IDC_COUNT_LOW_RADIO, OnCountLowRadio)
|
||
|
ON_BN_CLICKED(IDC_COUNT_MANUAL_RADIO, OnCountManualRadio)
|
||
|
ON_BN_CLICKED(IDC_COUNT_NORM_RADIO, OnCountNormRadio)
|
||
|
ON_MESSAGE( WM_HELP, OnHelp )
|
||
|
ON_MESSAGE( WM_CONTEXTMENU, OnContextMenu )
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////
|
||
|
void CCountersPage::OnRefreshTimerChanged()
|
||
|
{
|
||
|
UINT uTimerElapse = 0;
|
||
|
|
||
|
// kill the pending timer
|
||
|
if( m_uTimerHandler != 0 )
|
||
|
{
|
||
|
VERIFY( KillTimer( REFRESH_TIMER_ID ) );
|
||
|
}
|
||
|
|
||
|
// sanity check
|
||
|
if( m_nUpdateIntervalIndex < 0 ||
|
||
|
m_nUpdateIntervalIndex >= REFRESH_SPEED_VARS )
|
||
|
{
|
||
|
m_nUpdateIntervalIndex = 0;
|
||
|
CheckRadioButton( IDC_COUNT_MANUAL_RADIO, IDC_COUNT_LOW_RADIO,
|
||
|
IDC_COUNT_MANUAL_RADIO );
|
||
|
}
|
||
|
|
||
|
// new timer interval
|
||
|
uTimerElapse = uTimerIntervals[ m_nUpdateIntervalIndex ];
|
||
|
if( uTimerElapse > 0 )
|
||
|
{
|
||
|
VERIFY( m_uTimerHandler = SetTimer( REFRESH_TIMER_ID,
|
||
|
uTimerElapse, NULL ) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////
|
||
|
// CCountersPage message handlers
|
||
|
BOOL CCountersPage::OnInitDialog()
|
||
|
{
|
||
|
CPropertyPage::OnInitDialog();
|
||
|
|
||
|
OnRefreshTimerChanged();
|
||
|
|
||
|
return TRUE; // return TRUE unless you set the focus to a control
|
||
|
// EXCEPTION: OCX Property Pages should return FALSE
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////
|
||
|
void CCountersPage::OnCountRefreshButton()
|
||
|
{
|
||
|
UpdateData( FALSE );
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////
|
||
|
void CCountersPage::OnTimer(UINT nIDEvent)
|
||
|
{
|
||
|
if( nIDEvent == REFRESH_TIMER_ID )
|
||
|
{
|
||
|
CDrvChkSheet *pParentSheet = (CDrvChkSheet *)GetParent();
|
||
|
if( pParentSheet != NULL )
|
||
|
{
|
||
|
ASSERT_VALID( pParentSheet );
|
||
|
if( pParentSheet->GetActivePage() == this )
|
||
|
{
|
||
|
// refresh the displayed data
|
||
|
OnCountRefreshButton();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CPropertyPage::OnTimer(nIDEvent);
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////
|
||
|
BOOL CCountersPage::OnQueryCancel()
|
||
|
{
|
||
|
// give parent PropertySheet a chance to refuse the Cancel if needed
|
||
|
|
||
|
CDrvChkSheet *pParentSheet = (CDrvChkSheet *)GetParent();
|
||
|
if( pParentSheet != NULL )
|
||
|
{
|
||
|
ASSERT_VALID( pParentSheet );
|
||
|
if( ! pParentSheet->OnQueryCancel() )
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return CPropertyPage::OnQueryCancel();
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////
|
||
|
BOOL CCountersPage::OnApply()
|
||
|
{
|
||
|
// refuse to apply
|
||
|
// (we don't use the standard PropertSheet buttons; Apply, OK)
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////
|
||
|
void CCountersPage::OnCountManualRadio()
|
||
|
{
|
||
|
// switch to manual refresh
|
||
|
m_nUpdateIntervalIndex = 0;
|
||
|
OnRefreshTimerChanged();
|
||
|
}
|
||
|
|
||
|
void CCountersPage::OnCountHspeedRadio()
|
||
|
{
|
||
|
// switch to high speed refresh
|
||
|
m_nUpdateIntervalIndex = 1;
|
||
|
OnRefreshTimerChanged();
|
||
|
}
|
||
|
|
||
|
void CCountersPage::OnCountNormRadio()
|
||
|
{
|
||
|
// switch to normal speed refresh
|
||
|
m_nUpdateIntervalIndex = 2;
|
||
|
OnRefreshTimerChanged();
|
||
|
}
|
||
|
|
||
|
void CCountersPage::OnCountLowRadio()
|
||
|
{
|
||
|
// switch to low speed refresh
|
||
|
m_nUpdateIntervalIndex = 3;
|
||
|
OnRefreshTimerChanged();
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
LONG CCountersPage::OnHelp( WPARAM wParam, LPARAM lParam )
|
||
|
{
|
||
|
LONG lResult = 0;
|
||
|
LPHELPINFO lpHelpInfo = (LPHELPINFO)lParam;
|
||
|
|
||
|
::WinHelp(
|
||
|
(HWND) lpHelpInfo->hItemHandle,
|
||
|
VERIFIER_HELP_FILE,
|
||
|
HELP_WM_HELP,
|
||
|
(DWORD_PTR) MyHelpIds );
|
||
|
|
||
|
return lResult;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
LONG CCountersPage::OnContextMenu( WPARAM wParam, LPARAM lParam )
|
||
|
{
|
||
|
LONG lResult = 0;
|
||
|
|
||
|
::WinHelp(
|
||
|
(HWND) wParam,
|
||
|
VERIFIER_HELP_FILE,
|
||
|
HELP_CONTEXTMENU,
|
||
|
(DWORD_PTR) MyHelpIds );
|
||
|
|
||
|
return lResult;
|
||
|
}
|