958 lines
23 KiB
C++
958 lines
23 KiB
C++
|
//
|
||
|
// Driver Verifier UI
|
||
|
// Copyright (c) Microsoft Corporation, 1999
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
// module: DCntPage.cpp
|
||
|
// author: DMihai
|
||
|
// created: 11/1/00
|
||
|
//
|
||
|
// Description:
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "verifier.h"
|
||
|
|
||
|
#include "DCntPage.h"
|
||
|
#include "VrfUtil.h"
|
||
|
#include "VGlobal.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// Timer ID
|
||
|
//
|
||
|
|
||
|
#define REFRESH_TIMER_ID 0x1234
|
||
|
|
||
|
//
|
||
|
// Help IDs
|
||
|
//
|
||
|
|
||
|
static DWORD MyHelpIds[] =
|
||
|
{
|
||
|
IDC_PERDRVC_DRIVER_COMBO, IDH_DV_Counters_DriverList,
|
||
|
IDC_PERDRVC_LIST, IDH_DV_DriverCounters,
|
||
|
0, 0
|
||
|
};
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CDriverCountersPage property page
|
||
|
|
||
|
IMPLEMENT_DYNCREATE(CDriverCountersPage, CVerifierPropertyPage)
|
||
|
|
||
|
CDriverCountersPage::CDriverCountersPage() : CVerifierPropertyPage(CDriverCountersPage::IDD)
|
||
|
{
|
||
|
//{{AFX_DATA_INIT(CDriverCountersPage)
|
||
|
//}}AFX_DATA_INIT
|
||
|
|
||
|
m_nSortColumnIndex = 0;
|
||
|
m_bAscendSortName = FALSE;
|
||
|
m_bAscendSortValue = FALSE;
|
||
|
|
||
|
m_uTimerHandler = 0;
|
||
|
|
||
|
m_pParentSheet = NULL;
|
||
|
}
|
||
|
|
||
|
CDriverCountersPage::~CDriverCountersPage()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void CDriverCountersPage::DoDataExchange(CDataExchange* pDX)
|
||
|
{
|
||
|
if( ! pDX->m_bSaveAndValidate )
|
||
|
{
|
||
|
//
|
||
|
// Query the kernel
|
||
|
//
|
||
|
|
||
|
VrfGetRuntimeVerifierData( &m_RuntimeVerifierData );
|
||
|
}
|
||
|
|
||
|
CVerifierPropertyPage::DoDataExchange(pDX);
|
||
|
//{{AFX_DATA_MAP(CDriverCountersPage)
|
||
|
DDX_Control(pDX, IDC_PERDRVC_DRIVER_COMBO, m_DriversCombo);
|
||
|
DDX_Control(pDX, IDC_PERDRVC_NEXT_DESCR_STATIC, m_NextDescription);
|
||
|
DDX_Control(pDX, IDC_PERDRVC_LIST, m_CountersList);
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CDriverCountersPage, CVerifierPropertyPage)
|
||
|
//{{AFX_MSG_MAP(CDriverCountersPage)
|
||
|
ON_WM_TIMER()
|
||
|
ON_CBN_SELENDOK(IDC_PERDRVC_DRIVER_COMBO, OnSelendokDriverCombo)
|
||
|
ON_NOTIFY(LVN_COLUMNCLICK, IDC_PERDRVC_LIST, OnColumnclickPerdrvcList)
|
||
|
ON_WM_CONTEXTMENU()
|
||
|
ON_MESSAGE( WM_HELP, OnHelp )
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
|
||
|
VOID CDriverCountersPage::SetupListHeader()
|
||
|
{
|
||
|
LVCOLUMN lvColumn;
|
||
|
CRect rectWnd;
|
||
|
CString strCounter, strValue;
|
||
|
|
||
|
VERIFY( strCounter.LoadString( IDS_COUNTER ) );
|
||
|
VERIFY( strValue.LoadString( IDS_VALUE ) );
|
||
|
|
||
|
//
|
||
|
// List's regtangle
|
||
|
//
|
||
|
|
||
|
m_CountersList.GetClientRect( &rectWnd );
|
||
|
|
||
|
//
|
||
|
// Column 0 - counter
|
||
|
//
|
||
|
|
||
|
ZeroMemory( &lvColumn, sizeof( lvColumn ) );
|
||
|
lvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
|
||
|
lvColumn.fmt = LVCFMT_LEFT;
|
||
|
|
||
|
lvColumn.iSubItem = 0;
|
||
|
lvColumn.pszText = strCounter.GetBuffer( strCounter.GetLength() + 1 );
|
||
|
lvColumn.cx = (int)( rectWnd.Width() * 0.50 );
|
||
|
VERIFY( m_CountersList.InsertColumn( 0, &lvColumn ) != -1 );
|
||
|
strCounter.ReleaseBuffer();
|
||
|
|
||
|
//
|
||
|
// Column 1
|
||
|
//
|
||
|
|
||
|
lvColumn.iSubItem = 1;
|
||
|
lvColumn.pszText = strValue.GetBuffer( strValue.GetLength() + 1 );
|
||
|
lvColumn.cx = (int)( rectWnd.Width() * 0.47 );
|
||
|
VERIFY( m_CountersList.InsertColumn( 1, &lvColumn ) != -1 );
|
||
|
strValue.ReleaseBuffer();
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
VOID CDriverCountersPage::FillTheList()
|
||
|
{
|
||
|
CRuntimeDriverData *pRuntimeDriverData;
|
||
|
|
||
|
pRuntimeDriverData = GetCurrentDrvRuntimeData();
|
||
|
|
||
|
AddAllListItems( pRuntimeDriverData );
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
VOID CDriverCountersPage::AddAllListItems( CRuntimeDriverData *pRuntimeDriverData )
|
||
|
{
|
||
|
if( NULL != pRuntimeDriverData )
|
||
|
{
|
||
|
ASSERT_VALID( pRuntimeDriverData );
|
||
|
|
||
|
//
|
||
|
// N.B.
|
||
|
//
|
||
|
// If you change this order then you need to change GetCounterValue as well
|
||
|
//
|
||
|
|
||
|
AddCounterInList( 0, IDS_CURRENTPAGEDPOOLALLOCATIONS_LIST, pRuntimeDriverData->CurrentPagedPoolAllocations );
|
||
|
AddCounterInList( 1, IDS_PEAKPAGEDPOOLALLOCATIONS_LIST, pRuntimeDriverData->PeakPagedPoolAllocations );
|
||
|
AddCounterInList( 2, IDS_PAGEDPOOLUSAGEINBYTES_LIST, pRuntimeDriverData->PagedPoolUsageInBytes );
|
||
|
AddCounterInList( 3, IDS_PEAKPAGEDPOOLUSAGEINBYTES_LIST, pRuntimeDriverData->PeakPagedPoolUsageInBytes );
|
||
|
|
||
|
AddCounterInList( 4, IDS_CURRENTNONPAGEDPOOLALLOCATIONS_LIST, pRuntimeDriverData->CurrentNonPagedPoolAllocations );
|
||
|
AddCounterInList( 5, IDS_PEAKNONPAGEDPOOLALLOCATIONS_LIST, pRuntimeDriverData->PeakNonPagedPoolAllocations );
|
||
|
AddCounterInList( 6, IDS_NONPAGEDPOOLUSAGEINBYTES_LIST, pRuntimeDriverData->NonPagedPoolUsageInBytes );
|
||
|
AddCounterInList( 7, IDS_PEAKNONPAGEDPOOLUSAGEINBYTES_LIST, pRuntimeDriverData->PeakNonPagedPoolUsageInBytes );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// N.B.
|
||
|
//
|
||
|
// If you change this order then you need to change GetCounterValue as well
|
||
|
//
|
||
|
|
||
|
AddCounterInList( 0, IDS_CURRENTPAGEDPOOLALLOCATIONS_LIST );
|
||
|
AddCounterInList( 1, IDS_PEAKPAGEDPOOLALLOCATIONS_LIST );
|
||
|
AddCounterInList( 2, IDS_PAGEDPOOLUSAGEINBYTES_LIST );
|
||
|
AddCounterInList( 3, IDS_PEAKPAGEDPOOLUSAGEINBYTES_LIST );
|
||
|
|
||
|
AddCounterInList( 4, IDS_CURRENTNONPAGEDPOOLALLOCATIONS_LIST );
|
||
|
AddCounterInList( 5, IDS_PEAKNONPAGEDPOOLALLOCATIONS_LIST );
|
||
|
AddCounterInList( 6, IDS_NONPAGEDPOOLUSAGEINBYTES_LIST );
|
||
|
AddCounterInList( 7, IDS_PEAKNONPAGEDPOOLUSAGEINBYTES_LIST );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
VOID CDriverCountersPage::RefreshTheList()
|
||
|
{
|
||
|
INT nListItems;
|
||
|
INT nCrtListItem;
|
||
|
INT_PTR nCrtCounterIndex;
|
||
|
SIZE_T sizeValue;
|
||
|
CRuntimeDriverData *pRuntimeDriverData;
|
||
|
|
||
|
pRuntimeDriverData = GetCurrentDrvRuntimeData();
|
||
|
|
||
|
nListItems = m_CountersList.GetItemCount();
|
||
|
|
||
|
if( NULL != pRuntimeDriverData )
|
||
|
{
|
||
|
for( nCrtListItem = 0; nCrtListItem < nListItems; nCrtListItem += 1 )
|
||
|
{
|
||
|
nCrtCounterIndex = m_CountersList.GetItemData( nCrtListItem );
|
||
|
|
||
|
sizeValue = GetCounterValue( nCrtCounterIndex, pRuntimeDriverData );
|
||
|
|
||
|
UpdateCounterValueInList( nCrtListItem, sizeValue );
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// N.B.
|
||
|
//
|
||
|
// If you change this order then you need to
|
||
|
// change AddAllListItems as well
|
||
|
//
|
||
|
|
||
|
for( nCrtListItem = 0; nCrtListItem < nListItems; nCrtListItem += 1 )
|
||
|
{
|
||
|
UpdateCounterValueInList( nCrtListItem, g_szVoidText );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
SortTheList();
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
INT CDriverCountersPage::AddCounterInList( INT nItemData,
|
||
|
ULONG uIdResourceString )
|
||
|
{
|
||
|
INT nActualIndex;
|
||
|
LVITEM lvItem;
|
||
|
CString strName;
|
||
|
|
||
|
nActualIndex = -1;
|
||
|
|
||
|
VERIFY( strName.LoadString( uIdResourceString ) );
|
||
|
|
||
|
ZeroMemory( &lvItem, sizeof( lvItem ) );
|
||
|
|
||
|
//
|
||
|
// LVITEM's member pszText is not a const pointer
|
||
|
// so we need to GetBuffer here :-(
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// Sub-item 0 - counter's name
|
||
|
//
|
||
|
|
||
|
lvItem.pszText = strName.GetBuffer( strName.GetLength() + 1 );
|
||
|
|
||
|
if( NULL == lvItem.pszText )
|
||
|
{
|
||
|
goto Done;
|
||
|
}
|
||
|
|
||
|
lvItem.mask = LVIF_TEXT | LVIF_PARAM;
|
||
|
lvItem.lParam = nItemData;
|
||
|
lvItem.iItem = m_CountersList.GetItemCount();
|
||
|
|
||
|
nActualIndex = m_CountersList.InsertItem( &lvItem );
|
||
|
|
||
|
if( nActualIndex < 0 )
|
||
|
{
|
||
|
//
|
||
|
// Could not add an item in the list - give up
|
||
|
//
|
||
|
|
||
|
goto Done;
|
||
|
}
|
||
|
|
||
|
Done:
|
||
|
//
|
||
|
// All done
|
||
|
//
|
||
|
|
||
|
return nActualIndex;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
VOID CDriverCountersPage::AddCounterInList( INT nItemData,
|
||
|
ULONG uIdResourceString,
|
||
|
SIZE_T sizeValue )
|
||
|
{
|
||
|
INT nActualIndex;
|
||
|
|
||
|
nActualIndex = AddCounterInList( nItemData, uIdResourceString );
|
||
|
|
||
|
if( nActualIndex < 0 )
|
||
|
{
|
||
|
//
|
||
|
// Could not add an item in the list - give up
|
||
|
//
|
||
|
|
||
|
goto Done;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Sub-item 1 - counter's value
|
||
|
//
|
||
|
|
||
|
UpdateCounterValueInList( nActualIndex,
|
||
|
sizeValue );
|
||
|
|
||
|
Done:
|
||
|
//
|
||
|
// All done
|
||
|
//
|
||
|
|
||
|
NOTHING;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
SIZE_T CDriverCountersPage::GetCounterValue( INT_PTR nCounterIndex, CRuntimeDriverData *pRuntimeDriverData /*= NULL*/ )
|
||
|
{
|
||
|
SIZE_T sizeValue;
|
||
|
|
||
|
if( NULL == pRuntimeDriverData )
|
||
|
{
|
||
|
pRuntimeDriverData = GetCurrentDrvRuntimeData();
|
||
|
}
|
||
|
|
||
|
if( NULL == pRuntimeDriverData )
|
||
|
{
|
||
|
//
|
||
|
// No driver is curently selected in the combo
|
||
|
//
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// N.B.
|
||
|
//
|
||
|
// If you change this switch statement you need to change AddAllListItems as well
|
||
|
//
|
||
|
|
||
|
switch( nCounterIndex )
|
||
|
{
|
||
|
case 0:
|
||
|
sizeValue = pRuntimeDriverData->CurrentPagedPoolAllocations;
|
||
|
break;
|
||
|
|
||
|
case 1:
|
||
|
sizeValue = pRuntimeDriverData->PeakPagedPoolAllocations;
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
sizeValue = pRuntimeDriverData->PagedPoolUsageInBytes;
|
||
|
break;
|
||
|
|
||
|
case 3:
|
||
|
sizeValue = pRuntimeDriverData->PeakPagedPoolUsageInBytes;
|
||
|
break;
|
||
|
|
||
|
case 4:
|
||
|
sizeValue = pRuntimeDriverData->CurrentNonPagedPoolAllocations;
|
||
|
break;
|
||
|
|
||
|
case 5:
|
||
|
sizeValue = pRuntimeDriverData->PeakNonPagedPoolAllocations;
|
||
|
break;
|
||
|
|
||
|
case 6:
|
||
|
sizeValue = pRuntimeDriverData->NonPagedPoolUsageInBytes;
|
||
|
break;
|
||
|
|
||
|
case 7:
|
||
|
sizeValue = pRuntimeDriverData->PeakNonPagedPoolUsageInBytes;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
//
|
||
|
// Oops, how did we get here ?!?
|
||
|
//
|
||
|
|
||
|
ASSERT( FALSE );
|
||
|
|
||
|
sizeValue = 0;
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return sizeValue;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
BOOL CDriverCountersPage::GetCounterName( LPARAM lItemData,
|
||
|
TCHAR *szCounterName,
|
||
|
ULONG uCounterNameBufferLen )
|
||
|
{
|
||
|
INT nItemIndex;
|
||
|
BOOL bResult;
|
||
|
LVFINDINFO FindInfo;
|
||
|
LVITEM lvItem;
|
||
|
|
||
|
bResult = FALSE;
|
||
|
|
||
|
ZeroMemory( &FindInfo, sizeof( FindInfo ) );
|
||
|
FindInfo.flags = LVFI_PARAM;
|
||
|
FindInfo.lParam = lItemData;
|
||
|
|
||
|
nItemIndex = m_CountersList.FindItem( &FindInfo );
|
||
|
|
||
|
if( nItemIndex < 0 || nItemIndex > 7 )
|
||
|
{
|
||
|
ASSERT( FALSE );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// Found our item - get the name
|
||
|
//
|
||
|
|
||
|
ZeroMemory( &lvItem, sizeof( lvItem ) );
|
||
|
|
||
|
lvItem.mask = LVIF_TEXT;
|
||
|
lvItem.iItem = nItemIndex;
|
||
|
lvItem.iSubItem = 0;
|
||
|
lvItem.pszText = szCounterName;
|
||
|
lvItem.cchTextMax = uCounterNameBufferLen;
|
||
|
|
||
|
bResult = m_CountersList.GetItem( &lvItem );
|
||
|
|
||
|
if( bResult == FALSE )
|
||
|
{
|
||
|
//
|
||
|
// Could not get the current item's attributes?!?
|
||
|
//
|
||
|
|
||
|
ASSERT( FALSE );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return bResult;
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
VOID CDriverCountersPage::UpdateCounterValueInList( INT nItemIndex,
|
||
|
LPTSTR szValue )
|
||
|
{
|
||
|
LVITEM lvItem;
|
||
|
|
||
|
//
|
||
|
// Update the list item
|
||
|
//
|
||
|
|
||
|
ZeroMemory( &lvItem, sizeof( lvItem ) );
|
||
|
lvItem.mask = LVIF_TEXT;
|
||
|
lvItem.iItem = nItemIndex;
|
||
|
lvItem.iSubItem = 1;
|
||
|
lvItem.pszText = szValue;
|
||
|
VERIFY( m_CountersList.SetItem( &lvItem ) );
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
VOID CDriverCountersPage::UpdateCounterValueInList( INT nItemIndex,
|
||
|
SIZE_T sizeValue )
|
||
|
{
|
||
|
TCHAR szValue[ 32 ];
|
||
|
|
||
|
#ifndef _WIN64
|
||
|
|
||
|
//
|
||
|
// 32 bit SIZE_T
|
||
|
//
|
||
|
|
||
|
_sntprintf( szValue,
|
||
|
ARRAY_LENGTH( szValue ),
|
||
|
_T( "%u" ),
|
||
|
sizeValue );
|
||
|
|
||
|
#else
|
||
|
|
||
|
//
|
||
|
// 64 bit SIZE_T
|
||
|
//
|
||
|
|
||
|
_sntprintf( szValue,
|
||
|
ARRAY_LENGTH( szValue ),
|
||
|
_T( "%I64u" ),
|
||
|
sizeValue );
|
||
|
|
||
|
#endif
|
||
|
|
||
|
szValue[ ARRAY_LENGTH( szValue ) - 1 ] = 0;
|
||
|
|
||
|
UpdateCounterValueInList( nItemIndex,
|
||
|
szValue );
|
||
|
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
VOID CDriverCountersPage::RefreshCombo()
|
||
|
{
|
||
|
BOOL *pbAlreadyInCombo;
|
||
|
CRuntimeDriverData *pRuntimeDriverData;
|
||
|
INT_PTR nDrivers;
|
||
|
INT_PTR nCrtDriver;
|
||
|
INT nCrtSelectedItem;
|
||
|
INT nCrtItemIndex;
|
||
|
INT nComboItemCount;
|
||
|
INT nActualIndex;
|
||
|
CString strCurrentDriverName;
|
||
|
CString strDriverName;
|
||
|
|
||
|
nDrivers = m_RuntimeVerifierData.m_RuntimeDriverDataArray.GetSize();
|
||
|
|
||
|
if( 0 >= nDrivers )
|
||
|
{
|
||
|
//
|
||
|
// No drivers are currently verified - delete the combo-box content
|
||
|
//
|
||
|
|
||
|
m_DriversCombo.ResetContent();
|
||
|
m_DriversCombo.SetCurSel( CB_ERR );
|
||
|
m_DriversCombo.EnableWindow( FALSE );
|
||
|
|
||
|
OnSelendokDriverCombo();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
nCrtSelectedItem = 0;
|
||
|
nComboItemCount = m_DriversCombo.GetCount();
|
||
|
|
||
|
//
|
||
|
// Note the currently selected driver name
|
||
|
//
|
||
|
|
||
|
GetCurrentSelDriverName( strCurrentDriverName );
|
||
|
|
||
|
//
|
||
|
// Allocate an array of BOOL values, one for each driver in
|
||
|
// our runtime data array
|
||
|
//
|
||
|
|
||
|
pbAlreadyInCombo = new BOOL[ nDrivers ];
|
||
|
|
||
|
if( NULL == pbAlreadyInCombo )
|
||
|
{
|
||
|
goto Done;
|
||
|
}
|
||
|
|
||
|
for( nCrtDriver = 0; nCrtDriver < nDrivers; nCrtDriver++ )
|
||
|
{
|
||
|
pbAlreadyInCombo[ nCrtDriver ] = FALSE;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Parse all the items currently in the combo-box
|
||
|
//
|
||
|
|
||
|
for( nCrtItemIndex = 0; nCrtItemIndex < nComboItemCount; nCrtItemIndex++ )
|
||
|
{
|
||
|
m_DriversCombo.GetLBText( nCrtItemIndex, strDriverName );
|
||
|
|
||
|
//
|
||
|
// Parse all the currently verified drivers
|
||
|
//
|
||
|
|
||
|
for( nCrtDriver = 0; nCrtDriver < nDrivers; nCrtDriver++ )
|
||
|
{
|
||
|
pRuntimeDriverData = m_RuntimeVerifierData.m_RuntimeDriverDataArray.GetAt( nCrtDriver );
|
||
|
|
||
|
ASSERT_VALID( pRuntimeDriverData );
|
||
|
|
||
|
if( strDriverName.CompareNoCase( pRuntimeDriverData->m_strName ) == 0 )
|
||
|
{
|
||
|
pbAlreadyInCombo[ nCrtDriver ] = TRUE;
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if( nCrtDriver >= nDrivers )
|
||
|
{
|
||
|
//
|
||
|
// We need to delete the current combo item because
|
||
|
// the corresponfing driver is no longer verified
|
||
|
//
|
||
|
|
||
|
m_DriversCombo.DeleteString( nCrtItemIndex );
|
||
|
|
||
|
nCrtItemIndex--;
|
||
|
nComboItemCount--;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Add the new items in the combo
|
||
|
//
|
||
|
|
||
|
for( nCrtDriver = 0; nCrtDriver < nDrivers; nCrtDriver++ )
|
||
|
{
|
||
|
if( FALSE == pbAlreadyInCombo[ nCrtDriver ] )
|
||
|
{
|
||
|
pRuntimeDriverData = m_RuntimeVerifierData.m_RuntimeDriverDataArray.GetAt( nCrtDriver );
|
||
|
|
||
|
ASSERT_VALID( pRuntimeDriverData );
|
||
|
|
||
|
nActualIndex = m_DriversCombo.AddString( pRuntimeDriverData->m_strName );
|
||
|
|
||
|
if( nActualIndex != CB_ERR )
|
||
|
{
|
||
|
m_DriversCombo.SetItemData( nActualIndex, nCrtDriver );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
delete [] pbAlreadyInCombo;
|
||
|
|
||
|
//
|
||
|
// Restore the old current selection in the combo
|
||
|
//
|
||
|
|
||
|
nComboItemCount = m_DriversCombo.GetCount();
|
||
|
|
||
|
for( nCrtItemIndex = 0; nCrtItemIndex < nComboItemCount; nCrtItemIndex++ )
|
||
|
{
|
||
|
m_DriversCombo.GetLBText( nCrtItemIndex, strDriverName );
|
||
|
|
||
|
if( strDriverName.CompareNoCase( strCurrentDriverName ) == 0 )
|
||
|
{
|
||
|
nCrtSelectedItem = nCrtItemIndex;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
m_DriversCombo.SetCurSel( nCrtSelectedItem );
|
||
|
OnSelendokDriverCombo();
|
||
|
}
|
||
|
|
||
|
Done:
|
||
|
|
||
|
NOTHING;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
VOID CDriverCountersPage::RefreshInfo()
|
||
|
{
|
||
|
if( UpdateData( FALSE ) )
|
||
|
{
|
||
|
//
|
||
|
// Refresh the combo content - this will also
|
||
|
// refresh the counters list
|
||
|
//
|
||
|
|
||
|
RefreshCombo();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
VOID CDriverCountersPage::GetCurrentSelDriverName( CString &strName )
|
||
|
{
|
||
|
INT nCrtSel;
|
||
|
|
||
|
nCrtSel = m_DriversCombo.GetCurSel();
|
||
|
|
||
|
if( CB_ERR != nCrtSel )
|
||
|
{
|
||
|
m_DriversCombo.GetLBText( nCrtSel, strName );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
strName.Empty();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
CRuntimeDriverData *CDriverCountersPage::GetCurrentDrvRuntimeData()
|
||
|
{
|
||
|
INT nCrtComboSelection;
|
||
|
INT_PTR nCrtDriverIndex;
|
||
|
CRuntimeDriverData *pRuntimeDriverData;
|
||
|
|
||
|
pRuntimeDriverData = NULL;
|
||
|
|
||
|
nCrtDriverIndex = -1;
|
||
|
|
||
|
nCrtComboSelection = m_DriversCombo.GetCurSel();
|
||
|
|
||
|
if( nCrtComboSelection != CB_ERR )
|
||
|
{
|
||
|
nCrtDriverIndex = m_DriversCombo.GetItemData( nCrtComboSelection );
|
||
|
|
||
|
if( nCrtDriverIndex >= 0 && nCrtDriverIndex < m_RuntimeVerifierData.m_RuntimeDriverDataArray.GetSize() )
|
||
|
{
|
||
|
pRuntimeDriverData = m_RuntimeVerifierData.m_RuntimeDriverDataArray.GetAt( nCrtDriverIndex );
|
||
|
|
||
|
ASSERT_VALID( pRuntimeDriverData );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return pRuntimeDriverData;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
VOID CDriverCountersPage::SortTheList()
|
||
|
{
|
||
|
if( 0 != m_nSortColumnIndex )
|
||
|
{
|
||
|
//
|
||
|
// Sort by counter value - this is probably not very useful
|
||
|
// but we are providing it to be consistent with all
|
||
|
// the lists being sortable by any column
|
||
|
//
|
||
|
|
||
|
m_CountersList.SortItems( CounterValueCmpFunc, (LPARAM)this );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// Sort by driver name
|
||
|
//
|
||
|
|
||
|
m_CountersList.SortItems( CounterNameCmpFunc, (LPARAM)this );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
int CALLBACK CDriverCountersPage::CounterValueCmpFunc( LPARAM lParam1,
|
||
|
LPARAM lParam2,
|
||
|
LPARAM lParamSort)
|
||
|
{
|
||
|
SIZE_T size1;
|
||
|
SIZE_T size2;
|
||
|
int nCmpRez = 0;
|
||
|
|
||
|
CDriverCountersPage *pThis = (CDriverCountersPage *)lParamSort;
|
||
|
ASSERT_VALID( pThis );
|
||
|
|
||
|
size1 = pThis->GetCounterValue( (INT) lParam1 );
|
||
|
size2 = pThis->GetCounterValue( (INT) lParam2 );
|
||
|
|
||
|
if( size1 > size2 )
|
||
|
{
|
||
|
nCmpRez = 1;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if( size1 < size2 )
|
||
|
{
|
||
|
nCmpRez = -1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if( FALSE != pThis->m_bAscendSortValue )
|
||
|
{
|
||
|
nCmpRez *= -1;
|
||
|
}
|
||
|
|
||
|
return nCmpRez;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
int CALLBACK CDriverCountersPage::CounterNameCmpFunc( LPARAM lParam1,
|
||
|
LPARAM lParam2,
|
||
|
LPARAM lParamSort)
|
||
|
{
|
||
|
int nCmpRez = 0;
|
||
|
BOOL bSuccess;
|
||
|
TCHAR szCounterName1[ _MAX_PATH ];
|
||
|
TCHAR szCounterName2[ _MAX_PATH ];
|
||
|
|
||
|
CDriverCountersPage *pThis = (CDriverCountersPage *)lParamSort;
|
||
|
ASSERT_VALID( pThis );
|
||
|
|
||
|
//
|
||
|
// Get the first counter name
|
||
|
//
|
||
|
|
||
|
bSuccess = pThis->GetCounterName( lParam1,
|
||
|
szCounterName1,
|
||
|
ARRAY_LENGTH( szCounterName1 ) );
|
||
|
|
||
|
if( FALSE == bSuccess )
|
||
|
{
|
||
|
goto Done;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Get the second counter name
|
||
|
//
|
||
|
|
||
|
bSuccess = pThis->GetCounterName( lParam2,
|
||
|
szCounterName2,
|
||
|
ARRAY_LENGTH( szCounterName2 ) );
|
||
|
|
||
|
if( FALSE == bSuccess )
|
||
|
{
|
||
|
goto Done;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Compare the names
|
||
|
//
|
||
|
|
||
|
nCmpRez = _tcsicmp( szCounterName1, szCounterName2 );
|
||
|
|
||
|
if( FALSE != pThis->m_bAscendSortName )
|
||
|
{
|
||
|
nCmpRez *= -1;
|
||
|
}
|
||
|
|
||
|
Done:
|
||
|
|
||
|
return nCmpRez;
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
// CDriverCountersPage message handlers
|
||
|
|
||
|
BOOL CDriverCountersPage::OnInitDialog()
|
||
|
{
|
||
|
CPropertyPage::OnInitDialog();
|
||
|
|
||
|
//
|
||
|
// Setup the settings bits list
|
||
|
//
|
||
|
|
||
|
m_CountersList.SetExtendedStyle(
|
||
|
LVS_EX_FULLROWSELECT | m_CountersList.GetExtendedStyle() );
|
||
|
|
||
|
m_CountersList.SetBkColor( ::GetSysColor( COLOR_3DFACE ) );
|
||
|
m_CountersList.SetTextBkColor( ::GetSysColor( COLOR_3DFACE ) );
|
||
|
|
||
|
SetupListHeader();
|
||
|
FillTheList();
|
||
|
SortTheList();
|
||
|
|
||
|
RefreshCombo();
|
||
|
|
||
|
VrfSetWindowText( m_NextDescription, IDS_DCNT_PAGE_NEXT_DESCR );
|
||
|
|
||
|
VERIFY( m_uTimerHandler = SetTimer( REFRESH_TIMER_ID,
|
||
|
5000,
|
||
|
NULL ) );
|
||
|
|
||
|
return TRUE; // return TRUE unless you set the focus to a control
|
||
|
// EXCEPTION: OCX Property Pages should return FALSE
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
VOID CDriverCountersPage::OnTimer(UINT nIDEvent)
|
||
|
{
|
||
|
if( nIDEvent == REFRESH_TIMER_ID )
|
||
|
{
|
||
|
ASSERT_VALID( m_pParentSheet );
|
||
|
|
||
|
if( m_pParentSheet->GetActivePage() == this )
|
||
|
{
|
||
|
//
|
||
|
// Refresh the displayed data
|
||
|
//
|
||
|
|
||
|
RefreshInfo();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CPropertyPage::OnTimer(nIDEvent);
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
BOOL CDriverCountersPage::OnSetActive()
|
||
|
{
|
||
|
ASSERT_VALID( m_pParentSheet );
|
||
|
|
||
|
m_pParentSheet->SetWizardButtons( PSWIZB_BACK |
|
||
|
PSWIZB_FINISH );
|
||
|
|
||
|
return CVerifierPropertyPage::OnSetActive();
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
void CDriverCountersPage::OnSelendokDriverCombo()
|
||
|
{
|
||
|
RefreshTheList();
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
void CDriverCountersPage::OnColumnclickPerdrvcList(NMHDR* pNMHDR, LRESULT* pResult)
|
||
|
{
|
||
|
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
|
||
|
|
||
|
if( 0 != pNMListView->iSubItem )
|
||
|
{
|
||
|
//
|
||
|
// Clicked on the counter value column
|
||
|
//
|
||
|
|
||
|
if( m_nSortColumnIndex == pNMListView->iSubItem )
|
||
|
{
|
||
|
//
|
||
|
// Change the current ascend/descend order for this column
|
||
|
//
|
||
|
|
||
|
m_bAscendSortValue = !m_bAscendSortValue;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// Clicked on the counter name column
|
||
|
//
|
||
|
|
||
|
if( m_nSortColumnIndex == pNMListView->iSubItem )
|
||
|
{
|
||
|
//
|
||
|
// Change the current ascend/descend order for this column
|
||
|
//
|
||
|
|
||
|
m_bAscendSortName = !m_bAscendSortName;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
m_nSortColumnIndex = pNMListView->iSubItem;
|
||
|
|
||
|
SortTheList();
|
||
|
|
||
|
*pResult = 0;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////
|
||
|
LONG CDriverCountersPage::OnHelp( WPARAM wParam, LPARAM lParam )
|
||
|
{
|
||
|
LONG lResult = 0;
|
||
|
LPHELPINFO lpHelpInfo = (LPHELPINFO)lParam;
|
||
|
|
||
|
::WinHelp(
|
||
|
(HWND) lpHelpInfo->hItemHandle,
|
||
|
g_szVerifierHelpFile,
|
||
|
HELP_WM_HELP,
|
||
|
(DWORD_PTR) MyHelpIds );
|
||
|
|
||
|
return lResult;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
void CDriverCountersPage::OnContextMenu(CWnd* pWnd, CPoint point)
|
||
|
{
|
||
|
::WinHelp(
|
||
|
pWnd->m_hWnd,
|
||
|
g_szVerifierHelpFile,
|
||
|
HELP_CONTEXTMENU,
|
||
|
(DWORD_PTR) MyHelpIds );
|
||
|
}
|
||
|
|