620 lines
17 KiB
C++
620 lines
17 KiB
C++
// 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;
|
|
}
|