// // Driver Verifier UI // Copyright (c) Microsoft Corporation, 1999 // // // // module: DSetPage.cpp // author: DMihai // created: 11/1/00 // // Description: // #include "stdafx.h" #include "verifier.h" #include "DSetPage.h" #include "VSheet.h" #include "VrfUtil.h" #include "VGlobal.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // // Change this if you add/remove/change order // of radio buttons on this page // #define FIRST_RADIO_BUTTON_ID IDC_DRVSET_NOTSIGNED_RADIO // // Help IDs // static DWORD MyHelpIds[] = { IDC_DRVSET_NOTSIGNED_RADIO, IDH_DV_SelectUnsigned, IDC_DRVSET_OLDVER_RADIO, IDH_DV_SelectOlderversions, IDC_DRVSET_ALLDRV_RADIO, IDH_DV_SelectAll, IDC_DRVSET_NAMESLIST_RADIO, IDH_DV_SelectFromList, 0, 0 }; ///////////////////////////////////////////////////////////////////////////// // CDriverSetPage property page IMPLEMENT_DYNCREATE(CDriverSetPage, CVerifierPropertyPage) CDriverSetPage::CDriverSetPage() : CVerifierPropertyPage( CDriverSetPage::IDD ) { //{{AFX_DATA_INIT(CDriverSetPage) m_nCrtRadio = -1; //}}AFX_DATA_INIT } CDriverSetPage::~CDriverSetPage() { } void CDriverSetPage::DoDataExchange(CDataExchange* pDX) { CVerifierPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDriverSetPage) DDX_Control(pDX, IDC_DRVSET_NEXT_DESCR_STATIC, m_NextDescription); DDX_Radio(pDX, IDC_DRVSET_NOTSIGNED_RADIO, m_nCrtRadio); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDriverSetPage, CVerifierPropertyPage) //{{AFX_MSG_MAP(CDriverSetPage) ON_BN_CLICKED(IDC_DRVSET_ALLDRV_RADIO, OnAlldrvRadio) ON_BN_CLICKED(IDC_DRVSET_NAMESLIST_RADIO, OnNameslistRadio) ON_BN_CLICKED(IDC_DRVSET_NOTSIGNED_RADIO, OnNotsignedRadio) ON_BN_CLICKED(IDC_DRVSET_OLDVER_RADIO, OnOldverRadio) ON_WM_CONTEXTMENU() ON_MESSAGE( WM_HELP, OnHelp ) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // CDriverSetPage message handlers ///////////////////////////////////////////////////////////////////////////// LRESULT CDriverSetPage::OnWizardBack() { // // Kill a possible active worker thread // g_SlowProgressDlg.KillWorkerThread(); return CVerifierPropertyPage::OnWizardBack(); } ///////////////////////////////////////////////////////////////////////////// LRESULT CDriverSetPage::OnWizardNext() { LRESULT lNextPageId; BOOL bHaveDriversToVerify; // // Kill a possible active worker thread // g_SlowProgressDlg.KillWorkerThread(); // // Let's assume we cannot continue // lNextPageId = -1; if( UpdateData() == TRUE ) { if( m_nCrtRadio != IDC_DRVSET_ALLDRV_RADIO - FIRST_RADIO_BUTTON_ID ) { // // Look if we already have loaded the list of drivers // with version information, etc. and if we need it // ASSERT( IDC_DRVSET_ALLDRV_RADIO - FIRST_RADIO_BUTTON_ID != m_nCrtRadio ); if( TRUE != g_NewVerifierSettings.m_DriversSet.m_bDriverDataInitialized ) { if( NULL == g_SlowProgressDlg.m_hWnd ) { // // This is the first time we are showing the // "slow progress" dialog so create it first // g_SlowProgressDlg.Create( CSlowProgressDlg::IDD, AfxGetMainWnd() ); } // // Show the dialog // g_SlowProgressDlg.ShowWindow( SW_SHOW ); // // Start the worker thread to do the work in background // while the initial thread updates the GUI. If the thread ends // successfully it will press our "Next" button at the end, after setting // g_NewVerifierSettings.m_DriversSet.m_bDriverDataInitialized to TRUE // g_SlowProgressDlg.StartWorkerThread( CSlowProgressDlg::LoadDriverDataWorkerThread, IDS_LOADING_DRIVER_INFORMATION ); // // Wait for the "next" button again // goto Done; } } // // We have already loaded information (name, version, etc.) about // the currently loaded drivers if have gotten to this point and // we are not in the "verify all drivers" case. // // // Select the set of drivers corresponding to user's selection // switch( m_nCrtRadio ) { case IDC_DRVSET_NAMESLIST_RADIO - FIRST_RADIO_BUTTON_ID: // // Custom list of drivers // g_NewVerifierSettings.m_DriversSet.m_DriverSetType = CDriversSet::DriversSetCustom; lNextPageId = IDD_SELECT_DRIVERS_PAGE; break; case IDC_DRVSET_OLDVER_RADIO - FIRST_RADIO_BUTTON_ID: // // Drivers compiled for old versions of Windows // // // The list of drivers is ready because we waited the // worker thread to finish up execution - go to the next page // g_NewVerifierSettings.m_DriversSet.m_DriverSetType = CDriversSet::DriversSetOldOs; bHaveDriversToVerify = g_NewVerifierSettings.m_DriversSet.ShouldVerifySomeDrivers(); if( TRUE == bHaveDriversToVerify ) { // // We have at least one old driver to verify // lNextPageId = IDD_CONFIRM_DRIVERS_PAGE; // // Set the title of the driver list confirmation page // ASSERT_VALID( m_pParentSheet ); m_pParentSheet->SetContextStrings( IDS_OLD_DRIVERS_LIST ); } else { // // We don't have any old drivers currently installed // VrfMesssageFromResource( IDS_NO_OLD_DRIVERS_FOUND ); } break; case IDC_DRVSET_NOTSIGNED_RADIO - FIRST_RADIO_BUTTON_ID: // // Not signed drivers // if( FALSE == g_NewVerifierSettings.m_DriversSet.m_bUnsignedDriverDataInitialized ) { // // We should have displayed the "slow progress" dialog // at least once before (when we have loaded the list of drivers) // so we don't even try to create the modeless dialog. // ASSERT( NULL != g_SlowProgressDlg.m_hWnd ); // // Show the dialog though // g_SlowProgressDlg.ShowWindow( SW_SHOW ); // // Start the worker thread to do the work in background // while the initial thread updates the GUI. If the thread ends // successfully it will press our "Next" button at the end, after setting // g_NewVerifierSettings.m_DriversSet.m_bDriverDataInitialized to TRUE // g_SlowProgressDlg.StartWorkerThread( CSlowProgressDlg::SearchUnsignedDriversWorkerThread, IDS_SEARCHING_FOR_UNSIGNED_DRIVERS ); // // Wait for the "next" button again // goto Done; } else { g_NewVerifierSettings.m_DriversSet.m_DriverSetType = CDriversSet::DriversSetNotSigned; bHaveDriversToVerify = g_NewVerifierSettings.m_DriversSet.ShouldVerifySomeDrivers(); if( TRUE == bHaveDriversToVerify ) { // // The list of drivers is ready - go to the next page // lNextPageId = IDD_CONFIRM_DRIVERS_PAGE; // // Set the title of the driver list confirmation page // ASSERT_VALID( m_pParentSheet ); m_pParentSheet->SetContextStrings( IDS_UNSIGNED_DRIVERS_LIST ); } else { // // We don't have any unsigned drivers currently installed // VrfMesssageFromResource( IDS_NO_UNSIGNED_DRIVERS_FOUND ); } } break; case IDC_DRVSET_ALLDRV_RADIO - FIRST_RADIO_BUTTON_ID: // // We can get here only if the disk integrity checking is enabled. // ASSERT( FALSE != g_bShowDiskPropertyPage || FALSE != g_NewVerifierSettings.m_aDiskData.VerifyAnyDisk() ); g_NewVerifierSettings.m_DriversSet.m_DriverSetType = CDriversSet::DriversSetAllDrivers; lNextPageId = IDD_DISK_LIST_PAGE; break; default: ASSERT( FALSE ); break; } } GoingToNextPageNotify( lNextPageId ); Done: return lNextPageId; } ///////////////////////////////////////////////////////////////////////////// BOOL CDriverSetPage::OnWizardFinish() { BOOL bFinish; bFinish = FALSE; if( UpdateData( TRUE ) == TRUE ) { // // If the user has pressed the "Finish" button that // would mean that she selected "all drivers" to be verified // ASSERT( IDC_DRVSET_ALLDRV_RADIO - FIRST_RADIO_BUTTON_ID == m_nCrtRadio ); g_NewVerifierSettings.m_DriversSet.m_DriverSetType = CDriversSet::DriversSetAllDrivers; bFinish = g_NewVerifierSettings.SaveToRegistry(); } CVerifierPropertyPage::OnWizardFinish(); return bFinish; } ///////////////////////////////////////////////////////////////////////////// BOOL CDriverSetPage::OnSetActive() { switch( m_nCrtRadio ) { case IDC_DRVSET_NAMESLIST_RADIO - FIRST_RADIO_BUTTON_ID: VrfSetWindowText( m_NextDescription, IDS_DRVSET_PAGE_NEXT_DESCR_NAMELIST ); m_pParentSheet->SetWizardButtons( PSWIZB_BACK | PSWIZB_NEXT ); break; case IDC_DRVSET_OLDVER_RADIO - FIRST_RADIO_BUTTON_ID: VrfSetWindowText( m_NextDescription, IDS_DRVSET_PAGE_NEXT_DESCR_OLD ); m_pParentSheet->SetWizardButtons( PSWIZB_BACK | PSWIZB_NEXT ); break; case IDC_DRVSET_NOTSIGNED_RADIO - FIRST_RADIO_BUTTON_ID: VrfSetWindowText( m_NextDescription, IDS_DRVSET_PAGE_NEXT_DESCR_UNSIGNED ); m_pParentSheet->SetWizardButtons( PSWIZB_BACK | PSWIZB_NEXT ); break; case IDC_DRVSET_ALLDRV_RADIO - FIRST_RADIO_BUTTON_ID: if( (FALSE == g_bShowDiskPropertyPage) && (FALSE == g_NewVerifierSettings.m_aDiskData.VerifyAnyDisk()) ) { m_pParentSheet->SetWizardButtons( PSWIZB_BACK | PSWIZB_FINISH ); VrfSetWindowText( m_NextDescription, IDS_DRVSET_PAGE_NEXT_DESCR_ALL ); } else { VrfSetWindowText( m_NextDescription, IDS_DRVSET_PAGE_NEXT_DESCR_ALL_HAVEDISKS ); m_pParentSheet->SetWizardButtons( PSWIZB_BACK | PSWIZB_NEXT ); } break; default: ASSERT( FALSE ); break; } return CVerifierPropertyPage::OnSetActive(); } ///////////////////////////////////////////////////////////////////////////// BOOL CDriverSetPage::OnInitDialog() { // // Don't try to reconstruct the current data from the registry // to the GUI because it's too hard. Always start with the // default radio button: unsigned drivers // m_nCrtRadio = IDC_DRVSET_NOTSIGNED_RADIO - FIRST_RADIO_BUTTON_ID; CVerifierPropertyPage::OnInitDialog(); VrfSetWindowText( m_NextDescription, IDS_DRVSET_PAGE_NEXT_DESCR_UNSIGNED ); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } ///////////////////////////////////////////////////////////////////////////// void CDriverSetPage::OnAlldrvRadio() { ASSERT_VALID( m_pParentSheet ); if( FALSE != g_bShowDiskPropertyPage || FALSE != g_NewVerifierSettings.m_aDiskData.VerifyAnyDisk() ) { // // We need to show the next page with the disks to be verified. // m_pParentSheet->SetWizardButtons( PSWIZB_BACK | PSWIZB_NEXT ); VrfSetWindowText( m_NextDescription, IDS_DRVSET_PAGE_NEXT_DESCR_ALL_HAVEDISKS ); } else { // // No disk integrity checking is enabled so this is the last page. // m_pParentSheet->SetWizardButtons( PSWIZB_BACK | PSWIZB_FINISH ); VrfSetWindowText( m_NextDescription, IDS_DRVSET_PAGE_NEXT_DESCR_ALL ); } } void CDriverSetPage::OnNameslistRadio() { ASSERT_VALID( m_pParentSheet ); m_pParentSheet->SetWizardButtons( PSWIZB_BACK | PSWIZB_NEXT ); VrfSetWindowText( m_NextDescription, IDS_DRVSET_PAGE_NEXT_DESCR_NAMELIST ); } void CDriverSetPage::OnNotsignedRadio() { ASSERT_VALID( m_pParentSheet ); m_pParentSheet->SetWizardButtons( PSWIZB_BACK | PSWIZB_NEXT ); VrfSetWindowText( m_NextDescription, IDS_DRVSET_PAGE_NEXT_DESCR_UNSIGNED ); } void CDriverSetPage::OnOldverRadio() { ASSERT_VALID( m_pParentSheet ); m_pParentSheet->SetWizardButtons( PSWIZB_BACK | PSWIZB_NEXT ); VrfSetWindowText( m_NextDescription, IDS_DRVSET_PAGE_NEXT_DESCR_OLD ); } ///////////////////////////////////////////////////////////// void CDriverSetPage::OnCancel() { g_SlowProgressDlg.KillWorkerThread(); CVerifierPropertyPage::OnCancel(); } ///////////////////////////////////////////////////////////// LONG CDriverSetPage::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 CDriverSetPage::OnContextMenu(CWnd* pWnd, CPoint point) { ::WinHelp( pWnd->m_hWnd, g_szVerifierHelpFile, HELP_CONTEXTMENU, (DWORD_PTR) MyHelpIds ); }