|
|
//
// Driver Verifier UI
// Copyright (c) Microsoft Corporation, 1999
//
//
//
// module: DStsPage.cpp
// author: DMihai
// created: 11/1/00
//
// Description:
//
#include "stdafx.h"
#include <Cderr.h>
#include "verifier.h"
#include "DStsPage.h"
#include "VrfUtil.h"
#include "VGlobal.h"
#include "VBitsDlg.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_CRTSTAT_SETTBITS_LIST, IDH_DV_CurrentSettings, IDC_CRTSTAT_DRIVERS_LIST, IDH_DV_CurrentVerifiedDrivers, IDC_CRTSTAT_CHSETT_BUTTON, IDH_DV_Changebut, IDC_CRTSTAT_ADDDRV_BUTTON, IDH_DV_Addbut, IDC_CRTSTAT_REMDRVT_BUTTON, IDH_DV_Removebut, 0, 0 };
/////////////////////////////////////////////////////////////////////////////
// CDriverStatusPage property page
IMPLEMENT_DYNCREATE(CDriverStatusPage, CVerifierPropertyPage)
CDriverStatusPage::CDriverStatusPage() : CVerifierPropertyPage(CDriverStatusPage::IDD) { //{{AFX_DATA_INIT(CDriverStatusPage)
//}}AFX_DATA_INIT
m_uTimerHandler = 0;
//
// Driver list sort parameters
//
m_nSortColumnIndexDrv = 0; m_bAscendDrvNameSort = FALSE; m_bAscendDrvStatusSort = FALSE;
//
// Settings bits sort parameters
//
m_nSortColumnIndexSettbits = 1; m_bAscendSortEnabledBits = FALSE; m_bAscendSortNameBits = FALSE;
m_pParentSheet = NULL; }
CDriverStatusPage::~CDriverStatusPage() { }
VOID CDriverStatusPage::DoDataExchange(CDataExchange* pDX) { if( ! pDX->m_bSaveAndValidate ) { //
// Query the kernel
//
if( TRUE != VrfGetRuntimeVerifierData( &m_RuntimeVerifierData ) || m_RuntimeVerifierData.m_RuntimeDriverDataArray.GetSize() == 0 ) { //
// Don't have any verified drivers currently
//
//
// Clear all settings bits just in case the kernel
// didn't return them to us all zero ;-)
//
m_RuntimeVerifierData.m_bSpecialPool = FALSE; m_RuntimeVerifierData.m_bPoolTracking = FALSE; m_RuntimeVerifierData.m_bForceIrql = FALSE; m_RuntimeVerifierData.m_bIo = FALSE; m_RuntimeVerifierData.m_bEnhIo = FALSE; m_RuntimeVerifierData.m_bDeadlockDetect = FALSE; m_RuntimeVerifierData.m_bDMAVerif = FALSE; m_RuntimeVerifierData.m_bLowRes = FALSE; } }
CVerifierPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDriverStatusPage)
DDX_Control(pDX, IDC_CRTSTAT_SETTBITS_LIST, m_SettBitsList); DDX_Control(pDX, IDC_CRTSTAT_NEXT_DESCR_STATIC, m_NextDescription); DDX_Control(pDX, IDC_CRTSTAT_DRIVERS_LIST, m_DriversList); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDriverStatusPage, CVerifierPropertyPage) //{{AFX_MSG_MAP(CDriverStatusPage)
ON_NOTIFY(LVN_COLUMNCLICK, IDC_CRTSTAT_DRIVERS_LIST, OnColumnclickCrtstatDriversList) ON_WM_TIMER() ON_BN_CLICKED(IDC_CRTSTAT_CHSETT_BUTTON, OnChsettButton) ON_BN_CLICKED(IDC_CRTSTAT_ADDDRV_BUTTON, OnAdddrvButton) ON_BN_CLICKED(IDC_CRTSTAT_REMDRVT_BUTTON, OnRemdrvtButton) ON_NOTIFY(LVN_COLUMNCLICK, IDC_CRTSTAT_SETTBITS_LIST, OnColumnclickCrtstatSettbitsList) ON_WM_CONTEXTMENU() ON_MESSAGE( WM_HELP, OnHelp ) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////
VOID CDriverStatusPage::RefreshInfo() { if( UpdateData( FALSE ) ) { //
// Refresh the settings bits list
//
RefreshListSettBits(); //SortTheListSettBits();
//
// Refresh the drivers list
//
FillTheListDrivers(); SortTheListDrivers(); } }
/////////////////////////////////////////////////////////////
//
// Driver status list control methods
//
VOID CDriverStatusPage::SetupListHeaderDrivers() { LVCOLUMN lvColumn; CRect rectWnd; CString strDrivers, strStatus; VERIFY( strDrivers.LoadString( IDS_DRIVERS ) ); VERIFY( strStatus.LoadString( IDS_STATUS ) );
//
// List's regtangle
//
m_DriversList.GetClientRect( &rectWnd ); //
// Column 0
//
ZeroMemory( &lvColumn, sizeof( lvColumn ) ); lvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; lvColumn.fmt = LVCFMT_LEFT; lvColumn.iSubItem = 0; lvColumn.cx = (int)( rectWnd.Width() * 0.50 ); lvColumn.pszText = strDrivers.GetBuffer( strDrivers.GetLength() + 1 );
if (NULL != lvColumn.pszText) { VERIFY( m_DriversList.InsertColumn( 0, &lvColumn ) != -1 ); strDrivers.ReleaseBuffer(); } else { lvColumn.pszText = g_szVoidText; VERIFY( m_DriversList.InsertColumn( 0, &lvColumn ) != -1 ); }
//
// Column 1
//
lvColumn.iSubItem = 1; lvColumn.cx = (int)( rectWnd.Width() * 0.44 ); lvColumn.pszText = strStatus.GetBuffer( strStatus.GetLength() + 1 );
if (NULL != lvColumn.pszText) { VERIFY( m_DriversList.InsertColumn( 1, &lvColumn ) != -1 ); strStatus.ReleaseBuffer(); } else { lvColumn.pszText = g_szVoidText; VERIFY( m_DriversList.InsertColumn( 1, &lvColumn ) != -1 ); } }
/////////////////////////////////////////////////////////////
VOID CDriverStatusPage::FillTheListDrivers() { LVITEM lvItem; int nActualIndex; BOOL *pbAlreadyInList; int nItemCount; int nCrtListItem; INT_PTR nCrtVerifiedDriver; INT_PTR nDriversNo; TCHAR szDriverName[ _MAX_PATH ]; BOOL bResult; CString strText;
//
// The number of drivers currently verified
//
nDriversNo = m_RuntimeVerifierData.m_RuntimeDriverDataArray.GetSize();
if( nDriversNo == 0 ) { //
// Clear the list
//
VERIFY( m_DriversList.DeleteAllItems() ); } else { //
// There are some drivers currently verified
//
pbAlreadyInList = new BOOL[ nDriversNo ]; if( pbAlreadyInList == NULL ) { return; } for( nCrtVerifiedDriver = 0; nCrtVerifiedDriver < nDriversNo; nCrtVerifiedDriver+= 1) { pbAlreadyInList[ nCrtVerifiedDriver ] = FALSE; }
//
// Parse all the current list items
//
nItemCount = m_DriversList.GetItemCount();
for( nCrtListItem = 0; nCrtListItem < nItemCount; nCrtListItem+= 1 ) { //
// Get the current driver's name from the list
//
ZeroMemory( &lvItem, sizeof( lvItem ) );
lvItem.mask = LVIF_TEXT; lvItem.iItem = nCrtListItem; lvItem.iSubItem = 0; lvItem.pszText = szDriverName; lvItem.cchTextMax = ARRAY_LENGTH( szDriverName );
bResult = m_DriversList.GetItem( &lvItem ); if( bResult == FALSE ) { //
// Could not get the current item's attributes?!?
//
ASSERT( FALSE );
//
// Remove this item from the list
//
VERIFY( m_DriversList.DeleteItem( nCrtListItem ) );
nCrtListItem -= 1; nItemCount -= 1; } else { //
// see is the current driver is still in m_RuntimeVerifierData
//
for( nCrtVerifiedDriver = 0; nCrtVerifiedDriver < nDriversNo; nCrtVerifiedDriver+= 1) { if( m_RuntimeVerifierData.m_RuntimeDriverDataArray.GetAt( nCrtVerifiedDriver ) ->m_strName.CompareNoCase( szDriverName ) == 0 ) { //
// Update the item's data with the current index in the array
//
lvItem.mask = LVIF_PARAM; lvItem.lParam = nCrtVerifiedDriver; VERIFY( m_DriversList.SetItem( &lvItem ) != -1 );
//
// Update the second column
//
UpdateStatusColumnDrivers( nCrtListItem, nCrtVerifiedDriver );
//
// Mark the current driver as updated
//
pbAlreadyInList[ nCrtVerifiedDriver ] = TRUE;
break; } }
//
// If the driver is no longer verified, remove it from the list
//
if( nCrtVerifiedDriver >= nDriversNo ) { VERIFY( m_DriversList.DeleteItem( nCrtListItem ) );
nCrtListItem -= 1; nItemCount -= 1; } } }
//
// Add the drivers that were not in the list before this update
//
for( nCrtVerifiedDriver = 0; nCrtVerifiedDriver < nDriversNo; nCrtVerifiedDriver += 1) { if( ! pbAlreadyInList[ nCrtVerifiedDriver ] ) { //
// Add a new item for this
//
ZeroMemory( &lvItem, sizeof( lvItem ) );
//
// sub-item 0
//
lvItem.mask = LVIF_TEXT | LVIF_PARAM; lvItem.lParam = nCrtVerifiedDriver; lvItem.iItem = m_DriversList.GetItemCount(); lvItem.iSubItem = 0; strText = m_RuntimeVerifierData.m_RuntimeDriverDataArray.GetAt( nCrtVerifiedDriver )->m_strName; lvItem.pszText = strText.GetBuffer( strText.GetLength() + 1 );
if( NULL != lvItem.pszText ) { nActualIndex = m_DriversList.InsertItem( &lvItem ); VERIFY( nActualIndex != -1 );
strText.ReleaseBuffer();
//
// sub-item 1
//
UpdateStatusColumnDrivers( nActualIndex, nCrtVerifiedDriver ); } } }
delete [] pbAlreadyInList; } }
/////////////////////////////////////////////////////////////
VOID CDriverStatusPage::UpdateStatusColumnDrivers( INT_PTR nItemIndex, INT_PTR nCrtDriver ) { CRuntimeDriverData *pCrtDriverData; LVITEM lvItem; CString strStatus;
ASSERT( nItemIndex >= 0 && nItemIndex < m_RuntimeVerifierData.m_RuntimeDriverDataArray.GetSize() && nItemIndex < m_DriversList.GetItemCount() && nCrtDriver >= 0 && nCrtDriver < m_RuntimeVerifierData.m_RuntimeDriverDataArray.GetSize() && nCrtDriver < m_DriversList.GetItemCount() );
pCrtDriverData = m_RuntimeVerifierData.m_RuntimeDriverDataArray.GetAt( nCrtDriver );
ASSERT_VALID( pCrtDriverData );
//
// Determine what's the appropriate value for the second column
//
if( ! pCrtDriverData->Loads ) { VERIFY( strStatus.LoadString( IDS_NEVER_LOADED ) ); } else { if( pCrtDriverData->Loads == pCrtDriverData->Unloads ) { VERIFY( strStatus.LoadString( IDS_UNLOADED ) ); } else { if( pCrtDriverData->Loads > pCrtDriverData->Unloads ) { VERIFY( strStatus.LoadString( IDS_LOADED ) ); } else { ASSERT( FALSE ); VERIFY( strStatus.LoadString( IDS_UNKNOWN ) ); } } }
//
// Update the list item
//
ZeroMemory( &lvItem, sizeof( lvItem ) ); lvItem.mask = LVIF_TEXT; lvItem.iItem = (INT)nItemIndex; lvItem.iSubItem = 1; lvItem.pszText = strStatus.GetBuffer( strStatus.GetLength() + 1 );
if (NULL != lvItem.pszText) { VERIFY( m_DriversList.SetItem( &lvItem ) ); strStatus.ReleaseBuffer(); } else { lvItem.pszText = g_szVoidText; VERIFY( m_DriversList.SetItem( &lvItem ) ); } }
/////////////////////////////////////////////////////////////
int CALLBACK CDriverStatusPage::DrvStatusCmpFunc( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { UINT uIndex1 = (UINT)lParam1; UINT uIndex2 = (UINT)lParam2; int nCmpRez = 0; CRuntimeDriverData *pDriverData1; CRuntimeDriverData *pDriverData2;
CDriverStatusPage *pThis = (CDriverStatusPage *)lParamSort; ASSERT_VALID( pThis );
//
// Difference between loads and unloads #
//
pDriverData1 = pThis->m_RuntimeVerifierData.m_RuntimeDriverDataArray.GetAt( uIndex1 );
ASSERT_VALID( pDriverData1 );
pDriverData2 = pThis->m_RuntimeVerifierData.m_RuntimeDriverDataArray.GetAt( uIndex2 );
ASSERT_VALID( pDriverData2 );
LONG lLoadDiff1 = (LONG) pDriverData1->Loads - (LONG) pDriverData1->Unloads; LONG lLoadDiff2 = (LONG) pDriverData2->Loads - (LONG) pDriverData2->Unloads;
if( lLoadDiff1 == lLoadDiff2 ) { //
// Both loaded or both not loaded
//
if( pDriverData1->Loads == pDriverData2->Loads ) { //
// Loaded same number of times
//
nCmpRez = 0; } else { if( pDriverData1->Loads > pDriverData2->Loads ) { nCmpRez = 2; } else { nCmpRez = -2; } } } else { if( lLoadDiff1 > lLoadDiff2 ) { nCmpRez = 1; } else { nCmpRez = -1; } }
if( FALSE != pThis->m_bAscendDrvStatusSort ) { nCmpRez *= -1; }
return nCmpRez; }
/////////////////////////////////////////////////////////////
int CALLBACK CDriverStatusPage::DrvNameCmpFunc( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { int nCmpRez = 0; UINT uIndex1 = (UINT)lParam1; UINT uIndex2 = (UINT)lParam2; CRuntimeDriverData *pDriverData1; CRuntimeDriverData *pDriverData2;
CDriverStatusPage *pThis = (CDriverStatusPage *)lParamSort; ASSERT_VALID( pThis );
pDriverData1 = pThis->m_RuntimeVerifierData.m_RuntimeDriverDataArray.GetAt( uIndex1 );
ASSERT_VALID( pDriverData1 );
pDriverData2 = pThis->m_RuntimeVerifierData.m_RuntimeDriverDataArray.GetAt( uIndex2 );
ASSERT_VALID( pDriverData2 );
nCmpRez = pDriverData1->m_strName.CompareNoCase( pDriverData2->m_strName ); if( FALSE != pThis->m_bAscendDrvNameSort ) { nCmpRez *= -1; }
return nCmpRez; }
/////////////////////////////////////////////////////////////
//
// Settings bits list control methods
//
VOID CDriverStatusPage::SetupListHeaderSettBits() { CString strTitle; CRect rectWnd; LVCOLUMN lvColumn;
//
// The list's rectangle
//
m_SettBitsList.GetClientRect( &rectWnd );
ZeroMemory( &lvColumn, sizeof( lvColumn ) );
lvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; lvColumn.fmt = LVCFMT_LEFT;
//
// Column 0
//
VERIFY( strTitle.LoadString( IDS_ENABLED_QUESTION ) );
lvColumn.iSubItem = 0; lvColumn.cx = (int)( rectWnd.Width() * 0.25 ); lvColumn.pszText = strTitle.GetBuffer( strTitle.GetLength() + 1 );
if (NULL != lvColumn.pszText) { VERIFY( m_SettBitsList.InsertColumn( 0, &lvColumn ) != -1 ); strTitle.ReleaseBuffer(); } else { lvColumn.pszText = g_szVoidText; VERIFY( m_SettBitsList.InsertColumn( 0, &lvColumn ) != -1 ); }
//
// Column 1
//
VERIFY( strTitle.LoadString( IDS_SETTING ) );
lvColumn.iSubItem = 1; lvColumn.cx = (int)( rectWnd.Width() * 0.75 ); lvColumn.pszText = strTitle.GetBuffer( strTitle.GetLength() + 1 );
if (NULL != lvColumn.pszText) { VERIFY( m_SettBitsList.InsertColumn( 1, &lvColumn ) != -1 ); strTitle.ReleaseBuffer(); } else { lvColumn.pszText = g_szVoidText; VERIFY( m_SettBitsList.InsertColumn( 1, &lvColumn ) != -1 ); } }
/////////////////////////////////////////////////////////////
VOID CDriverStatusPage::FillTheListSettBits() { //
// N.B.
//
// If you change the first parameter (index - stored in the item's data)
// you need to change the switch statement in IsSettBitEnabled as well
//
AddListItemSettBits( 0, m_RuntimeVerifierData.m_bSpecialPool, IDS_SPECIAL_POOL ); AddListItemSettBits( 1, m_RuntimeVerifierData.m_bPoolTracking, IDS_POOL_TRACKING ); AddListItemSettBits( 2, m_RuntimeVerifierData.m_bForceIrql, IDS_FORCE_IRQL_CHECKING ); AddListItemSettBits( 3, m_RuntimeVerifierData.m_bIo, IDS_IO_VERIFICATION ); AddListItemSettBits( 4, m_RuntimeVerifierData.m_bEnhIo, IDS_ENH_IO_VERIFICATION ); AddListItemSettBits( 5, m_RuntimeVerifierData.m_bDeadlockDetect, IDS_DEADLOCK_DETECTION ); AddListItemSettBits( 6, m_RuntimeVerifierData.m_bDMAVerif, IDS_DMA_CHECHKING ); AddListItemSettBits( 7, m_RuntimeVerifierData.m_bLowRes, IDS_LOW_RESOURCE_SIMULATION ); }
/////////////////////////////////////////////////////////////
VOID CDriverStatusPage::RefreshListSettBits() { INT nListItems; INT nCrtListItem; INT_PTR nCrtVerifierBit; BOOL bEnabled; nListItems = m_SettBitsList.GetItemCount();
for( nCrtListItem = 0; nCrtListItem < nListItems; nCrtListItem += 1 ) { nCrtVerifierBit = m_SettBitsList.GetItemData( nCrtListItem );
bEnabled = IsSettBitEnabled( nCrtVerifierBit );
UpdateStatusColumnSettBits( nCrtListItem, bEnabled ); } }
/////////////////////////////////////////////////////////////////////////////
BOOL CDriverStatusPage::SettbitsGetBitName( LPARAM lItemData, TCHAR *szBitName, ULONG uBitNameBufferLen ) { INT nItemIndex; BOOL bResult; LVFINDINFO FindInfo; LVITEM lvItem;
bResult = FALSE;
ZeroMemory( &FindInfo, sizeof( FindInfo ) ); FindInfo.flags = LVFI_PARAM; FindInfo.lParam = lItemData;
nItemIndex = m_SettBitsList.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 = 1; lvItem.pszText = szBitName; lvItem.cchTextMax = uBitNameBufferLen;
bResult = m_SettBitsList.GetItem( &lvItem ); ASSERT( bResult ); }
return bResult; }
/////////////////////////////////////////////////////////////////////////////
BOOL CDriverStatusPage::IsSettBitEnabled( INT_PTR nBitIndex ) { BOOL bEnabled;
//
// N.B.
//
// If you change this switch statement you need to change FillTheListSettBits as well
//
switch( nBitIndex ) { case 0: bEnabled = m_RuntimeVerifierData.m_bSpecialPool; break;
case 1: bEnabled = m_RuntimeVerifierData.m_bPoolTracking; break;
case 2: bEnabled = m_RuntimeVerifierData.m_bForceIrql; break;
case 3: bEnabled = m_RuntimeVerifierData.m_bIo; break;
case 4: bEnabled = m_RuntimeVerifierData.m_bEnhIo; break;
case 5: bEnabled = m_RuntimeVerifierData.m_bDeadlockDetect; break;
case 6: bEnabled = m_RuntimeVerifierData.m_bDMAVerif; break;
case 7: bEnabled = m_RuntimeVerifierData.m_bLowRes; break;
default: //
// Oops, how did we get here ?!?
//
ASSERT( FALSE );
bEnabled = FALSE;
break; }
return bEnabled; }
/////////////////////////////////////////////////////////////////////////////
VOID CDriverStatusPage::AddListItemSettBits( INT nItemData, BOOL bEnabled, ULONG uIdResourceString ) { INT nActualIndex; LVITEM lvItem; CString strText;
ZeroMemory( &lvItem, sizeof( lvItem ) );
//
// LVITEM's member pszText is not a const pointer
// so we need to GetBuffer here :-(
//
//
// Sub-item 0 - enabled/diabled
//
if( FALSE == bEnabled ) { VERIFY( strText.LoadString( IDS_NO ) ); } else { VERIFY( strText.LoadString( IDS_YES ) ); }
lvItem.mask = LVIF_TEXT | LVIF_PARAM; lvItem.lParam = nItemData; lvItem.iItem = m_SettBitsList.GetItemCount();
lvItem.pszText = strText.GetBuffer( strText.GetLength() + 1 );
if (NULL != lvItem.pszText) { nActualIndex = m_SettBitsList.InsertItem( &lvItem ); strText.ReleaseBuffer(); } else { lvItem.pszText = g_szVoidText; nActualIndex = m_SettBitsList.InsertItem( &lvItem ); }
if( nActualIndex < 0 ) { //
// Could not add an item in the list - give up
//
goto Done; }
//
// Sub-item 1 - feature name
//
VERIFY( strText.LoadString( uIdResourceString ) );
lvItem.pszText = strText.GetBuffer( strText.GetLength() + 1 ); if( NULL == lvItem.pszText ) { goto Done; }
lvItem.mask = LVIF_TEXT; lvItem.iItem = nActualIndex; lvItem.iSubItem = 1; VERIFY( m_SettBitsList.SetItem( &lvItem ) );
strText.ReleaseBuffer();
Done: //
// All done
//
NOTHING; }
/////////////////////////////////////////////////////////////
VOID CDriverStatusPage::UpdateStatusColumnSettBits( INT nItemIndex, BOOL bEnabled ) { LVITEM lvItem; CString strText;
ASSERT( nItemIndex < m_SettBitsList.GetItemCount() );
if( FALSE == bEnabled ) { VERIFY( strText.LoadString( IDS_NO ) ); } else { VERIFY( strText.LoadString( IDS_YES ) ); }
ZeroMemory( &lvItem, sizeof( lvItem ) ); lvItem.mask = LVIF_TEXT; lvItem.iItem = nItemIndex; lvItem.iSubItem = 0; lvItem.pszText = strText.GetBuffer( strText.GetLength() + 1 );
if (NULL != lvItem.pszText) { VERIFY( m_SettBitsList.SetItem( &lvItem ) ); strText.ReleaseBuffer(); } else { lvItem.pszText = g_szVoidText; VERIFY( m_SettBitsList.SetItem( &lvItem ) ); } }
/////////////////////////////////////////////////////////////
int CALLBACK CDriverStatusPage::SettbitsNameCmpFunc( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { int nCmpRez = 0; BOOL bSuccess; TCHAR szBitName1[ _MAX_PATH ]; TCHAR szBitName2[ _MAX_PATH ];
CDriverStatusPage *pThis = (CDriverStatusPage *)lParamSort; ASSERT_VALID( pThis );
//
// Get the first bit name
//
bSuccess = pThis->SettbitsGetBitName( lParam1, szBitName1, ARRAY_LENGTH( szBitName1 ) );
if( FALSE == bSuccess ) { goto Done; }
//
// Get the second bit name
//
bSuccess = pThis->SettbitsGetBitName( lParam2, szBitName2, ARRAY_LENGTH( szBitName2 ) );
if( FALSE == bSuccess ) { goto Done; }
//
// Compare the names
//
nCmpRez = _tcsicmp( szBitName1, szBitName2 ); if( FALSE != pThis->m_bAscendSortNameBits ) { nCmpRez *= -1; }
Done:
return nCmpRez; }
/////////////////////////////////////////////////////////////
int CALLBACK CDriverStatusPage::SettbitsEnabledCmpFunc( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { int nCmpRez = 0; BOOL bEnabled1; BOOL bEnabled2;
CDriverStatusPage *pThis = (CDriverStatusPage *)lParamSort; ASSERT_VALID( pThis );
bEnabled1 = pThis->IsSettBitEnabled( (INT) lParam1 ); bEnabled2 = pThis->IsSettBitEnabled( (INT) lParam2 );
if( bEnabled1 == bEnabled2 ) { nCmpRez = 0; } else { if( FALSE == bEnabled1 ) { nCmpRez = -1; } else { nCmpRez = 1; } }
if( FALSE != pThis->m_bAscendSortEnabledBits ) { nCmpRez *= -1; }
return nCmpRez; }
/////////////////////////////////////////////////////////////
//
// Other methods
//
/////////////////////////////////////////////////////////////
VOID CDriverStatusPage::SortTheListDrivers() { if( 0 != m_nSortColumnIndexDrv ) { //
// Sort by status
//
m_DriversList.SortItems( DrvStatusCmpFunc, (LPARAM)this ); } else { //
// Sort by driver name
//
m_DriversList.SortItems( DrvNameCmpFunc, (LPARAM)this ); } }
/////////////////////////////////////////////////////////////
VOID CDriverStatusPage::SortTheListSettBits() { if( 0 != m_nSortColumnIndexSettbits ) { //
// Sort by bit name
//
m_SettBitsList.SortItems( SettbitsNameCmpFunc, (LPARAM)this ); } else { //
// Sort by enabled/disabled
//
m_SettBitsList.SortItems( SettbitsEnabledCmpFunc, (LPARAM)this ); } }
/////////////////////////////////////////////////////////////
// CDriverStatusPage message handlers
BOOL CDriverStatusPage::OnInitDialog() { CPropertyPage::OnInitDialog();
m_bTimerBlocked = FALSE;
//
// Setup the settings bits list
//
m_SettBitsList.SetExtendedStyle( LVS_EX_FULLROWSELECT | m_SettBitsList.GetExtendedStyle() );
m_SettBitsList.SetBkColor( ::GetSysColor( COLOR_3DFACE ) ); m_SettBitsList.SetTextBkColor( ::GetSysColor( COLOR_3DFACE ) );
SetupListHeaderSettBits(); FillTheListSettBits(); //SortTheListSettBits();
//
// Setup the drivers list
//
m_DriversList.SetExtendedStyle( LVS_EX_FULLROWSELECT | m_DriversList.GetExtendedStyle() );
m_DriversList.SetBkColor( ::GetSysColor( COLOR_3DFACE ) ); m_DriversList.SetTextBkColor( ::GetSysColor( COLOR_3DFACE ) );
SetupListHeaderDrivers(); FillTheListDrivers(); SortTheListDrivers();
VrfSetWindowText( m_NextDescription, IDS_CRTSTAT_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 CDriverStatusPage::OnColumnclickCrtstatDriversList(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if( 0 != pNMListView->iSubItem ) { //
// Clicked on the status column
//
if( m_nSortColumnIndexDrv == pNMListView->iSubItem ) { //
// Change the current ascend/descend order for this column
//
m_bAscendDrvStatusSort = !m_bAscendDrvStatusSort; } } else { //
// Clicked on the driver name column
//
if( m_nSortColumnIndexDrv == pNMListView->iSubItem ) { //
// Change the current ascend/descend order for this column
//
m_bAscendDrvNameSort = !m_bAscendDrvNameSort; } }
m_nSortColumnIndexDrv = pNMListView->iSubItem;
SortTheListDrivers();
*pResult = 0; }
/////////////////////////////////////////////////////////////
VOID CDriverStatusPage::OnTimer(UINT nIDEvent) { if( m_bTimerBlocked != TRUE && nIDEvent == REFRESH_TIMER_ID ) { ASSERT_VALID( m_pParentSheet );
if( m_pParentSheet->GetActivePage() == this ) { //
// Refresh the displayed data
//
RefreshInfo(); } }
CPropertyPage::OnTimer(nIDEvent); }
/////////////////////////////////////////////////////////////////////////////
BOOL CDriverStatusPage::OnSetActive() { ASSERT_VALID( m_pParentSheet );
m_pParentSheet->SetWizardButtons( PSWIZB_BACK | PSWIZB_NEXT ); return CVerifierPropertyPage::OnSetActive(); }
/////////////////////////////////////////////////////////////////////////////
LRESULT CDriverStatusPage::OnWizardNext() { GoingToNextPageNotify( IDD_GLOBAL_COUNTERS_PAGE );
return IDD_GLOBAL_COUNTERS_PAGE; }
/////////////////////////////////////////////////////////////////////////////
void CDriverStatusPage::OnChsettButton() { CVolatileBitsDlg dlg; if( IDOK == dlg.DoModal() ) { RefreshInfo(); } }
/////////////////////////////////////////////////////////////////////////////
#define VRF_MAX_CHARS_FOR_OPEN 4096
void CDriverStatusPage::OnAdddrvButton() { POSITION pos; BOOL bEnabledSome = FALSE; DWORD dwRetValue; DWORD dwOldMaxFileName = 0; DWORD dwErrorCode; int nFileNameStartIndex; INT_PTR nResult; TCHAR szDriversDir[ _MAX_PATH ]; TCHAR szAppTitle[ _MAX_PATH ]; TCHAR *szFilesBuffer = NULL; TCHAR *szOldFilesBuffer = NULL; CString strPathName; CString strFileName;
CFileDialog fileDlg( TRUE, // open file
_T( "sys" ), // default extension
NULL, // no initial file name
OFN_ALLOWMULTISELECT | // multiple selection
OFN_HIDEREADONLY | // hide the "open read-only" checkbox
OFN_NONETWORKBUTTON | // no network button
OFN_NOTESTFILECREATE | // don't test for write protection, a full disk, etc.
OFN_SHAREAWARE, // don't check the existance of file with OpenFile
_T( "Drivers (*.sys)|*.sys||" ) ); // only one filter
//
// check the max length for the returned string
//
if( fileDlg.m_ofn.nMaxFile < VRF_MAX_CHARS_FOR_OPEN ) { //
// allocate a new buffer for the file names
//
szFilesBuffer = new TCHAR[ VRF_MAX_CHARS_FOR_OPEN ];
if (szFilesBuffer == NULL) { VrfErrorResourceFormat( IDS_NOT_ENOUGH_MEMORY ); goto Done; }
szFilesBuffer[ 0 ] = (TCHAR)0;
if( szFilesBuffer != NULL ) { //
// Save the old buffer address and length
//
dwOldMaxFileName = fileDlg.m_ofn.nMaxFile; szOldFilesBuffer = fileDlg.m_ofn.lpstrFile; //
// Set the new buffer address and length
//
fileDlg.m_ofn.lpstrFile = szFilesBuffer; fileDlg.m_ofn.nMaxFile = VRF_MAX_CHARS_FOR_OPEN; } }
//
// Dialog title
//
if( VrfLoadString( IDS_APPTITLE, szAppTitle, ARRAY_LENGTH( szAppTitle ) ) ) { fileDlg.m_ofn.lpstrTitle = szAppTitle; }
//
// We change directory first time we try this to %windir%\system32\drivers
//
dwRetValue = ExpandEnvironmentStrings( _T( "%windir%\\system32\\drivers" ), szDriversDir, ARRAY_LENGTH( szDriversDir ) );
if( dwRetValue > 0 && dwRetValue <= ARRAY_LENGTH( szDriversDir ) ) { fileDlg.m_ofn.lpstrInitialDir = szDriversDir; }
//
// Show the file selection dialog
//
nResult = fileDlg.DoModal();
switch( nResult ) { case IDOK: break;
case IDCANCEL: goto cleanup;
default: dwErrorCode = CommDlgExtendedError();
if( dwErrorCode == FNERR_BUFFERTOOSMALL ) { VrfErrorResourceFormat( IDS_TOO_MANY_FILES_SELECTED ); } else { VrfErrorResourceFormat( IDS_CANNOT_OPEN_FILES, dwErrorCode ); }
goto cleanup; }
//
// Block the timer
//
m_bTimerBlocked = TRUE;
//
// Parse all the selected files and try to enable them for verification
//
pos = fileDlg.GetStartPosition();
while( pos != NULL ) { //
// Get the full path for the next file
//
strPathName = fileDlg.GetNextPathName( pos );
//
// Split only the file name, without the directory
//
nFileNameStartIndex = strPathName.ReverseFind( _T( '\\' ) ); if( nFileNameStartIndex < 0 ) { //
// This shoudn't happen but you never know :-)
//
nFileNameStartIndex = 0; } else { //
// skip the backslash
//
nFileNameStartIndex += 1; }
strFileName = strPathName.Right( strPathName.GetLength() - nFileNameStartIndex );
//
// Try to add this driver to the current verification list
//
if( VrfAddDriverVolatile( strFileName ) ) { bEnabledSome = TRUE; } }
//
// Enable the timer
//
m_bTimerBlocked = FALSE;
//
// Refresh
//
if( bEnabledSome == TRUE ) { RefreshInfo(); }
cleanup: if( szFilesBuffer != NULL ) { fileDlg.m_ofn.nMaxFile = dwOldMaxFileName; fileDlg.m_ofn.lpstrFile = szOldFilesBuffer;
delete [] szFilesBuffer; }
Done:
NOTHING; }
/////////////////////////////////////////////////////////////////////////////
void CDriverStatusPage::OnRemdrvtButton() { INT nItems; INT nCrtItem; INT_PTR nIndexInArray; CRuntimeDriverData *pRuntimeDriverData; BOOL bDisabledSome = FALSE;
//
// Block the timer
//
m_bTimerBlocked = TRUE;
//
// The number of items in the list
//
nItems = m_DriversList.GetItemCount(); //
// Parse all the items, looking for the selected ones.
//
for( nCrtItem = 0; nCrtItem < nItems; nCrtItem += 1 ) { if( m_DriversList.GetItemState( nCrtItem, LVIS_SELECTED ) & LVIS_SELECTED ) { //
// Get the index of the corresponding entry in the array
//
nIndexInArray = (UINT)m_DriversList.GetItemData( nCrtItem );
//
// sanity checks
//
if( nIndexInArray >= m_RuntimeVerifierData.m_RuntimeDriverDataArray.GetSize() ) { ASSERT( FALSE ); continue; }
pRuntimeDriverData = m_RuntimeVerifierData.m_RuntimeDriverDataArray.GetAt( nIndexInArray ); ASSERT_VALID( pRuntimeDriverData );
if( VrfRemoveDriverVolatile( pRuntimeDriverData->m_strName ) ) { bDisabledSome = TRUE; } } }
//
// Enable the timer
//
m_bTimerBlocked = FALSE;
//
// If we disabled some drivers' verification we need to refresh the list
//
if( bDisabledSome ) { RefreshInfo(); } }
/////////////////////////////////////////////////////////////////////////////
void CDriverStatusPage::OnColumnclickCrtstatSettbitsList(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if( 0 != pNMListView->iSubItem ) { //
// Clicked on the bit name column
//
if( m_nSortColumnIndexSettbits == pNMListView->iSubItem ) { //
// Change the current ascend/descend order for this column
//
m_bAscendSortNameBits = !m_bAscendSortNameBits; } } else { //
// Clicked on the enabled/disabled column
//
if( m_nSortColumnIndexSettbits == pNMListView->iSubItem ) { //
// Change the current ascend/descend order for this column
//
m_bAscendSortEnabledBits = !m_bAscendSortEnabledBits; } }
m_nSortColumnIndexSettbits = pNMListView->iSubItem;
SortTheListSettBits();
*pResult = 0; }
/////////////////////////////////////////////////////////////////////////////
LONG CDriverStatusPage::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 CDriverStatusPage::OnContextMenu(CWnd* pWnd, CPoint point) { ::WinHelp( pWnd->m_hWnd, g_szVerifierHelpFile, HELP_CONTEXTMENU, (DWORD_PTR) MyHelpIds ); }
|