/*++ Copyright (C) 1998-1999 Microsoft Corporation Module Name: tsmisc.cpp Abstract: This module implements Device Manager troubleshooting supporting classes Author: Jason Cobb (jasonc) created Revision History: --*/ #include "devmgr.h" #include "proppage.h" #include "tsmisc.h" #include "tswizard.h" HPROPSHEETPAGE CTSEnableDeviceIntroPage::Create( CDevice* pDevice ) { if (!m_pDevice) { ASSERT(pDevice); m_pDevice = pDevice; m_psp.dwFlags = PSP_DEFAULT | PSP_USETITLE | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; m_psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_TS_ENABLE); m_psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDS_TS_ENABLE_INFO); m_psp.pszTitle = MAKEINTRESOURCE(IDS_TROUBLESHOOTING_NAME); m_psp.lParam = (LPARAM)this; DWORD Problem, Status; if (pDevice->GetStatus(&Status, &Problem)) { m_Problem = Problem; return CPropSheetPage::CreatePage(); } } return NULL; } BOOL CTSEnableDeviceIntroPage::OnWizNext() { try { m_pDevice->EnableDisableDevice(m_hDlg, TRUE); } catch (CMemoryException* e) { e->Delete(); MsgBoxParam(m_hDlg, 0, 0, 0); } return CPropSheetPage::OnWizNext(); } BOOL CTSEnableDeviceIntroPage::OnSetActive() { SetDlgItemText(m_hDlg, IDC_TS_DRVDESC, m_pDevice->GetDisplayName()); HICON hIconNew; hIconNew = m_pDevice->LoadClassIcon(); if (hIconNew) { HICON hIconOld; m_IDCicon = IDC_CLASSICON; // Save for cleanup in OnDestroy. hIconOld = (HICON)SendDlgItemMessage(m_hDlg, IDC_CLASSICON, STM_SETICON, (WPARAM)hIconNew, 0); if (hIconOld) { DestroyIcon(hIconOld); } } PropSheet_SetWizButtons(GetParent(m_hDlg), PSWIZB_NEXT); return CPropSheetPage::OnSetActive(); } HPROPSHEETPAGE CTSEnableDeviceFinishPage::Create( CDevice* pDevice ) { if (!m_pDevice) { ASSERT(pDevice); m_pDevice = pDevice; m_psp.dwFlags = PSP_DEFAULT | PSP_USETITLE | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; m_psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_TS_ENABLE_FINISH); m_psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDS_TS_ENABLE_FINISH_INFO); m_psp.pszTitle = MAKEINTRESOURCE(IDS_TROUBLESHOOTING_NAME); m_psp.lParam = (LPARAM)this; DWORD Problem, Status; if (pDevice->GetStatus(&Status, &Problem)) { m_Problem = Problem; return CPropSheetPage::CreatePage(); } } return NULL; } BOOL CTSEnableDeviceFinishPage::OnWizFinish() { try { if (BST_CHECKED == IsDlgButtonChecked(m_hDlg, IDC_RESTART)) { // // Restart the computer // if (EnablePrivilege((PCTSTR)SE_SHUTDOWN_NAME, TRUE)) { ExitWindowsEx(EWX_REBOOT, 0); } } } catch (CMemoryException* e) { e->Delete(); MsgBoxParam(m_hDlg, 0, 0, 0); } return CPropSheetPage::OnWizNext(); } BOOL CTSEnableDeviceFinishPage::OnSetActive() { DWORD RestartFlags = m_pDevice->m_pMachine->DiGetFlags(*m_pDevice); SetDlgItemText(m_hDlg, IDC_TS_DRVDESC, m_pDevice->GetDisplayName()); HICON hIconNew; hIconNew = m_pDevice->LoadClassIcon(); if (hIconNew) { HICON hIconOld; m_IDCicon = IDC_CLASSICON; // Save for cleanup in OnDestroy. hIconOld = (HICON)SendDlgItemMessage(m_hDlg, IDC_CLASSICON, STM_SETICON, (WPARAM)hIconNew, 0); if (hIconOld) { DestroyIcon(hIconOld); } } // // We need to restart the machine for the enable to take affect // if (RestartFlags & (DI_NEEDRESTART | DI_NEEDREBOOT)) { String strAltText_1; strAltText_1.LoadString(g_hInstance, IDS_TS_ENABLEDEVICE_RESTART); SetDlgItemText(m_hDlg, IDC_TS_ENABLEDEVICE_FINISH_MSG, strAltText_1); ::SendMessage(GetControl(IDC_RESTART), BM_SETCHECK, BST_CHECKED, 0); // // We don't need to restart // } else { DWORD Problem, Status; Problem = Status = 0; m_pDevice->GetStatus(&Status, &Problem); // // The device is still disabled // if (CM_PROB_DISABLED == Problem) { String strAltText_1; strAltText_1.LoadString(g_hInstance, IDS_TS_ENABLEDEVICE_FAIL); SetDlgItemText(m_hDlg, IDC_TS_ENABLEDEVICE_FINISH_MSG, strAltText_1); // // The device has some other problem // } else if (Problem) { String strAltText_1; strAltText_1.LoadString(g_hInstance, IDS_TS_ENABLEDEVICE_PROBLEM); SetDlgItemText(m_hDlg, IDC_TS_ENABLEDEVICE_FINISH_MSG, strAltText_1); // // The device is now working // } else { String strAltText_1; strAltText_1.LoadString(g_hInstance, IDS_TS_ENABLEDEVICE_SUCCESS); SetDlgItemText(m_hDlg, IDC_TS_ENABLEDEVICE_FINISH_MSG, strAltText_1); } ::ShowWindow(GetControl(IDC_RESTART), SW_HIDE); } PropSheet_SetWizButtons(GetParent(m_hDlg), PSWIZB_FINISH); ::EnableWindow(GetDlgItem(GetParent(m_hDlg), IDCANCEL), FALSE); return CPropSheetPage::OnSetActive(); } HPROPSHEETPAGE CTSRestartComputerFinishPage::Create( CDevice* pDevice ) { if (!m_pDevice) { ASSERT(pDevice); m_pDevice = pDevice; m_psp.dwFlags = PSP_DEFAULT | PSP_USETITLE | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; m_psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_TS_RESTART_FINISH); m_psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDS_TS_RESTART_FINISH_INFO); m_psp.pszTitle = MAKEINTRESOURCE(IDS_TROUBLESHOOTING_NAME); m_psp.lParam = (LPARAM)this; DWORD Problem, Status; if (pDevice->GetStatus(&Status, &Problem)) { m_Problem = Problem; return CPropSheetPage::CreatePage(); } } return NULL; } BOOL CTSRestartComputerFinishPage::OnWizFinish() { try { if (BST_CHECKED == IsDlgButtonChecked(m_hDlg, IDC_RESTART)) { // // Restart the computer // if (EnablePrivilege((PCTSTR)SE_SHUTDOWN_NAME, TRUE)) { ExitWindowsEx(EWX_REBOOT, 0); } } } catch (CMemoryException* e) { e->Delete(); MsgBoxParam(m_hDlg, 0, 0, 0); } return CPropSheetPage::OnWizNext(); } BOOL CTSRestartComputerFinishPage::OnSetActive() { SetDlgItemText(m_hDlg, IDC_TS_DRVDESC, m_pDevice->GetDisplayName()); HICON hIconNew; hIconNew = m_pDevice->LoadClassIcon(); if (hIconNew) { HICON hIconOld; m_IDCicon = IDC_CLASSICON; // Save for cleanup in OnDestroy. hIconOld = (HICON)SendDlgItemMessage(m_hDlg, IDC_CLASSICON, STM_SETICON, (WPARAM)hIconNew, 0); if (hIconOld) { DestroyIcon(hIconOld); } } ::SendMessage(GetControl(IDC_RESTART), BM_SETCHECK, BST_CHECKED, 0); PropSheet_SetWizButtons(GetParent(m_hDlg), PSWIZB_FINISH); return CPropSheetPage::OnSetActive(); }