windows-nt/Source/XPSP1/NT/sdktools/verifier/win2k/modspage.cxx

1416 lines
36 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//
// Driver Verifier UI
// Copyright (c) Microsoft Corporation, 1999
//
//
// module: ModSPage.cxx
// author: DMihai
// created: 01/04/98
//
// Description:
//
// Modify settings PropertyPage.
#include "stdafx.h"
#include "drvvctrl.hxx"
#include "ModSPage.hxx"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//
// if this is FALSE we will prompt the user when Exit is clicked
//
BOOL g_bSettingsSaved = FALSE;
//
// help IDs
//
static DWORD MyHelpIds[] =
{
IDC_DRIVERS_LIST, IDH_DV_SettingsTab_driver_details,
IDC_VERIFALL_RADIO, IDH_DV_SettingsTab_verifyall,
IDC_VERIFSEL_RADIO, IDH_DV_SettingsTab_verifyselec,
IDC_NORMAL_VERIF_CHECK, IDH_DV_SettingsTab_verifytype_sppool,
IDC_PAGEDC_VERIF_CHECK, IDH_DV_SettingsTab_verifytype_irql,
IDC_ALLOCF_VERIF_CHECK, IDH_DV_SettingsTab_verifytype_resource,
IDC_POOLT_VERIF_CHECK, IDH_DV_SettingsTab_verifytype_pooltrack,
IDC_IO_VERIF_CHECK, IDH_DV_SettingsTab_verifytype_io,
IDC_VERIFY_BUTTON, IDH_DV_SettingsTab_verifybut,
IDC_DONTVERIFY_BUTTON, IDH_DV_SettingsTab_noverifybut,
ID_APPLY_BUTTON, IDH_DV_SettingsTab_applybut,
IDC_ADDIT_DRVNAMES_EDIT, IDH_DV_SettingsTab_verifyaddfield,
ID_RESETALL_BUTTON, IDH_DV_SettingsTab_resetallbut,
ID_PREF_BUTTON, IDH_DV_SettingsTab_prefsetbut,
IDC_MODSETT_IO_SELDRIVERS_RADIO,IDH_DV_SettingsTab_verifytype_io_level1,
IDC_MODSETT_IO_SYSWIDE_RADIO, IDH_DV_SettingsTab_verifytype_io_level2,
0, 0
};
/////////////////////////////////////////
void __cdecl VrfError ( TCHAR *fmt, ...)
{
TCHAR strMessage[ 256 ];
va_list prms;
if( fmt == NULL )
return;
va_start (prms, fmt);
_vsntprintf ( strMessage, ARRAY_LENGTH( strMessage ), fmt, prms);
if( g_bCommandLineMode )
{
VrfPutTS( strMessage );
}
else
{
AfxMessageBox( strMessage, MB_OK | MB_ICONSTOP );
}
va_end (prms);
}
/////////////////////////////////////////
void
__cdecl
VrfErrorResourceFormat(
UINT uIdResourceFormat,
... )
{
TCHAR strMessage[ 256 ];
TCHAR strFormat[ 256 ];
va_list prms;
if( GetStringFromResources(
uIdResourceFormat,
strFormat,
ARRAY_LENGTH( strFormat ) ) )
{
va_start (prms, uIdResourceFormat);
_vsntprintf ( strMessage, ARRAY_LENGTH( strMessage ), strFormat, prms);
if( g_bCommandLineMode )
{
VrfPutTS( strMessage );
}
else
{
AfxMessageBox( strMessage, MB_OK | MB_ICONSTOP );
}
va_end (prms);
}
else
{
ASSERT( FALSE );
}
}
/////////////////////////////////////////////////////////////////////////////
// CModifSettPage property page
IMPLEMENT_DYNCREATE(CModifSettPage, CPropertyPage)
CModifSettPage::CModifSettPage() : CPropertyPage(CModifSettPage::IDD)
{
//{{AFX_DATA_INIT(CModifSettPage)
m_bAllocFCheck = FALSE;
m_bSpecialPoolCheck = FALSE;
m_bPagedCCheck = FALSE;
m_bPoolTCheck = FALSE;
m_bIoVerifierCheck = FALSE;
m_nVerifyAllRadio = -1;
m_strAdditDrivers = _T("");
//}}AFX_DATA_INIT
m_nIoVerTypeRadio = 0;
m_eListState = vrfControlEnabled;
m_eApplyButtonState = vrfControlDisabled;
m_bAscendDrvVerifSort = FALSE;
m_bAscendDrvNameSort = FALSE;
m_bAscendProviderSort = FALSE;
m_bAscendVersionSort = FALSE;
m_nLastColumnClicked = -1;
}
CModifSettPage::~CModifSettPage()
{
}
void CModifSettPage::DoDataExchange(CDataExchange* pDX)
{
// CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CModifSettPage)
DDX_Control(pDX, IDC_PAGEDC_VERIF_CHECK, m_PagedCCheck);
DDX_Control(pDX, IDC_NORMAL_VERIF_CHECK, m_SpecialPoolVerifCheck);
DDX_Control(pDX, IDC_ALLOCF_VERIF_CHECK, m_AllocFCheck);
DDX_Control(pDX, IDC_POOLT_VERIF_CHECK, m_PoolTCheck);
DDX_Control(pDX, IDC_IO_VERIF_CHECK, m_IOVerifCheck);
DDX_Control(pDX, IDC_ADDIT_DRVNAMES_EDIT, m_AdditDrvEdit);
DDX_Control(pDX, ID_RESETALL_BUTTON, m_ResetAllButton);
DDX_Control(pDX, IDC_VERIFY_BUTTON, m_VerifyButton);
DDX_Control(pDX, IDC_DRIVERS_LIST, m_DriversList);
DDX_Control(pDX, IDC_DONTVERIFY_BUTTON, m_DontVerifButton);
DDX_Control(pDX, ID_APPLY_BUTTON, m_ApplyButton);
DDX_Check(pDX, IDC_ALLOCF_VERIF_CHECK, m_bAllocFCheck);
DDX_Check(pDX, IDC_NORMAL_VERIF_CHECK, m_bSpecialPoolCheck);
DDX_Check(pDX, IDC_PAGEDC_VERIF_CHECK, m_bPagedCCheck);
DDX_Check(pDX, IDC_POOLT_VERIF_CHECK, m_bPoolTCheck);
DDX_Check(pDX, IDC_IO_VERIF_CHECK, m_bIoVerifierCheck);
DDX_Radio(pDX, IDC_VERIFALL_RADIO, m_nVerifyAllRadio);
DDX_Radio(pDX, IDC_MODSETT_IO_SELDRIVERS_RADIO, m_nIoVerTypeRadio);
//}}AFX_DATA_MAP
DDX_Text(pDX, IDC_ADDIT_DRVNAMES_EDIT, m_strAdditDrivers);
DDV_MaxChars(pDX, m_strAdditDrivers, MI_SUSPECT_DRIVER_BUFFER_LENGTH - 1 );
if( pDX->m_bSaveAndValidate )
{
m_VerifState.AllDriversVerified = ( m_nVerifyAllRadio == 0 );
m_VerifState.SpecialPoolVerification = m_bSpecialPoolCheck;
m_VerifState.PagedCodeVerification = m_bPagedCCheck;
m_VerifState.AllocationFaultInjection = m_bAllocFCheck;
m_VerifState.PoolTracking = m_bPoolTCheck;
m_VerifState.IoVerifier = m_bIoVerifierCheck;
m_VerifState.SysIoVerifierLevel = m_nIoVerTypeRadio + 1;
_tcscpy( m_VerifState.AdditionalDriverNames,
(LPCTSTR)m_strAdditDrivers );
}
}
BEGIN_MESSAGE_MAP(CModifSettPage, CPropertyPage)
//{{AFX_MSG_MAP(CModifSettPage)
ON_BN_CLICKED(IDC_VERIFALL_RADIO, OnVerifallRadio)
ON_BN_CLICKED(IDC_VERIFSEL_RADIO, OnVerifselRadio)
ON_BN_CLICKED(IDC_ALLOCF_VERIF_CHECK, OnCheck )
ON_BN_CLICKED(IDC_VERIFY_BUTTON, OnVerifyButton)
ON_BN_CLICKED(IDC_DONTVERIFY_BUTTON, OnDontverifyButton)
ON_BN_CLICKED(ID_APPLY_BUTTON, OnApplyButton)
ON_NOTIFY(LVN_COLUMNCLICK, IDC_DRIVERS_LIST, OnColumnclickDriversList)
ON_EN_CHANGE(IDC_ADDIT_DRVNAMES_EDIT, OnChangeAdditDrvnamesEdit)
ON_BN_CLICKED(ID_RESETALL_BUTTON, OnResetallButton)
ON_BN_CLICKED(ID_PREF_BUTTON, OnPrefButton)
ON_BN_CLICKED(IDC_NORMAL_VERIF_CHECK, OnCheck )
ON_BN_CLICKED(IDC_PAGEDC_VERIF_CHECK, OnCheck )
ON_BN_CLICKED(IDC_POOLT_VERIF_CHECK, OnCheck )
ON_BN_CLICKED(IDC_IO_VERIF_CHECK, OnIoCheck )
ON_NOTIFY(NM_RCLICK, IDC_DRIVERS_LIST, OnRclickDriversList)
ON_COMMAND(ID_MODIF_DO_VERIFY, OnDoVerify)
ON_COMMAND(ID_MODIF_DONT_VERIFY, OnDontVerify)
ON_BN_CLICKED(IDC_MODSETT_IO_SELDRIVERS_RADIO, OnCheck)
ON_BN_CLICKED(IDC_MODSETT_IO_SYSWIDE_RADIO, OnCheck)
ON_MESSAGE( WM_HELP, OnHelp )
ON_MESSAGE( WM_CONTEXTMENU, OnContextMenu )
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CModifSettPage implementation
void CModifSettPage::GetDlgDataFromSett()
{
m_strAdditDrivers = m_VerifState.AdditionalDriverNames;
// all drivers verified ?
if( m_VerifState.AllDriversVerified )
{
m_nVerifyAllRadio = 0;
// list state
m_eListState = vrfControlDisabled;
}
else
{
m_nVerifyAllRadio = 1;
// list state
m_eListState = vrfControlEnabled;
}
// SpecialPoolVerification
m_bSpecialPoolCheck = m_VerifState.SpecialPoolVerification;
// PagedCodeVerification
m_bPagedCCheck = m_VerifState.PagedCodeVerification;
// AllocationFaultInjection
m_bAllocFCheck = m_VerifState.AllocationFaultInjection;
// PoolTracking
m_bPoolTCheck = m_VerifState.PoolTracking;
// IoVerifier
m_bIoVerifierCheck = m_VerifState.IoVerifier;
if( m_bIoVerifierCheck )
{
m_eIoRadioState = vrfControlEnabled;
}
else
{
m_eIoRadioState = vrfControlDisabled;
}
// SysIoVerifierLevel
if( m_VerifState.SysIoVerifierLevel )
{
ASSERT( m_bIoVerifierCheck );
m_nIoVerTypeRadio = m_VerifState.SysIoVerifierLevel - 1;
}
else
{
m_nIoVerTypeRadio = 0;
}
// Apply button state
m_eApplyButtonState = vrfControlDisabled;
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::UpdateControlsState()
{
CWnd *pRadioButton;
EnableControl( m_DriversList, m_eListState );
EnableControl( m_VerifyButton, m_eListState );
EnableControl( m_DontVerifButton, m_eListState );
EnableControl( m_AdditDrvEdit, m_eListState );
EnableControl( m_ApplyButton, m_eApplyButtonState );
pRadioButton = GetDlgItem( IDC_MODSETT_IO_SELDRIVERS_RADIO );
if( pRadioButton != NULL )
{
EnableControl( *pRadioButton, m_eIoRadioState );
}
else
{
ASSERT( FALSE );
}
pRadioButton = GetDlgItem( IDC_MODSETT_IO_SYSWIDE_RADIO );
if( pRadioButton != NULL )
{
EnableControl( *pRadioButton, m_eIoRadioState );
}
else
{
ASSERT( FALSE );
}
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::EnableControl( CWnd &wndCtrl,
VRF_CONTROL_STATE eNewState )
{
BOOL bEnabled = wndCtrl.IsWindowEnabled();
if( bEnabled )
{
if( eNewState == vrfControlDisabled )
wndCtrl.EnableWindow( FALSE );
}
else
{
if( eNewState == vrfControlEnabled )
wndCtrl.EnableWindow( TRUE );
}
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::SetupTheList()
{
SetupListHeader();
AddTheListItems();
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::SetupListHeader()
{
CString strDrivers, strStatus, strProvider, strVersion;
VERIFY( strDrivers.LoadString( IDS_DRIVERS ) );
VERIFY( strStatus.LoadString( IDS_VERIFICATION_STATUS ) );
VERIFY( strProvider.LoadString( IDS_PROVIDER ) );
VERIFY( strVersion.LoadString( IDS_VERSION ) );
CRect rectWnd;
m_DriversList.GetClientRect( &rectWnd );
LVCOLUMN lvColumn;
// column 0
memset( &lvColumn, 0, sizeof( lvColumn ) );
lvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
lvColumn.fmt = LVCFMT_LEFT;
lvColumn.iSubItem = 0;
lvColumn.pszText = strDrivers.GetBuffer( strDrivers.GetLength() + 1 );
lvColumn.cx = (int)( rectWnd.Width() * 0.17 );
VERIFY( m_DriversList.InsertColumn( 0, &lvColumn ) != -1 );
strDrivers.ReleaseBuffer();
// column 1
lvColumn.iSubItem = 1;
lvColumn.pszText = strStatus.GetBuffer( strStatus.GetLength() + 1 );
lvColumn.cx = (int)( rectWnd.Width() * 0.34 );
VERIFY( m_DriversList.InsertColumn( 1, &lvColumn ) != -1 );
strStatus.ReleaseBuffer();
// column 2
lvColumn.iSubItem = 2;
lvColumn.pszText = strProvider.GetBuffer( strProvider.GetLength() + 1 );
lvColumn.cx = (int)( rectWnd.Width() * 0.27 );
VERIFY( m_DriversList.InsertColumn( 2, &lvColumn ) != -1 );
strProvider.ReleaseBuffer();
// column 3
lvColumn.iSubItem = 3;
lvColumn.pszText = strVersion.GetBuffer( strVersion.GetLength() + 1 );
lvColumn.cx = (int)( rectWnd.Width() * 0.19 );
VERIFY( m_DriversList.InsertColumn( 3, &lvColumn ) != -1 );
strVersion.ReleaseBuffer();
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::AddTheListItems()
{
LVITEM lvItem;
int nActualIndex;
VERIFY( m_DriversList.DeleteAllItems() );
ASSERT( m_VerifState.DriverCount == 0 ||
::AfxIsValidAddress(
m_VerifState.DriverInfo,
m_VerifState.DriverCount * sizeof( PVRF_DRIVER_STATE ),
TRUE)
);
memset( &lvItem, 0, sizeof( lvItem ) );
for(UINT uCrtItem = 0; uCrtItem < m_VerifState.DriverCount; uCrtItem++ )
{
//
// sub-item 0
//
lvItem.mask = LVIF_TEXT | LVIF_PARAM;
lvItem.lParam = uCrtItem;
lvItem.iItem = m_DriversList.GetItemCount();
lvItem.iSubItem = 0;
lvItem.pszText = m_VerifState.DriverInfo[ uCrtItem ].Name;
nActualIndex = m_DriversList.InsertItem( &lvItem );
if( nActualIndex != -1 )
{
//
// sub-item 1
//
UpdateSecondColumn( nActualIndex,
m_VerifState.DriverInfo[ uCrtItem ].Verified,
m_VerifState.DriverInfo[ uCrtItem ].CurrentlyVerified );
//
// sub-item 2
//
lvItem.mask = LVIF_TEXT;
lvItem.iItem = nActualIndex;
lvItem.iSubItem = 2;
lvItem.pszText = m_VerifState.DriverInfo[ uCrtItem ].Provider;
VERIFY( m_DriversList.SetItem( &lvItem ) != -1 );
//
// sub-item 3
//
lvItem.mask = LVIF_TEXT;
lvItem.iItem = nActualIndex;
lvItem.iSubItem = 3;
lvItem.pszText = m_VerifState.DriverInfo[ uCrtItem ].Version;
VERIFY( m_DriversList.SetItem( &lvItem ) != -1 );
}
else
{
//
// cannot add a list item?!?
//
ASSERT( FALSE );
}
}
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::UpdateSecondColumn( int nItemIndex,
BOOL bVerifiedAfterBoot, BOOL bVerifiedNow )
{
LVITEM lvItem;
CString strValue;
ASSERT( nItemIndex >= 0 &&
(UINT)nItemIndex < m_VerifState.DriverCount &&
nItemIndex < m_DriversList.GetItemCount() );
// determine what's the status
if( bVerifiedAfterBoot )
{
if( bVerifiedNow )
{
VERIFY( strValue.LoadString( IDS_VERIFIED ) );
}
else
{
VERIFY( strValue.LoadString( IDS_VERIFIED_AFTER_BOOT ) );
}
}
else
{
if( bVerifiedNow )
{
VERIFY( strValue.LoadString( IDS_NOT_VERIFIED_AFTER_BOOT ) );
}
else
{
VERIFY( strValue.LoadString( IDS_NOT_VERIFIED ) );
}
}
// update the list item
memset( &lvItem, 0, sizeof( lvItem ) );
lvItem.mask = LVIF_TEXT;
lvItem.iItem = nItemIndex;
lvItem.iSubItem = 1;
lvItem.pszText = strValue.GetBuffer( strValue.GetLength() + 1 );
VERIFY( m_DriversList.SetItem( &lvItem ) != -1 );
strValue.ReleaseBuffer();
}
/////////////////////////////////////////////////////////////////////////////
int CALLBACK CModifSettPage::DrvVerifCmpFunc(
LPARAM lParam1,
LPARAM lParam2,
LPARAM lParamSort)
{
UINT uIndex1 = (UINT)lParam1;
UINT uIndex2 = (UINT)lParam2;
CModifSettPage *pThis = (CModifSettPage *)lParamSort;
ASSERT_VALID( pThis );
int nCmpRez = 0;
// sanity check
if( uIndex1 > pThis->m_VerifState.DriverCount ||
uIndex2 > pThis->m_VerifState.DriverCount )
{
ASSERT( FALSE );
return 0;
}
if( pThis->m_VerifState.DriverInfo[ uIndex1 ].Verified ==
pThis->m_VerifState.DriverInfo[ uIndex2 ].Verified )
{
// same flag for after boot verified
if( pThis->m_VerifState.DriverInfo[ uIndex1 ].CurrentlyVerified ==
pThis->m_VerifState.DriverInfo[ uIndex2 ].CurrentlyVerified )
{
// same flag for currently verified
nCmpRez = _tcsicmp( pThis->m_VerifState.DriverInfo[ uIndex1 ].Name,
pThis->m_VerifState.DriverInfo[ uIndex2 ].Name );
}
else
{
// different flags for currently verified
if( pThis->m_VerifState.DriverInfo[ uIndex1 ].CurrentlyVerified )
{
nCmpRez = 1;
}
else
{
nCmpRez = -1;
}
}
}
else
{
// different flags for after boot verified
if( pThis->m_VerifState.DriverInfo[ uIndex1 ].Verified )
{
nCmpRez = 1;
}
else
{
nCmpRez = -1;
}
}
if( pThis->m_bAscendDrvVerifSort )
nCmpRez *= -1;
return nCmpRez;
}
/////////////////////////////////////////////////////////////////////////////
int CALLBACK CModifSettPage::DrvNameCmpFunc(
LPARAM lParam1,
LPARAM lParam2,
LPARAM lParamSort)
{
UINT uIndex1 = (UINT)lParam1;
UINT uIndex2 = (UINT)lParam2;
CModifSettPage *pThis = (CModifSettPage *)lParamSort;
ASSERT_VALID( pThis );
int nCmpRez = 0;
// sanity check
if( uIndex1 > pThis->m_VerifState.DriverCount ||
uIndex2 > pThis->m_VerifState.DriverCount )
{
ASSERT( FALSE );
return 0;
}
// compare the names
nCmpRez = _tcsicmp( pThis->m_VerifState.DriverInfo[ uIndex1 ].Name,
pThis->m_VerifState.DriverInfo[ uIndex2 ].Name );
if( ! nCmpRez )
{
// same name ???
if( pThis->m_VerifState.DriverInfo[ uIndex1 ].Verified ==
pThis->m_VerifState.DriverInfo[ uIndex2 ].Verified )
{
// same flag
return 0;
}
else
{
if( pThis->m_VerifState.DriverInfo[ uIndex1 ].Verified )
{
if( pThis->m_bAscendDrvVerifSort )
return 1;
else
return -1;
}
else
{
if( pThis->m_bAscendDrvVerifSort )
return -1;
else
return 1;
}
}
}
else
{
if( pThis->m_bAscendDrvNameSort )
nCmpRez *= -1;
}
return nCmpRez;
}
/////////////////////////////////////////////////////////////////////////////
int CALLBACK CModifSettPage::ProviderCmpFunc(
LPARAM lParam1,
LPARAM lParam2,
LPARAM lParamSort)
{
BOOL bNotAvailable1;
BOOL bNotAvailable2;
CString strNotAvailable;
UINT uIndex1 = (UINT)lParam1;
UINT uIndex2 = (UINT)lParam2;
CModifSettPage *pThis = (CModifSettPage *)lParamSort;
ASSERT_VALID( pThis );
int nCmpRez = 0;
//
// sanity checks
//
if( uIndex1 > pThis->m_VerifState.DriverCount ||
uIndex2 > pThis->m_VerifState.DriverCount )
{
ASSERT( FALSE );
return 0;
}
//
// are the strings valid or (Not Available)?
//
VERIFY( strNotAvailable.LoadString( IDS_NOT_AVAILABLE ) );
bNotAvailable1 = ( strNotAvailable.CompareNoCase(
pThis->m_VerifState.DriverInfo[ uIndex1 ].Provider ) == 0 );
bNotAvailable2 = ( strNotAvailable.CompareNoCase(
pThis->m_VerifState.DriverInfo[ uIndex2 ].Provider ) == 0 );
if( bNotAvailable1 )
{
if( bNotAvailable2 )
{
return 0;
}
else
{
if( pThis->m_bAscendProviderSort )
{
return -1;
}
else
{
return 1;
}
}
}
else
{
if( bNotAvailable2 )
{
if( pThis->m_bAscendProviderSort )
{
return 1;
}
else
{
return -1;
}
}
}
//
// compare the names of the providers
//
nCmpRez = _tcsicmp( pThis->m_VerifState.DriverInfo[ uIndex1 ].Provider,
pThis->m_VerifState.DriverInfo[ uIndex2 ].Provider );
if( ! nCmpRez )
{
//
// same name for the provider
//
if( pThis->m_VerifState.DriverInfo[ uIndex1 ].Verified ==
pThis->m_VerifState.DriverInfo[ uIndex2 ].Verified )
{
//
// same verified flag
//
return 0;
}
else
{
if( pThis->m_VerifState.DriverInfo[ uIndex1 ].Verified )
{
return 1;
}
else
{
return -1;
}
}
}
else
{
if( pThis->m_bAscendProviderSort )
nCmpRez *= -1;
}
return nCmpRez;
}
/////////////////////////////////////////////////////////////////////////////
int CALLBACK CModifSettPage::VersionCmpFunc(
LPARAM lParam1,
LPARAM lParam2,
LPARAM lParamSort)
{
BOOL bNotAvailable1;
BOOL bNotAvailable2;
CString strNotAvailable;
UINT uIndex1 = (UINT)lParam1;
UINT uIndex2 = (UINT)lParam2;
CModifSettPage *pThis = (CModifSettPage *)lParamSort;
ASSERT_VALID( pThis );
int nCmpRez = 0;
//
// sanity checks
//
if( uIndex1 > pThis->m_VerifState.DriverCount ||
uIndex2 > pThis->m_VerifState.DriverCount )
{
ASSERT( FALSE );
return 0;
}
//
// are the strings valid or (Not Available)?
//
VERIFY( strNotAvailable.LoadString( IDS_NOT_AVAILABLE ) );
bNotAvailable1 = ( strNotAvailable.CompareNoCase(
pThis->m_VerifState.DriverInfo[ uIndex1 ].Version ) == 0 );
bNotAvailable2 = ( strNotAvailable.CompareNoCase(
pThis->m_VerifState.DriverInfo[ uIndex2 ].Version ) == 0 );
if( bNotAvailable1 )
{
if( bNotAvailable2 )
{
return 0;
}
else
{
if( pThis->m_bAscendVersionSort )
{
return -1;
}
else
{
return 1;
}
}
}
else
{
if( bNotAvailable2 )
{
if( pThis->m_bAscendVersionSort )
{
return 1;
}
else
{
return -1;
}
}
}
//
// compare the names of the providers
//
nCmpRez = _tcsicmp( pThis->m_VerifState.DriverInfo[ uIndex1 ].Version,
pThis->m_VerifState.DriverInfo[ uIndex2 ].Version );
if( ! nCmpRez )
{
//
// same name for the provider
//
if( pThis->m_VerifState.DriverInfo[ uIndex1 ].Verified ==
pThis->m_VerifState.DriverInfo[ uIndex2 ].Verified )
{
//
// same verified flag
//
return 0;
}
else
{
if( pThis->m_VerifState.DriverInfo[ uIndex1 ].Verified )
{
return 1;
}
else
{
return -1;
}
}
}
else
{
if( pThis->m_bAscendVersionSort )
nCmpRez *= -1;
}
return nCmpRez;
}
/////////////////////////////////////////////////////////////////////////////
// CModifSettPage message handlers
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::OnVerifallRadio()
{
m_eListState = vrfControlDisabled;
m_eApplyButtonState = vrfControlEnabled;
UpdateControlsState();
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::OnVerifselRadio()
{
m_eListState = vrfControlEnabled;
m_eApplyButtonState = vrfControlEnabled;
UpdateControlsState();
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::OnIoCheck()
{
if( m_IOVerifCheck.GetCheck() == 1 )
{
m_eIoRadioState = vrfControlEnabled;
}
else
{
m_eIoRadioState = vrfControlDisabled;
}
OnCheck();
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::OnCheck()
{
m_eApplyButtonState = vrfControlEnabled;
UpdateControlsState();
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::ToggleItemsState( BOOL bVerified )
{
BOOL bChanged = FALSE;
if( m_eListState != vrfControlEnabled )
return;
int nItems = m_DriversList.GetItemCount();
for(int nCrtItem = 0; nCrtItem < nItems; nCrtItem++ )
{
if( m_DriversList.GetItemState( nCrtItem, LVIS_SELECTED ) &
LVIS_SELECTED )
{
UINT uIndexInArray = (UINT)m_DriversList.GetItemData( nCrtItem );
if( m_VerifState.DriverInfo[ uIndexInArray ].Verified !=
bVerified )
{
//
// Toggle its state
//
m_VerifState.DriverInfo[ uIndexInArray ].Verified = bVerified;
if( bVerified )
{
//
// Will be verified from now on.
// Send a notification about this, in order to detect any miniports.
//
VrfNotifyDriverSelection( &m_VerifState, uIndexInArray );
}
bChanged = TRUE;
}
}
}
// refill the second column of the list
for(nCrtItem = 0; nCrtItem < nItems; nCrtItem++ )
{
UINT uIndexInArray = (UINT)m_DriversList.GetItemData( nCrtItem );
UpdateSecondColumn( nCrtItem,
m_VerifState.DriverInfo[ uIndexInArray ].Verified,
m_VerifState.DriverInfo[ uIndexInArray ].CurrentlyVerified );
}
// some status changed, enable the Apply button
if( bChanged )
{
m_eApplyButtonState = vrfControlEnabled;
UpdateControlsState();
}
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::OnVerifyButton()
{
ToggleItemsState( TRUE );
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::OnDontverifyButton()
{
ToggleItemsState( FALSE );
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::OnApplyButton()
{
if( ApplyTheChanges() )
{
CWaitCursor WaitCursor;
g_bSettingsSaved = TRUE;
VrfGetVerifierState( &m_VerifState );
GetDlgDataFromSett();
UpdateData( FALSE );
AddTheListItems();
// all updated
m_eApplyButtonState = vrfControlDisabled;
UpdateControlsState();
WaitCursor.Restore();
}
}
/////////////////////////////////////////////////////////////////////////////
BOOL CModifSettPage::ApplyTheChanges()
{
if( UpdateData( TRUE ) )
{
// check if we have to clean-up all the registry values
BOOL bAnythingEnabled = FALSE;
if( m_VerifState.AllDriversVerified ||
m_VerifState.SpecialPoolVerification ||
m_VerifState.PagedCodeVerification ||
m_VerifState.AllocationFaultInjection ||
m_VerifState.PoolTracking ||
m_VerifState.IoVerifier )
{
bAnythingEnabled = TRUE;
}
else
{
for( ULONG uCrtDriver = 0; uCrtDriver < m_VerifState.DriverCount; uCrtDriver++ )
{
if( m_VerifState.DriverInfo[ uCrtDriver ].Verified )
{
bAnythingEnabled = TRUE;
break;
}
}
if( ! bAnythingEnabled )
{
// check if we have some significative characters in Additional... edit
int nBufferSize = sizeof( m_VerifState.AdditionalDriverNames ) / sizeof( TCHAR );
for(int nCrtChar = 0; nCrtChar < nBufferSize; nCrtChar++ )
{
if( m_VerifState.AdditionalDriverNames[nCrtChar] == (TCHAR)0 )
{
// end of string
break;
}
if( m_VerifState.AdditionalDriverNames[nCrtChar] != _T(' ') )
{
// significant char
bAnythingEnabled = TRUE;
break;
}
}
}
}
if( bAnythingEnabled )
return VrfSetVerifierState( &m_VerifState );
else
return VrfClearAllVerifierSettings();
}
return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::OnColumnclickDriversList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
switch( pNMListView->iSubItem )
{
case 0:
if( m_nLastColumnClicked == pNMListView->iSubItem )
{
//
// change the sort order for this sub-item
//
m_bAscendDrvNameSort = !m_bAscendDrvNameSort;
}
m_DriversList.SortItems( DrvNameCmpFunc, (LPARAM)this );
break;
case 1:
if( m_nLastColumnClicked == pNMListView->iSubItem )
{
//
// change the sort order for this sub-item
//
m_bAscendDrvVerifSort = !m_bAscendDrvVerifSort;
}
m_DriversList.SortItems( DrvVerifCmpFunc, (LPARAM)this );
break;
case 2:
if( m_nLastColumnClicked == pNMListView->iSubItem )
{
//
// change the sort order for this sub-item
//
m_bAscendProviderSort = !m_bAscendProviderSort;
}
m_DriversList.SortItems( ProviderCmpFunc, (LPARAM)this );
break;
case 3:
if( m_nLastColumnClicked == pNMListView->iSubItem )
{
//
// change the sort order for this sub-item
//
m_bAscendVersionSort = !m_bAscendVersionSort;
}
m_DriversList.SortItems( VersionCmpFunc, (LPARAM)this );
break;
default:
ASSERT( FALSE );
}
//
// keep the index of the last clicked column
//
m_nLastColumnClicked = pNMListView->iSubItem;
*pResult = 0;
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::OnChangeAdditDrvnamesEdit()
{
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
m_eApplyButtonState = vrfControlEnabled;
UpdateControlsState();
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::OnResetallButton()
{
m_VerifState.AllDriversVerified = FALSE;
m_VerifState.SpecialPoolVerification = FALSE;
m_VerifState.PagedCodeVerification = FALSE;
m_VerifState.AllocationFaultInjection = FALSE;
m_VerifState.PoolTracking = FALSE;
m_VerifState.IoVerifier = FALSE;
for(ULONG uCrtDriver = 0; uCrtDriver < m_VerifState.DriverCount;
uCrtDriver++ )
{
m_VerifState.DriverInfo[ uCrtDriver ].Verified = FALSE;
}
m_VerifState.AdditionalDriverNames[0] = (TCHAR)0;
AddTheListItems();
CheckRadioButton( IDC_VERIFALL_RADIO, IDC_VERIFSEL_RADIO,
IDC_VERIFSEL_RADIO );
m_PagedCCheck.SetCheck( 0 );
m_SpecialPoolVerifCheck.SetCheck( 0 );
m_AllocFCheck.SetCheck( 0 );
m_PoolTCheck.SetCheck( 0 );
m_IOVerifCheck.SetCheck( 0 );
m_AdditDrvEdit.SetWindowText( _T("") );
m_eListState = vrfControlEnabled;
m_eApplyButtonState = vrfControlEnabled;
m_eIoRadioState = vrfControlDisabled;
UpdateControlsState();
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::OnPrefButton()
{
m_VerifState.AllDriversVerified = TRUE;
m_VerifState.SpecialPoolVerification = TRUE;
m_VerifState.PagedCodeVerification = TRUE;
m_VerifState.AllocationFaultInjection = FALSE;
m_VerifState.PoolTracking = TRUE;
m_VerifState.IoVerifier = TRUE;
m_VerifState.SysIoVerifierLevel = 1;
m_VerifState.AdditionalDriverNames[0] = (TCHAR)0;
CheckRadioButton( IDC_VERIFALL_RADIO, IDC_VERIFSEL_RADIO,
IDC_VERIFALL_RADIO );
m_PagedCCheck.SetCheck( 1 );
m_SpecialPoolVerifCheck.SetCheck( 1 );
m_PoolTCheck.SetCheck( 1 );
m_AllocFCheck.SetCheck( 0 );
m_IOVerifCheck.SetCheck( 1 );
m_eListState = vrfControlDisabled;
m_eApplyButtonState = vrfControlEnabled;
m_eIoRadioState = vrfControlEnabled;
CheckRadioButton(
IDC_MODSETT_IO_SELDRIVERS_RADIO,
IDC_MODSETT_IO_SYSWIDE_RADIO,
IDC_MODSETT_IO_SYSWIDE_RADIO );
UpdateControlsState();
}
/////////////////////////////////////////////////////////////////////////////
BOOL CModifSettPage::OnInitDialog()
{
//
// get the current status
//
CWaitCursor WaitCursor;
VrfGetVerifierState( &m_VerifState );
if( m_VerifState.IoVerifier == TRUE )
{
m_eIoRadioState = vrfControlEnabled;
}
else
{
m_eIoRadioState = vrfControlDisabled;
}
GetDlgDataFromSett();
CPropertyPage::OnInitDialog();
//
// the list of drivers
//
SetupTheList();
//
// sort the list by the driver name
//
m_nLastColumnClicked = 0;
m_DriversList.SortItems( DrvNameCmpFunc, (LPARAM)this );
//
// update all controls
//
UpdateControlsState();
WaitCursor.Restore();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::OnRclickDriversList(NMHDR* pNMHDR, LRESULT* pResult)
{
POINT point;
CMenu theMenu, *pTrackedMenu = NULL;
BOOL bVerifiedMenu = FALSE, bNotVerifiedMenu = FALSE;
if( m_eListState != vrfControlEnabled )
return;
int nItems = m_DriversList.GetItemCount();
for(int nCrtItem = 0; nCrtItem < nItems; nCrtItem++ )
{
if( m_DriversList.GetItemState( nCrtItem, LVIS_SELECTED ) &
LVIS_SELECTED )
{
UINT uIndexInArray = (UINT)m_DriversList.GetItemData( nCrtItem );
if( m_VerifState.DriverInfo[ uIndexInArray ].Verified )
{
bVerifiedMenu = TRUE;
}
else
{
bNotVerifiedMenu = TRUE;
}
}
}
if( bVerifiedMenu && bNotVerifiedMenu )
{
VERIFY( theMenu.LoadMenu( IDM_BOTH_VERIFIED_ITEM ) );
}
else
{
if( bVerifiedMenu )
{
VERIFY( theMenu.LoadMenu( IDM_VERIFIED_ITEM ) );
}
else
{
if( bNotVerifiedMenu )
{
VERIFY( theMenu.LoadMenu( IDM_NOT_VERIFIED_ITEM ) );
}
}
}
pTrackedMenu = theMenu.GetSubMenu( 0 );
if( pTrackedMenu != NULL )
{
ASSERT_VALID( pTrackedMenu );
VERIFY( ::GetCursorPos( &point ) );
VERIFY( pTrackedMenu->TrackPopupMenu(
TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
point.x, point.y,
this ) );
}
else
{
ASSERT( FALSE );
}
*pResult = 0;
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::OnDoVerify()
{
OnVerifyButton();
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::OnDontVerify()
{
OnDontverifyButton();
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::OnCancel()
{
if( g_bSettingsSaved )
{
::AfxMessageBox( IDS_REBOOT, MB_OK | MB_ICONINFORMATION );
}
CPropertyPage::OnCancel();
}
/////////////////////////////////////////////////////////////////////////////
void CModifSettPage::OnOK()
{
if( g_bSettingsSaved )
{
::AfxMessageBox( IDS_REBOOT, MB_OK | MB_ICONINFORMATION );
}
CPropertyPage::OnOK();
}
/////////////////////////////////////////////////////////////////////////////
BOOL CModifSettPage::OnQueryCancel()
{
if( m_eApplyButtonState == vrfControlEnabled )
{
if( ::AfxMessageBox( IDS_CHANGES_NOT_SAVED,
MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2 ) == IDNO )
return FALSE;
}
return CPropertyPage::OnQueryCancel();
}
/////////////////////////////////////////////////////////////////////////////
BOOL CModifSettPage::OnApply()
{
return FALSE;
}
/////////////////////////////////////////////////////////////
LONG CModifSettPage::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 CModifSettPage::OnContextMenu( WPARAM wParam, LPARAM lParam )
{
LONG lResult = 0;
::WinHelp(
(HWND) wParam,
VERIFIER_HELP_FILE,
HELP_CONTEXTMENU,
(DWORD_PTR) MyHelpIds );
return lResult;
}