windows-nt/Source/XPSP1/NT/sdktools/verifier/win2k/cntpage.cxx
2020-09-26 16:20:57 +08:00

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