You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
772 lines
24 KiB
772 lines
24 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation
|
|
//
|
|
// File: intro.c
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include "newdevp.h"
|
|
#include <dbt.h>
|
|
|
|
|
|
INT_PTR
|
|
InitIntroDlgProc(
|
|
HWND hDlg,
|
|
PNEWDEVWIZ NewDevWiz
|
|
)
|
|
{
|
|
HFONT hfont;
|
|
HDC hDC;
|
|
int FontSize, PtsPixels;
|
|
LOGFONT LogFont;
|
|
|
|
//
|
|
// Create the big bold font
|
|
//
|
|
hDC = GetDC(hDlg);
|
|
|
|
if (hDC) {
|
|
|
|
hfont = (HFONT)SendMessage(GetDlgItem(hDlg, IDC_INTRO_MSG1), WM_GETFONT, 0, 0);
|
|
GetObject(hfont, sizeof(LogFont), &LogFont);
|
|
LogFont.lfWeight = FW_BOLD;
|
|
PtsPixels = GetDeviceCaps(hDC, LOGPIXELSY);
|
|
FontSize = 12;
|
|
LogFont.lfHeight = 0 - (PtsPixels * FontSize / 72);
|
|
|
|
NewDevWiz->hfontTextBigBold = CreateFontIndirect(&LogFont);
|
|
|
|
if (NewDevWiz->hfontTextBigBold ) {
|
|
|
|
SetWindowFont(GetDlgItem(hDlg, IDC_INTRO_MSG1), NewDevWiz->hfontTextBigBold, TRUE);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Create the bold font
|
|
//
|
|
hfont = (HFONT)SendMessage(GetDlgItem(hDlg, IDC_INTRO_MSG3), WM_GETFONT, 0, 0);
|
|
GetObject(hfont, sizeof(LogFont), &LogFont);
|
|
LogFont.lfWeight = FW_BOLD;
|
|
NewDevWiz->hfontTextBold = CreateFontIndirect(&LogFont);
|
|
|
|
if (NewDevWiz->hfontTextBold ) {
|
|
|
|
SetWindowFont(GetDlgItem(hDlg, IDC_INTRO_MSG3), NewDevWiz->hfontTextBold, TRUE);
|
|
}
|
|
|
|
if (NDWTYPE_UPDATE == NewDevWiz->InstallType) {
|
|
|
|
SetDlgText(hDlg, IDC_INTRO_MSG1, IDS_INTRO_MSG1_UPGRADE, IDS_INTRO_MSG1_UPGRADE);
|
|
|
|
} else {
|
|
|
|
//
|
|
// The default text on the Wizard is for the Found New Hardware case, so we only
|
|
// need to set the title text.
|
|
//
|
|
SetDlgText(hDlg, IDC_INTRO_MSG1, IDS_INTRO_MSG1_NEW, IDS_INTRO_MSG1_NEW);
|
|
}
|
|
|
|
//
|
|
// Set the Initial radio button state to do auto-search.
|
|
//
|
|
CheckRadioButton(hDlg,
|
|
IDC_INTRO_SEARCH,
|
|
IDC_INTRO_ADVANCED,
|
|
IDC_INTRO_SEARCH
|
|
);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT_PTR CALLBACK
|
|
IntroDlgProc(
|
|
HWND hDlg,
|
|
UINT wMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
PNEWDEVWIZ NewDevWiz = (PNEWDEVWIZ)GetWindowLongPtr(hDlg, DWLP_USER);
|
|
|
|
if (wMsg == WM_INITDIALOG) {
|
|
|
|
LPPROPSHEETPAGE lppsp = (LPPROPSHEETPAGE)lParam;
|
|
|
|
NewDevWiz = (PNEWDEVWIZ)lppsp->lParam;
|
|
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)NewDevWiz);
|
|
|
|
if (!InitIntroDlgProc(hDlg, NewDevWiz)) {
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
switch (wMsg) {
|
|
|
|
case WM_DESTROY: {
|
|
if (NewDevWiz->hfontTextBigBold ) {
|
|
|
|
DeleteObject(NewDevWiz->hfontTextBigBold);
|
|
NewDevWiz->hfontTextBigBold = NULL;
|
|
}
|
|
|
|
if (NewDevWiz->hfontTextBold ) {
|
|
|
|
DeleteObject(NewDevWiz->hfontTextBold);
|
|
NewDevWiz->hfontTextBold = NULL;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case WM_NOTIFY:
|
|
|
|
switch (((NMHDR FAR *)lParam)->code) {
|
|
|
|
case PSN_SETACTIVE:
|
|
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT);
|
|
NewDevWiz->PrevPage = IDD_NEWDEVWIZ_INTRO;
|
|
SetDriverDescription(hDlg, IDC_INTRO_DRVDESC, NewDevWiz);
|
|
|
|
if (NewDevWiz->InstallType == NDWTYPE_FOUNDNEW) {
|
|
SetTimer(hDlg, INSTALL_COMPLETE_CHECK_TIMERID, INSTALL_COMPLETE_CHECK_TIMEOUT, NULL);
|
|
}
|
|
break;
|
|
|
|
case PSN_RESET:
|
|
KillTimer(hDlg, INSTALL_COMPLETE_CHECK_TIMERID);
|
|
break;
|
|
|
|
case PSN_WIZNEXT:
|
|
NewDevWiz->EnterFrom = IDD_NEWDEVWIZ_INTRO;
|
|
|
|
if (IsDlgButtonChecked(hDlg, IDC_INTRO_SEARCH)) {
|
|
|
|
//
|
|
// Set the search flags to search the following places automatically:
|
|
// - default INF search path
|
|
// - Windows Update, if we are connected to the Internet
|
|
// - CD-ROM drives
|
|
// - Floppy drives
|
|
//
|
|
NewDevWiz->SearchOptions = (SEARCH_CURRENTDRIVER |
|
|
SEARCH_DEFAULT |
|
|
SEARCH_FLOPPY |
|
|
SEARCH_CDROM |
|
|
SEARCH_INET_IF_CONNECTED
|
|
);
|
|
|
|
SetDlgMsgResult(hDlg, wMsg, IDD_NEWDEVWIZ_SEARCHING);
|
|
|
|
} else {
|
|
|
|
SetDlgMsgResult(hDlg, wMsg, IDD_NEWDEVWIZ_ADVANCEDSEARCH);
|
|
}
|
|
KillTimer(hDlg, INSTALL_COMPLETE_CHECK_TIMERID);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_DEVICECHANGE:
|
|
if ((wParam == DBT_DEVICEARRIVAL) &&
|
|
(((PDEV_BROADCAST_VOLUME)lParam)->dbcv_devicetype == DBT_DEVTYP_VOLUME) &&
|
|
(((PDEV_BROADCAST_VOLUME)lParam)->dbcv_flags & DBTF_MEDIA) &&
|
|
(IsDlgButtonChecked(hDlg, IDC_INTRO_SEARCH))) {
|
|
|
|
PropSheet_PressButton(GetParent(hDlg), PSBTN_NEXT);
|
|
}
|
|
break;
|
|
|
|
case WM_TIMER:
|
|
if (INSTALL_COMPLETE_CHECK_TIMERID == wParam) {
|
|
if (IsInstallComplete(NewDevWiz->hDeviceInfo, &NewDevWiz->DeviceInfoData)) {
|
|
PropSheet_PressButton(GetParent(hDlg), PSBTN_CANCEL);
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return(FALSE);
|
|
}
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
INT_PTR
|
|
FinishInstallInitIntroDlgProc(
|
|
HWND hDlg,
|
|
PNEWDEVWIZ NewDevWiz
|
|
)
|
|
{
|
|
HFONT hfont;
|
|
HDC hDC;
|
|
int FontSize, PtsPixels;
|
|
LOGFONT LogFont;
|
|
|
|
//
|
|
// Create the big bold font
|
|
//
|
|
hDC = GetDC(hDlg);
|
|
|
|
if (hDC) {
|
|
|
|
hfont = (HFONT)SendMessage(GetDlgItem(hDlg, IDC_INTRO_MSG1), WM_GETFONT, 0, 0);
|
|
GetObject(hfont, sizeof(LogFont), &LogFont);
|
|
LogFont.lfWeight = FW_BOLD;
|
|
PtsPixels = GetDeviceCaps(hDC, LOGPIXELSY);
|
|
FontSize = 12;
|
|
LogFont.lfHeight = 0 - (PtsPixels * FontSize / 72);
|
|
|
|
NewDevWiz->hfontTextBigBold = CreateFontIndirect(&LogFont);
|
|
|
|
if (NewDevWiz->hfontTextBigBold ) {
|
|
|
|
SetWindowFont(GetDlgItem(hDlg, IDC_INTRO_MSG1), NewDevWiz->hfontTextBigBold, TRUE);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Create the bold font
|
|
//
|
|
hfont = (HFONT)SendMessage(GetDlgItem(hDlg, IDC_INTRO_MSG3), WM_GETFONT, 0, 0);
|
|
GetObject(hfont, sizeof(LogFont), &LogFont);
|
|
LogFont.lfWeight = FW_BOLD;
|
|
NewDevWiz->hfontTextBold = CreateFontIndirect(&LogFont);
|
|
|
|
if (NewDevWiz->hfontTextBold ) {
|
|
|
|
SetWindowFont(GetDlgItem(hDlg, IDC_INTRO_MSG3), NewDevWiz->hfontTextBold, TRUE);
|
|
}
|
|
|
|
if (NDWTYPE_UPDATE == NewDevWiz->InstallType) {
|
|
|
|
SetDlgText(hDlg, IDC_INTRO_MSG1, IDS_INTRO_MSG1_UPGRADE, IDS_INTRO_MSG1_UPGRADE);
|
|
|
|
} else {
|
|
|
|
//
|
|
// The default text on the Wizard is for the Found New Hardware case, so we only
|
|
// need to set the title text.
|
|
//
|
|
SetDlgText(hDlg, IDC_INTRO_MSG1, IDS_INTRO_MSG1_NEW, IDS_INTRO_MSG1_NEW);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT_PTR CALLBACK
|
|
FinishInstallIntroDlgProc(
|
|
HWND hDlg,
|
|
UINT wMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
PNEWDEVWIZ NewDevWiz = (PNEWDEVWIZ)GetWindowLongPtr(hDlg, DWLP_USER);
|
|
HICON hicon;
|
|
|
|
UNREFERENCED_PARAMETER(wParam);
|
|
|
|
if (wMsg == WM_INITDIALOG) {
|
|
|
|
LPPROPSHEETPAGE lppsp = (LPPROPSHEETPAGE)lParam;
|
|
|
|
NewDevWiz = (PNEWDEVWIZ)lppsp->lParam;
|
|
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)NewDevWiz);
|
|
|
|
if (!InitIntroDlgProc(hDlg, NewDevWiz)) {
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
switch (wMsg) {
|
|
|
|
case WM_DESTROY: {
|
|
if (NewDevWiz->hfontTextBigBold ) {
|
|
|
|
DeleteObject(NewDevWiz->hfontTextBigBold);
|
|
NewDevWiz->hfontTextBigBold = NULL;
|
|
}
|
|
|
|
if (NewDevWiz->hfontTextBold ) {
|
|
|
|
DeleteObject(NewDevWiz->hfontTextBold);
|
|
NewDevWiz->hfontTextBold = NULL;
|
|
}
|
|
|
|
hicon = (HICON)SendDlgItemMessage(hDlg, IDC_CLASSICON, STM_GETICON, 0, 0);
|
|
if (hicon) {
|
|
|
|
DestroyIcon(hicon);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case WM_NOTIFY:
|
|
|
|
switch (((NMHDR FAR *)lParam)->code) {
|
|
|
|
case PSN_SETACTIVE:
|
|
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT);
|
|
NewDevWiz->PrevPage = IDD_NEWDEVWIZ_INTRO;
|
|
SetDriverDescription(hDlg, IDC_INTRO_DRVDESC, NewDevWiz);
|
|
if (SetupDiLoadClassIcon(NewDevWiz->ClassGuidSelected, &hicon, NULL)) {
|
|
hicon = (HICON)SendDlgItemMessage(hDlg, IDC_CLASSICON, STM_SETICON, (WPARAM)hicon, 0L);
|
|
if (hicon) {
|
|
DestroyIcon(hicon);
|
|
}
|
|
}
|
|
|
|
//
|
|
// We also need to set the title for the wizard since we are the first wizard
|
|
// page.
|
|
//
|
|
PropSheet_SetTitle(GetParent(hDlg),
|
|
0,
|
|
(NewDevWiz->InstallType == NDWTYPE_FOUNDNEW) ?
|
|
MAKEINTRESOURCE(IDS_FOUNDDEVICE) :
|
|
MAKEINTRESOURCE(IDS_UPDATEDEVICE)
|
|
);
|
|
|
|
break;
|
|
|
|
case PSN_RESET:
|
|
break;
|
|
|
|
case PSN_WIZNEXT:
|
|
break;
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
return(FALSE);
|
|
}
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
int CALLBACK
|
|
BrowseCallbackProc(
|
|
HWND hwnd,
|
|
UINT uMsg,
|
|
LPARAM lParam,
|
|
LPARAM lpData
|
|
)
|
|
{
|
|
switch (uMsg) {
|
|
|
|
case BFFM_INITIALIZED:
|
|
SendMessage(hwnd, BFFM_SETSELECTION, (WPARAM)TRUE, lpData);
|
|
break;
|
|
|
|
case BFFM_SELCHANGED: {
|
|
TCHAR CurrentPath[MAX_PATH];
|
|
|
|
if (lParam &&
|
|
SHGetPathFromIDList((LPITEMIDLIST)lParam, CurrentPath) &&
|
|
pSetupConcatenatePaths(CurrentPath, TEXT("*.INF"), MAX_PATH, NULL)) {
|
|
|
|
SendMessage(hwnd, BFFM_ENABLEOK, 0, (LPARAM)FileExists(CurrentPath, NULL));
|
|
} else {
|
|
//
|
|
// We couldn't get the directory path from shell, or the directory
|
|
// won't fit into our CurrentPath buffer, so gray out the OK
|
|
// button since the directory isn't valid.
|
|
//
|
|
SendMessage(hwnd, BFFM_ENABLEOK, 0, (LPARAM)FALSE);
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
VOID
|
|
DoBrowse(
|
|
HWND hDlg
|
|
)
|
|
{
|
|
BROWSEINFO bi;
|
|
TCHAR CurrentLocation[MAX_PATH];
|
|
TCHAR Title[MAX_PATH];
|
|
LPITEMIDLIST pidl;
|
|
|
|
ZeroMemory(&bi, sizeof(bi));
|
|
|
|
//
|
|
// Get the current directory path in the location combo control to pass to
|
|
// the browse API so it can use that as it's starting point. If there is
|
|
// too much text in the locaion combo then just pass in the empty string
|
|
// as the starting point to the browse control.
|
|
//
|
|
if (GetWindowTextLength(GetWindow(hDlg, IDC_ADVANCED_LOCATION_COMBO)) < SIZECHARS(CurrentLocation)) {
|
|
GetDlgItemText(hDlg,
|
|
IDC_ADVANCED_LOCATION_COMBO,
|
|
CurrentLocation,
|
|
SIZECHARS(CurrentLocation)
|
|
);
|
|
} else {
|
|
StringCchCopy(CurrentLocation, SIZECHARS(CurrentLocation), TEXT(""));
|
|
}
|
|
|
|
if (!LoadString(hNewDev, IDS_BROWSE_TITLE, Title, SIZECHARS(Title))) {
|
|
|
|
Title[0] = TEXT('0');
|
|
}
|
|
|
|
bi.hwndOwner = hDlg;
|
|
bi.pidlRoot = NULL;
|
|
bi.pszDisplayName = NULL;
|
|
bi.lpszTitle = Title;
|
|
bi.ulFlags = BIF_NEWDIALOGSTYLE |
|
|
BIF_RETURNONLYFSDIRS |
|
|
BIF_RETURNFSANCESTORS |
|
|
BIF_STATUSTEXT |
|
|
BIF_NONEWFOLDERBUTTON |
|
|
BIF_UAHINT;
|
|
bi.lpfn = BrowseCallbackProc;
|
|
bi.lParam = (LPARAM)CurrentLocation;
|
|
|
|
pidl = SHBrowseForFolder(&bi);
|
|
|
|
if (pidl && SHGetPathFromIDList(pidl, CurrentLocation)) {
|
|
|
|
SetDlgItemText(hDlg,
|
|
IDC_ADVANCED_LOCATION_COMBO,
|
|
CurrentLocation
|
|
);
|
|
}
|
|
}
|
|
|
|
INT_PTR
|
|
InitAdvancedSearchDlgProc(
|
|
HWND hDlg
|
|
)
|
|
{
|
|
PTSTR *PathList;
|
|
UINT PathCount;
|
|
INT i;
|
|
DWORD SearchOptions;
|
|
|
|
//
|
|
// Set the Initial radio button state to do auto-search.
|
|
//
|
|
CheckRadioButton(hDlg,
|
|
IDC_ADVANCED_SEARCH,
|
|
IDC_ADVANCED_LIST,
|
|
IDC_ADVANCED_SEARCH
|
|
);
|
|
|
|
SearchOptions = GetSearchOptions();
|
|
|
|
if ((SearchOptions & SEARCH_FLOPPY) ||
|
|
(SearchOptions & SEARCH_CDROM)) {
|
|
|
|
CheckDlgButton(hDlg, IDC_ADVANCED_REMOVABLEMEDIA, BST_CHECKED);
|
|
}
|
|
|
|
if (SearchOptions & SEARCH_DIRECTORY) {
|
|
|
|
CheckDlgButton(hDlg, IDC_ADVANCED_LOCATION, BST_CHECKED);
|
|
}
|
|
|
|
//
|
|
// Fill in the paths in the combo box
|
|
//
|
|
if (SetupQuerySourceList(0, &PathList, &PathCount)) {
|
|
|
|
for (i=0; i<(int)PathCount; i++) {
|
|
|
|
SendMessage(GetDlgItem(hDlg, IDC_ADVANCED_LOCATION_COMBO),
|
|
CB_ADDSTRING,
|
|
0,
|
|
(LPARAM)PathList[i]
|
|
);
|
|
}
|
|
|
|
SetupFreeSourceList(&PathList, PathCount);
|
|
}
|
|
|
|
//
|
|
// Disable the search combo box and browse button by default.
|
|
//
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADVANCED_LOCATION_COMBO), (SearchOptions & SEARCH_DIRECTORY));
|
|
EnableWindow(GetDlgItem(hDlg, IDC_BROWSE), (SearchOptions & SEARCH_DIRECTORY));
|
|
|
|
//
|
|
// Limit the text in the edit control to MAX_PATH characters, select
|
|
// the first item and set up the autocomplet for directories.
|
|
//
|
|
SendMessage(GetDlgItem(hDlg, IDC_ADVANCED_LOCATION_COMBO), CB_LIMITTEXT, MAX_PATH, 0);
|
|
SendMessage(GetDlgItem(hDlg, IDC_ADVANCED_LOCATION_COMBO), CB_SETCURSEL, 0, 0);
|
|
SHAutoComplete(GetWindow(GetDlgItem(hDlg, IDC_ADVANCED_LOCATION_COMBO), GW_CHILD), SHACF_FILESYS_DIRS);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT_PTR CALLBACK
|
|
AdvancedSearchDlgProc(
|
|
HWND hDlg,
|
|
UINT wMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
PNEWDEVWIZ NewDevWiz = (PNEWDEVWIZ)GetWindowLongPtr(hDlg, DWLP_USER);
|
|
|
|
if (wMsg == WM_INITDIALOG) {
|
|
|
|
LPPROPSHEETPAGE lppsp = (LPPROPSHEETPAGE)lParam;
|
|
|
|
NewDevWiz = (PNEWDEVWIZ)lppsp->lParam;
|
|
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)NewDevWiz);
|
|
|
|
if (!InitAdvancedSearchDlgProc(hDlg)) {
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
switch (wMsg) {
|
|
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam)) {
|
|
|
|
case IDC_ADVANCED_SEARCH:
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADVANCED_REMOVABLEMEDIA), TRUE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADVANCED_LOCATION), TRUE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADVANCED_LOCATION_COMBO),
|
|
IsDlgButtonChecked(hDlg, IDC_ADVANCED_LOCATION));
|
|
EnableWindow(GetDlgItem(hDlg, IDC_BROWSE),
|
|
IsDlgButtonChecked(hDlg, IDC_ADVANCED_LOCATION));
|
|
break;
|
|
|
|
case IDC_ADVANCED_LIST:
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADVANCED_REMOVABLEMEDIA), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADVANCED_LOCATION), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADVANCED_LOCATION_COMBO), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_BROWSE), FALSE);
|
|
break;
|
|
|
|
case IDC_ADVANCED_LOCATION:
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADVANCED_LOCATION_COMBO),
|
|
IsDlgButtonChecked(hDlg, IDC_ADVANCED_LOCATION));
|
|
EnableWindow(GetDlgItem(hDlg, IDC_BROWSE),
|
|
IsDlgButtonChecked(hDlg, IDC_ADVANCED_LOCATION));
|
|
break;
|
|
|
|
case IDC_BROWSE:
|
|
if (HIWORD(wParam) == BN_CLICKED) {
|
|
|
|
DoBrowse(hDlg);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
|
|
switch (((NMHDR FAR *)lParam)->code) {
|
|
|
|
case PSN_SETACTIVE:
|
|
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
|
|
NewDevWiz->PrevPage = IDD_NEWDEVWIZ_ADVANCEDSEARCH;
|
|
if (NewDevWiz->InstallType == NDWTYPE_FOUNDNEW) {
|
|
SetTimer(hDlg, INSTALL_COMPLETE_CHECK_TIMERID, INSTALL_COMPLETE_CHECK_TIMEOUT, NULL);
|
|
}
|
|
break;
|
|
|
|
case PSN_RESET:
|
|
KillTimer(hDlg, INSTALL_COMPLETE_CHECK_TIMERID);
|
|
break;
|
|
|
|
case PSN_WIZNEXT:
|
|
NewDevWiz->EnterFrom = IDD_NEWDEVWIZ_ADVANCEDSEARCH;
|
|
KillTimer(hDlg, INSTALL_COMPLETE_CHECK_TIMERID);
|
|
|
|
if (IsDlgButtonChecked(hDlg, IDC_ADVANCED_SEARCH)) {
|
|
|
|
NewDevWiz->SearchOptions = SEARCH_CURRENTDRIVER |
|
|
SEARCH_DEFAULT |
|
|
SEARCH_INET_IF_CONNECTED;
|
|
|
|
if (IsDlgButtonChecked(hDlg, IDC_ADVANCED_REMOVABLEMEDIA)) {
|
|
|
|
NewDevWiz->SearchOptions |= (SEARCH_FLOPPY | SEARCH_CDROM);
|
|
}
|
|
|
|
if (IsDlgButtonChecked(hDlg, IDC_ADVANCED_LOCATION)) {
|
|
|
|
TCHAR TempPath[MAX_PATH];
|
|
TCHAR MessageTitle[MAX_PATH];
|
|
TCHAR MessageText[MAX_PATH*2];
|
|
BOOL bPathIsGood = TRUE;
|
|
|
|
if ((GetWindowTextLength(GetWindow(hDlg, IDC_ADVANCED_LOCATION_COMBO)) < SIZECHARS(NewDevWiz->BrowsePath)) &&
|
|
GetDlgItemText(hDlg,
|
|
IDC_ADVANCED_LOCATION_COMBO,
|
|
NewDevWiz->BrowsePath,
|
|
SIZECHARS(NewDevWiz->BrowsePath)
|
|
)) {
|
|
|
|
//
|
|
// We have a path, now lets verify it. We will verify
|
|
// both the path, and verify that there is at least
|
|
// one INF file in that location. If either of these
|
|
// aren't true then we will display an warning to the
|
|
// user and remain on this page.
|
|
//
|
|
MessageTitle[0] = TEXT('\0');
|
|
MessageText[0] = TEXT('\0');
|
|
|
|
if (SUCCEEDED(StringCchCopy(TempPath, SIZECHARS(TempPath), NewDevWiz->BrowsePath)) ||
|
|
pSetupConcatenatePaths(TempPath, TEXT("*.INF"), MAX_PATH, NULL)) {
|
|
//
|
|
// We will first check if the path exists at all. To do
|
|
// this we need to verify that FindFirstFile fails on
|
|
// the directory, and the directory with *.INF
|
|
// concatonated on the end. The reason for this is that
|
|
// FindFirstFile does not handle root directory paths
|
|
// correctly for some reason so they need to be special
|
|
// cased.
|
|
//
|
|
if (!FileExists(NewDevWiz->BrowsePath, NULL) &&
|
|
!FileExists(TempPath, NULL)) {
|
|
|
|
LoadString(hNewDev,
|
|
IDS_LOCATION_BAD_DIR,
|
|
MessageText,
|
|
SIZECHARS(MessageText));
|
|
|
|
bPathIsGood = FALSE;
|
|
|
|
} else if (!FileExists(TempPath, NULL)) {
|
|
|
|
LoadString(hNewDev,
|
|
IDS_LOCATION_NO_INFS,
|
|
MessageText,
|
|
SIZECHARS(MessageText));
|
|
|
|
bPathIsGood = FALSE;
|
|
}
|
|
} else {
|
|
//
|
|
// The user entered too long of a path
|
|
//
|
|
LoadString(hNewDev,
|
|
IDS_LOCATION_BAD_DIR,
|
|
MessageText,
|
|
SIZECHARS(MessageText));
|
|
|
|
bPathIsGood = FALSE;
|
|
}
|
|
|
|
if (bPathIsGood) {
|
|
|
|
SetupAddToSourceList(SRCLIST_SYSIFADMIN, NewDevWiz->BrowsePath);
|
|
|
|
NewDevWiz->SearchOptions |= SEARCH_DIRECTORY;
|
|
|
|
} else {
|
|
|
|
if (GetWindowText(GetParent(hDlg),
|
|
MessageTitle,
|
|
SIZECHARS(MessageTitle)) &&
|
|
(MessageText[0] != TEXT('\0'))) {
|
|
|
|
MessageBox(hDlg, MessageText, MessageTitle, MB_OK | MB_ICONWARNING);
|
|
SetDlgMsgResult(hDlg, wMsg, -1);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
SetSearchOptions(NewDevWiz->SearchOptions);
|
|
|
|
SetDlgMsgResult(hDlg, wMsg, IDD_NEWDEVWIZ_SEARCHING);
|
|
|
|
} else {
|
|
|
|
ULONG DevNodeStatus;
|
|
ULONG Problem=0;
|
|
SP_DRVINFO_DATA DriverInfoData;
|
|
|
|
//
|
|
// If we have a selected driver,
|
|
// or we know the class and there wasn't a problem installing
|
|
// go into select device
|
|
//
|
|
//
|
|
DriverInfoData.cbSize = sizeof(SP_DRVINFO_DATA);
|
|
if (SetupDiEnumDriverInfo(NewDevWiz->hDeviceInfo,
|
|
&NewDevWiz->DeviceInfoData,
|
|
SPDIT_COMPATDRIVER,
|
|
0,
|
|
&DriverInfoData
|
|
)
|
|
||
|
|
(!IsEqualGUID(&NewDevWiz->DeviceInfoData.ClassGuid,
|
|
&GUID_NULL
|
|
)
|
|
|
|
&&
|
|
CM_Get_DevNode_Status(&DevNodeStatus,
|
|
&Problem,
|
|
NewDevWiz->DeviceInfoData.DevInst,
|
|
0
|
|
) == CR_SUCCESS
|
|
&&
|
|
Problem != CM_PROB_FAILED_INSTALL
|
|
)) {
|
|
|
|
NewDevWiz->ClassGuidSelected = &NewDevWiz->DeviceInfoData.ClassGuid;
|
|
NewDevWiz->EnterInto = IDD_NEWDEVWIZ_SELECTDEVICE;
|
|
SetDlgMsgResult(hDlg, wMsg, IDD_NEWDEVWIZ_SELECTDEVICE);
|
|
break;
|
|
}
|
|
|
|
NewDevWiz->ClassGuidSelected = NULL;
|
|
NewDevWiz->EnterInto = IDD_NEWDEVWIZ_SELECTCLASS;
|
|
SetDlgMsgResult(hDlg, wMsg, IDD_NEWDEVWIZ_SELECTCLASS);
|
|
}
|
|
break;
|
|
|
|
case PSN_WIZBACK:
|
|
KillTimer(hDlg, INSTALL_COMPLETE_CHECK_TIMERID);
|
|
SetDlgMsgResult(hDlg, wMsg, IDD_NEWDEVWIZ_INTRO);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_TIMER:
|
|
if (INSTALL_COMPLETE_CHECK_TIMERID == wParam) {
|
|
if (IsInstallComplete(NewDevWiz->hDeviceInfo, &NewDevWiz->DeviceInfoData)) {
|
|
PropSheet_PressButton(GetParent(hDlg), PSBTN_CANCEL);
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return(FALSE);
|
|
}
|
|
|
|
return(TRUE);
|
|
}
|
|
|