|
|
// PCntPage.cpp : implementation file
//
#include "stdafx.h"
#include "drvvctrl.hxx"
#include "PCntPage.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 0x1243
// 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_POOLCNT_CRT_PPOOL_ALLOC_EDIT, IDH_DV_PoolTab_paged_allocations_current, IDC_POOLCNT_CRT_NPPOOL_ALLOC_EDIT, IDH_DV_PoolTab_nonpaged_allocations_current, IDC_POOLCNT_PEAK_PPOOL_ALLOC_EDIT, IDH_DV_PoolTab_paged_allocations_peak, IDC_POOLCNT_PEAK_NPPOOL_ALLOC_EDIT, IDH_DV_PoolTab_nonpaged_allocations_peak, IDC_POOLCNT_UNTRACK_ALLOC_EDIT, IDH_DV_PoolTab_globalcounters, IDC_POOLCNT_CRT_PPOOL_BYTES_EDIT, IDH_DV_PoolTab_paged_currentbytes, IDC_POOLCNT_CRT_NPPOOL_BYTES_EDIT, IDH_DV_PoolTab_nonpaged_currentbytes, IDC_POOLCNT_PEAK_PPOOL_BYTES_EDIT, IDH_DV_PoolTab_paged_peakbytes, IDC_POOLCNT_PEAK_NPPOOL_BYTES_EDIT, IDH_DV_PoolTab_nonpaged_peakbytes, IDC_POOLCNT_DRVNAME_COMBO, IDH_DV_PoolTab_indivcounters,
IDC_POOLCNT_REFRESH_BUTTON, IDH_DV_common_refresh_nowbutton, IDC_POOLCNT_MANUAL_RADIO, IDH_DV_common_refresh_manual, IDC_POOLCNT_HSPEED_RADIO, IDH_DV_common_refresh_high, IDC_POOLCNT_NORM_RADIO, IDH_DV_common_refresh_normal, IDC_POOLCNT_LOW_RADIO, IDH_DV_common_refresh_low, 0, 0 };
/////////////////////////////////////////////////////////////////////
static void GetStringFromULONG( CString &strValue, ULONG_PTR uValue ) { LPTSTR lptstrValue = strValue.GetBuffer( 64 ); if( lptstrValue != NULL ) { _stprintf( lptstrValue, _T( "%lu" ), uValue ); strValue.ReleaseBuffer(); } else { ASSERT( FALSE ); strValue.Empty(); } }
/////////////////////////////////////////////////////////////////////////////
// CPoolCntPage property page
IMPLEMENT_DYNCREATE(CPoolCntPage, CPropertyPage)
CPoolCntPage::CPoolCntPage() : CPropertyPage(CPoolCntPage::IDD) { //{{AFX_DATA_INIT(CPoolCntPage)
m_nUpdateIntervalIndex = 2; m_strCrtNPAlloc = _T(""); m_strCrtNPBytes = _T(""); m_strCrtPPAlloc = _T(""); m_strCrtPPBytes = _T(""); m_strPeakNPPAlloc = _T(""); m_strPeakNPPBytes = _T(""); m_strPeakPPAlloc = _T(""); m_strPeakPPBytes = _T(""); m_strUnTrackedAlloc = _T(""); //}}AFX_DATA_INIT
m_uTimerHandler = 0; }
void CPoolCntPage::DoDataExchange(CDataExchange* pDX) { TCHAR szCrtDriverName [ _MAX_PATH ]; BOOL bComboEnabled;
CPropertyPage::DoDataExchange(pDX);
//
// subclass the combo-box
//
DDX_Control(pDX, IDC_POOLCNT_DRVNAME_COMBO, m_DrvNamesCombo);
//
// get the date from the kernel
//
bComboEnabled = TRUE;
if( ! pDX->m_bSaveAndValidate ) { //
// get the currently selected driver name
//
GetCurrentSelDriverName( szCrtDriverName, ARRAY_LENGTH( szCrtDriverName ) );
//
// query the kernel
//
if( KrnGetSystemVerifierState( &m_KrnVerifState ) && m_KrnVerifState.DriverCount > 0 ) { //
// UnTrackedPool - global counter
//
GetStringFromULONG( m_strUnTrackedAlloc, m_KrnVerifState.UnTrackedPool );
//
// update combo content
//
FillDriversNameCombo( szCrtDriverName ); } else { //
// UnTrackedPool - global counter
//
VERIFY( m_strUnTrackedAlloc.LoadString( IDS_ZERO ) );
//
// disable the drivers name list
//
bComboEnabled = FALSE; m_DrvNamesCombo.ResetContent();
//
// this is used by OnDriversNameSelChanged
//
m_KrnVerifState.DriverCount = 0; }
//
// update per driver counters
//
OnDriversNameSelChanged(); }
//{{AFX_DATA_MAP(CPoolCntPage)
DDX_Radio(pDX, IDC_POOLCNT_MANUAL_RADIO, m_nUpdateIntervalIndex); DDX_Text(pDX, IDC_POOLCNT_UNTRACK_ALLOC_EDIT, m_strUnTrackedAlloc); //}}AFX_DATA_MAP
if( ! pDX->m_bSaveAndValidate ) { m_DrvNamesCombo.EnableWindow( bComboEnabled ); } }
BEGIN_MESSAGE_MAP(CPoolCntPage, CPropertyPage) //{{AFX_MSG_MAP(CPoolCntPage)
ON_BN_CLICKED(IDC_POOLCNT_REFRESH_BUTTON, OnCountRefreshButton) ON_WM_TIMER() ON_BN_CLICKED(IDC_POOLCNT_HSPEED_RADIO, OnCountHspeedRadio) ON_BN_CLICKED(IDC_POOLCNT_LOW_RADIO, OnCountLowRadio) ON_BN_CLICKED(IDC_POOLCNT_MANUAL_RADIO, OnCountManualRadio) ON_BN_CLICKED(IDC_POOLCNT_NORM_RADIO, OnCountNormRadio) ON_CBN_SELENDOK(IDC_POOLCNT_DRVNAME_COMBO, OnDriversNameSelChanged) ON_MESSAGE( WM_HELP, OnHelp ) ON_MESSAGE( WM_CONTEXTMENU, OnContextMenu ) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPoolCntPage message handlers
/////////////////////////////////////////////////////////////////////
void CPoolCntPage::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_POOLCNT_MANUAL_RADIO, IDC_POOLCNT_LOW_RADIO, IDC_POOLCNT_MANUAL_RADIO ); }
// new timer interval
uTimerElapse = uTimerIntervals[ m_nUpdateIntervalIndex ]; if( uTimerElapse > 0 ) { VERIFY( m_uTimerHandler = SetTimer( REFRESH_TIMER_ID, uTimerElapse, NULL ) ); } }
/////////////////////////////////////////////////////////////////////
// CPoolCntPage message handlers
BOOL CPoolCntPage::OnInitDialog() { CPropertyPage::OnInitDialog();
OnRefreshTimerChanged();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
/////////////////////////////////////////////////////////////////////
void CPoolCntPage::OnCountRefreshButton() { UpdateData( FALSE ); }
/////////////////////////////////////////////////////////////////////
void CPoolCntPage::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 CPoolCntPage::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 CPoolCntPage::OnApply() { // refuse to apply
// (we don't use the standard PropertSheet buttons; Apply, OK)
return FALSE; }
/////////////////////////////////////////////////////////////////////
void CPoolCntPage::OnCountManualRadio() { // switch to manual refresh
m_nUpdateIntervalIndex = 0; OnRefreshTimerChanged(); }
void CPoolCntPage::OnCountHspeedRadio() { // switch to high speed refresh
m_nUpdateIntervalIndex = 1; OnRefreshTimerChanged(); }
void CPoolCntPage::OnCountNormRadio() { // switch to normal speed refresh
m_nUpdateIntervalIndex = 2; OnRefreshTimerChanged(); }
void CPoolCntPage::OnCountLowRadio() { // switch to low speed refresh
m_nUpdateIntervalIndex = 3; OnRefreshTimerChanged(); }
/////////////////////////////////////////////////////////////////////
void CPoolCntPage::OnDriversNameSelChanged() { int nCrtSelItem; int nIndexInArray; BOOL bAllCountersZero;
bAllCountersZero = TRUE;
nCrtSelItem = m_DrvNamesCombo.GetCurSel();
if( nCrtSelItem >= 0 && nCrtSelItem < (int)m_KrnVerifState.DriverCount ) { nIndexInArray = (int)m_DrvNamesCombo.GetItemData( nCrtSelItem );
if( nIndexInArray >= 0 && nIndexInArray < (int)m_KrnVerifState.DriverCount ) { bAllCountersZero = FALSE;
// CurrentPagedPoolAllocations
GetStringFromULONG( m_strCrtPPAlloc, m_KrnVerifState.DriverInfo[ nIndexInArray ].CurrentPagedPoolAllocations );
// CurrentNonPagedPoolAllocations
GetStringFromULONG( m_strCrtNPAlloc, m_KrnVerifState.DriverInfo[ nIndexInArray ].CurrentNonPagedPoolAllocations );
// PeakPagedPoolAllocations
GetStringFromULONG( m_strPeakPPAlloc, m_KrnVerifState.DriverInfo[ nIndexInArray ].PeakPagedPoolAllocations );
// PeakNonPagedPoolAllocations
GetStringFromULONG( m_strPeakNPPAlloc, m_KrnVerifState.DriverInfo[ nIndexInArray ].PeakNonPagedPoolAllocations );
// PagedPoolUsageInBytes
GetStringFromULONG( m_strCrtPPBytes, m_KrnVerifState.DriverInfo[ nIndexInArray ].PagedPoolUsageInBytes );
// NonPagedPoolUsageInBytes
GetStringFromULONG( m_strCrtNPBytes, m_KrnVerifState.DriverInfo[ nIndexInArray ].NonPagedPoolUsageInBytes );
// PeakPagedPoolUsageInBytes
GetStringFromULONG( m_strPeakPPBytes, m_KrnVerifState.DriverInfo[ nIndexInArray ].PeakPagedPoolUsageInBytes );
// PeakNonPagedPoolUsageInBytes
GetStringFromULONG( m_strPeakNPPBytes, m_KrnVerifState.DriverInfo[ nIndexInArray ].PeakNonPagedPoolUsageInBytes ); } else { ASSERT( FALSE ); } }
if( bAllCountersZero ) { // CurrentPagedPoolAllocations
VERIFY( m_strCrtPPAlloc.LoadString( IDS_ZERO ) );
// CurrentNonPagedPoolAllocations
VERIFY( m_strCrtNPAlloc.LoadString( IDS_ZERO ) );
// PeakPagedPoolAllocations
VERIFY( m_strPeakPPAlloc.LoadString( IDS_ZERO ) );
// PeakNonPagedPoolAllocations
VERIFY( m_strPeakNPPAlloc.LoadString( IDS_ZERO ) );
// PagedPoolUsageInBytes
VERIFY( m_strCrtPPBytes.LoadString( IDS_ZERO ) );
// NonPagedPoolUsageInBytes
VERIFY( m_strCrtNPBytes.LoadString( IDS_ZERO ) );
// PeakPagedPoolUsageInBytes
VERIFY( m_strPeakPPBytes.LoadString( IDS_ZERO ) );
// PeakNonPagedPoolUsageInBytes
VERIFY( m_strPeakNPPBytes.LoadString( IDS_ZERO ) ); }
//
// set the text in edit controls
//
SetDlgItemText( IDC_POOLCNT_CRT_NPPOOL_ALLOC_EDIT, m_strCrtNPAlloc); SetDlgItemText( IDC_POOLCNT_CRT_NPPOOL_BYTES_EDIT, m_strCrtNPBytes); SetDlgItemText( IDC_POOLCNT_CRT_PPOOL_ALLOC_EDIT, m_strCrtPPAlloc); SetDlgItemText( IDC_POOLCNT_CRT_PPOOL_BYTES_EDIT, m_strCrtPPBytes); SetDlgItemText( IDC_POOLCNT_PEAK_NPPOOL_ALLOC_EDIT, m_strPeakNPPAlloc); SetDlgItemText( IDC_POOLCNT_PEAK_NPPOOL_BYTES_EDIT, m_strPeakNPPBytes); SetDlgItemText( IDC_POOLCNT_PEAK_PPOOL_ALLOC_EDIT, m_strPeakPPAlloc); SetDlgItemText( IDC_POOLCNT_PEAK_PPOOL_BYTES_EDIT, m_strPeakPPBytes); }
/////////////////////////////////////////////////////////////////////
// operations
void CPoolCntPage::GetCurrentSelDriverName( TCHAR *szCrtDriverName, int nBufferLength ) { int nCrtSel; int nNameLength; int nDriverEntryIndex;
if( nBufferLength < 1 ) { ASSERT( FALSE ); return; }
szCrtDriverName[ 0 ] = (TCHAR)0;
nCrtSel = m_DrvNamesCombo.GetCurSel(); if( nCrtSel != CB_ERR && nCrtSel < (int)m_KrnVerifState.DriverCount ) { nDriverEntryIndex = (int)m_DrvNamesCombo.GetItemData( nCrtSel );
if( nDriverEntryIndex >= 0 && nDriverEntryIndex < (int)m_KrnVerifState.DriverCount ) { nNameLength = _tcslen( m_KrnVerifState.DriverInfo[ nDriverEntryIndex ].Name );
if( nNameLength < nBufferLength ) { _tcscpy( szCrtDriverName, m_KrnVerifState.DriverInfo[ nDriverEntryIndex ].Name ); } } else { ASSERT( FALSE ); } } }
/////////////////////////////////////////////////////////////////////
void CPoolCntPage::FillDriversNameCombo( TCHAR *strNameToSelect ) { BOOL *pbAlreadyInCombo; CString strDriverName; UINT uCrtVerifiedDriver; int nCrtItemIndex; int nCrtSelectedItem; int nComboItemCount; int nActualIndex;
nCrtSelectedItem = 0;
if( m_KrnVerifState.DriverCount > 0 ) { //
// allocate a logical value for each currently verified driver
// with initial value FALSE
//
pbAlreadyInCombo = new BOOL[ m_KrnVerifState.DriverCount ]; if( pbAlreadyInCombo == NULL ) { m_DrvNamesCombo.ResetContent(); return; }
for( uCrtVerifiedDriver = 0; uCrtVerifiedDriver < m_KrnVerifState.DriverCount; uCrtVerifiedDriver++ ) { pbAlreadyInCombo[ uCrtVerifiedDriver ] = FALSE; }
//
// parse each name currently in combo
//
nComboItemCount = m_DrvNamesCombo.GetCount();
for( nCrtItemIndex = 0; nCrtItemIndex < nComboItemCount; nCrtItemIndex++ ) { m_DrvNamesCombo.GetLBText( nCrtItemIndex, strDriverName );
//
// parse the driver names in m_KrnVerifState and see if we have a match
//
for( uCrtVerifiedDriver = 0; uCrtVerifiedDriver < m_KrnVerifState.DriverCount; uCrtVerifiedDriver++ ) { if( _tcsicmp( (LPCTSTR)strDriverName, m_KrnVerifState.DriverInfo[ uCrtVerifiedDriver ].Name ) == 0 ) { //
// it's still verified
//
pbAlreadyInCombo[ uCrtVerifiedDriver ] = TRUE;
//
// update the index in m_KrnVerifState.DriverInfo array
//
m_DrvNamesCombo.SetItemData( nCrtItemIndex, uCrtVerifiedDriver ); break; } }
if( uCrtVerifiedDriver >= m_KrnVerifState.DriverCount ) { //
// this driver is no longer verified, remove it from the list
//
m_DrvNamesCombo.DeleteString( nCrtItemIndex );
nCrtItemIndex--; nComboItemCount--; } }
//
// add the new verified drivers
//
for( uCrtVerifiedDriver = 0; uCrtVerifiedDriver < m_KrnVerifState.DriverCount; uCrtVerifiedDriver++ ) { if( pbAlreadyInCombo[ uCrtVerifiedDriver ] == FALSE ) { nActualIndex = m_DrvNamesCombo.AddString( m_KrnVerifState.DriverInfo[ uCrtVerifiedDriver ].Name );
if( nActualIndex != CB_ERR ) { m_DrvNamesCombo.SetItemData( nActualIndex, uCrtVerifiedDriver ); } } }
ASSERT( m_DrvNamesCombo.GetCount() == m_KrnVerifState.DriverCount );
//
// current selection
//
nComboItemCount = m_DrvNamesCombo.GetCount();
for( nCrtItemIndex = 0; nCrtItemIndex < nComboItemCount; nCrtItemIndex++ ) { m_DrvNamesCombo.GetLBText( nCrtItemIndex, strDriverName );
if( _tcsicmp( (LPCTSTR)strDriverName, strNameToSelect ) == 0 ) { nCrtSelectedItem = nCrtItemIndex; break; } }
delete pbAlreadyInCombo; } else { m_DrvNamesCombo.ResetContent(); }
m_DrvNamesCombo.SetCurSel( nCrtSelectedItem ); }
/////////////////////////////////////////////////////////////
LONG CPoolCntPage::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 CPoolCntPage::OnContextMenu( WPARAM wParam, LPARAM lParam ) { LONG lResult = 0;
::WinHelp( (HWND) wParam, VERIFIER_HELP_FILE, HELP_CONTEXTMENU, (DWORD_PTR) MyHelpIds );
return lResult; }
|