|
|
//
// 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; }
|