windows-nt/Source/XPSP1/NT/base/pnp/newdev/analyze.c
2020-09-26 16:20:57 +08:00

593 lines
16 KiB
C

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: analyze.c
//
//--------------------------------------------------------------------------
#include "newdevp.h"
#include <infstr.h>
INT_PTR CALLBACK
NDW_AnalyzeDlgProc(
HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
HICON hicon;
HWND hwndParentDlg = GetParent(hDlg);
PNEWDEVWIZ NewDevWiz;
PSP_INSTALLWIZARD_DATA InstallWizard;
if (wMsg == WM_INITDIALOG) {
LPPROPSHEETPAGE lppsp = (LPPROPSHEETPAGE)lParam;
NewDevWiz = (PNEWDEVWIZ)lppsp->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)NewDevWiz);
NewDevWiz->AnalyzeResult = 0;
return TRUE;
}
NewDevWiz = (PNEWDEVWIZ)GetWindowLongPtr(hDlg, DWLP_USER);
InstallWizard = &NewDevWiz->InstallDynaWiz;
switch (wMsg) {
case WM_DESTROY:
hicon = (HICON)LOWORD(SendDlgItemMessage(hDlg,IDC_CLASSICON,STM_GETICON,0,0));
if (hicon) {
DestroyIcon(hicon);
}
break;
case WM_NOTIFY:
switch (((NMHDR FAR *)lParam)->code) {
case PSN_SETACTIVE: {
int PrevPage;
DWORD RegisterError = ERROR_SUCCESS;
SP_DRVINFO_DATA DriverInfoData;
PrevPage = NewDevWiz->PrevPage;
NewDevWiz->PrevPage = IDD_NEWDEVWIZ_ANALYZEDEV;
if (PrevPage == IDD_WIZARDEXT_POSTANALYZE) {
//
// We decided not to show the Analyze page so just jump Back
//
PropSheet_PressButton(GetParent(hDlg), PSBTN_BACK);
break;
}
//
// Get info on currently selected device, since this could change
// as the user move back and forth between wizard pages
// we do this on each activate.
//
if (!SetupDiGetSelectedDevice(NewDevWiz->hDeviceInfo,
&NewDevWiz->DeviceInfoData
))
{
RegisterError = GetLastError();
#if DBG
DbgPrint("Add Hardware: AnalyzeDlgProc no selected device %x\n",
RegisterError
);
#endif
}
//
// Set the class Icon
//
if (SetupDiLoadClassIcon(&NewDevWiz->DeviceInfoData.ClassGuid, &hicon, NULL)) {
hicon = (HICON)SendDlgItemMessage(hDlg, IDC_CLASSICON, STM_SETICON, (WPARAM)hicon, 0L);
if (hicon) {
DestroyIcon(hicon);
}
}
SetDriverDescription(hDlg, IDC_NDW_DESCRIPTION, NewDevWiz);
PropSheet_SetWizButtons(hwndParentDlg, PSWIZB_BACK | PSWIZB_NEXT);
//
// need to determine conflict warning.
//
if (RegisterError != ERROR_SUCCESS) {
SetDlgText(hDlg, IDC_NDW_TEXT, IDS_NDW_ANALYZEERR1, IDS_NDW_ANALYZEERR3);
}
else {
SetDlgText(hDlg, IDC_NDW_TEXT, IDS_NDW_STDCFG1, IDS_NDW_STDCFG2);
}
if (InstallWizard->DynamicPageFlags & DYNAWIZ_FLAG_PAGESADDED) {
if (RegisterError == ERROR_SUCCESS ||
!(InstallWizard->DynamicPageFlags & DYNAWIZ_FLAG_ANALYZE_HANDLECONFLICT))
{
SetDlgMsgResult(hDlg, wMsg, IDD_DYNAWIZ_ANALYZE_NEXTPAGE);
}
}
//
// Only show the Analyze page if there was an error registering this device.
//
if (RegisterError == ERROR_SUCCESS) {
PropSheet_PressButton(GetParent(hDlg), PSBTN_NEXT);
}
break;
}
case PSN_WIZBACK:
if (NewDevWiz->WizExtPostAnalyze.hPropSheet) {
PropSheet_RemovePage(hwndParentDlg,
(WPARAM)-1,
NewDevWiz->WizExtPostAnalyze.hPropSheet
);
NewDevWiz->WizExtPostAnalyze.hPropSheet = NULL;
}
SetDlgMsgResult(hDlg, wMsg, IDD_WIZARDEXT_PREANALYZE);
break;
case PSN_WIZNEXT:
//
// Add the PostAnalyze Page and jump to it
//
NewDevWiz->WizExtPostAnalyze.hPropSheet = CreateWizExtPage(IDD_WIZARDEXT_POSTANALYZE,
WizExtPostAnalyzeDlgProc,
NewDevWiz
);
if (NewDevWiz->WizExtPostAnalyze.hPropSheet) {
PropSheet_AddPage(hwndParentDlg, NewDevWiz->WizExtPostAnalyze.hPropSheet);
}
SetDlgMsgResult(hDlg, wMsg, IDD_WIZARDEXT_POSTANALYZE);
break;
}
break;
default:
return(FALSE);
}
return(TRUE);
}
INT_PTR CALLBACK
WizExtPreAnalyzeDlgProc(
HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
HWND hwndParentDlg = GetParent(hDlg);
PNEWDEVWIZ NewDevWiz = (PNEWDEVWIZ )GetWindowLongPtr(hDlg, DWLP_USER);
int PrevPageId;
switch (wMsg) {
case WM_INITDIALOG: {
LPPROPSHEETPAGE lppsp = (LPPROPSHEETPAGE)lParam;
NewDevWiz = (PNEWDEVWIZ )lppsp->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)NewDevWiz);
break;
}
case WM_DESTROY:
break;
case WM_NOTIFY:
switch (((NMHDR FAR *)lParam)->code) {
case PSN_SETACTIVE:
PrevPageId = NewDevWiz->PrevPage;
NewDevWiz->PrevPage = IDD_WIZARDEXT_PREANALYZE;
if (PrevPageId == IDD_WIZARDEXT_SELECT) {
//
// Moving forward on first page
//
//
// if we are not doing the old fashioned DYNAWIZ
// Add ClassWizard Extension pages for preanalyze
//
if ((NewDevWiz->Flags & IDI_FLAG_MANUALINSTALL) &&
!(NewDevWiz->InstallDynaWiz.DynamicPageFlags & DYNAWIZ_FLAG_PAGESADDED))
{
AddClassWizExtPages(hwndParentDlg,
NewDevWiz,
&NewDevWiz->WizExtPreAnalyze.DeviceWizardData,
DIF_NEWDEVICEWIZARD_PREANALYZE,
NULL
);
}
//
// Add the end page, which is PreAnalyze end
//
NewDevWiz->WizExtPreAnalyze.hPropSheetEnd = CreateWizExtPage(IDD_WIZARDEXT_PREANALYZE_END,
WizExtPreAnalyzeEndDlgProc,
NewDevWiz
);
if (NewDevWiz->WizExtPreAnalyze.hPropSheetEnd) {
PropSheet_AddPage(hwndParentDlg, NewDevWiz->WizExtPreAnalyze.hPropSheetEnd);
}
PropSheet_PressButton(hwndParentDlg, PSBTN_NEXT);
}
else {
//
// Moving backwards from PreAnalyze end on PreAanalyze
//
//
// Clean up proppages added.
//
if (NewDevWiz->WizExtPreAnalyze.hPropSheetEnd) {
PropSheet_RemovePage(hwndParentDlg,
(WPARAM)-1,
NewDevWiz->WizExtPreAnalyze.hPropSheetEnd
);
NewDevWiz->WizExtPreAnalyze.hPropSheetEnd = NULL;
}
RemoveClassWizExtPages(hwndParentDlg,
&NewDevWiz->WizExtPreAnalyze.DeviceWizardData
);
//
// Jump back
// Note: The target pages don't set PrevPage, so set it for them
//
NewDevWiz->PrevPage = IDD_WIZARDEXT_SELECT;
if (NewDevWiz->InstallDynaWiz.DynamicPageFlags & DYNAWIZ_FLAG_PAGESADDED) {
SetDlgMsgResult(hDlg, wMsg, IDD_DYNAWIZ_ANALYZE_PREVPAGE);
}
else {
SetDlgMsgResult(hDlg, wMsg, IDD_DYNAWIZ_SELECTDEV_PAGE);
}
}
break;
case PSN_WIZNEXT:
SetDlgMsgResult(hDlg, wMsg, 0);
break;
}
break;
default:
return(FALSE);
}
return(TRUE);
}
INT_PTR CALLBACK
WizExtPreAnalyzeEndDlgProc(
HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
HWND hwndParentDlg = GetParent(hDlg);
PNEWDEVWIZ NewDevWiz = (PNEWDEVWIZ )GetWindowLongPtr(hDlg, DWLP_USER);
int PrevPageId;
switch (wMsg) {
case WM_INITDIALOG: {
LPPROPSHEETPAGE lppsp = (LPPROPSHEETPAGE)lParam;
NewDevWiz = (PNEWDEVWIZ )lppsp->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)NewDevWiz);
break;
}
case WM_DESTROY:
break;
case WM_NOTIFY:
switch (((NMHDR FAR *)lParam)->code) {
case PSN_SETACTIVE:
PrevPageId = NewDevWiz->PrevPage;
NewDevWiz->PrevPage = IDD_WIZARDEXT_PREANALYZE_END;
if (PrevPageId == IDD_NEWDEVWIZ_ANALYZEDEV) {
//
// Moving backwards from analyzepage
//
//
// Jump back
//
PropSheet_PressButton(hwndParentDlg, PSBTN_BACK);
}
else {
//
// Moving forward on end page
//
SetDlgMsgResult(hDlg, wMsg, IDD_NEWDEVWIZ_ANALYZEDEV);
}
break;
case PSN_WIZBACK:
case PSN_WIZNEXT:
SetDlgMsgResult(hDlg, wMsg, 0);
break;
}
break;
default:
return(FALSE);
}
return(TRUE);
}
INT_PTR CALLBACK
WizExtPostAnalyzeDlgProc(
HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
HWND hwndParentDlg = GetParent(hDlg);
PNEWDEVWIZ NewDevWiz = (PNEWDEVWIZ )GetWindowLongPtr(hDlg, DWLP_USER);
int PrevPageId;
switch (wMsg) {
case WM_INITDIALOG: {
LPPROPSHEETPAGE lppsp = (LPPROPSHEETPAGE)lParam;
NewDevWiz = (PNEWDEVWIZ )lppsp->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)NewDevWiz);
break;
}
case WM_DESTROY:
break;
case WM_NOTIFY:
switch (((NMHDR FAR *)lParam)->code) {
case PSN_SETACTIVE:
PrevPageId = NewDevWiz->PrevPage;
NewDevWiz->PrevPage = IDD_WIZARDEXT_POSTANALYZE;
if (PrevPageId == IDD_NEWDEVWIZ_ANALYZEDEV) {
//
// Moving forward on first page
//
//
// if we are not doing the old fashioned DYNAWIZ
// Add ClassWizard Extension pages for postanalyze
//
if ((NewDevWiz->Flags & IDI_FLAG_MANUALINSTALL) &&
!(NewDevWiz->InstallDynaWiz.DynamicPageFlags & DYNAWIZ_FLAG_PAGESADDED))
{
AddClassWizExtPages(hwndParentDlg,
NewDevWiz,
&NewDevWiz->WizExtPostAnalyze.DeviceWizardData,
DIF_NEWDEVICEWIZARD_POSTANALYZE,
NULL
);
}
//
// Add the end page, which is PostAnalyze end
//
NewDevWiz->WizExtPostAnalyze.hPropSheetEnd = CreateWizExtPage(IDD_WIZARDEXT_POSTANALYZE_END,
WizExtPostAnalyzeEndDlgProc,
NewDevWiz
);
if (NewDevWiz->WizExtPostAnalyze.hPropSheetEnd) {
PropSheet_AddPage(hwndParentDlg, NewDevWiz->WizExtPostAnalyze.hPropSheetEnd);
}
PropSheet_PressButton(hwndParentDlg, PSBTN_NEXT);
}
else {
//
// Moving backwards from PostAnalyze end on PostAnalyze
//
//
// Clean up proppages added.
//
if (NewDevWiz->WizExtPostAnalyze.hPropSheetEnd) {
PropSheet_RemovePage(hwndParentDlg,
(WPARAM)-1,
NewDevWiz->WizExtPostAnalyze.hPropSheetEnd
);
NewDevWiz->WizExtPostAnalyze.hPropSheetEnd = NULL;
}
RemoveClassWizExtPages(hwndParentDlg,
&NewDevWiz->WizExtPostAnalyze.DeviceWizardData
);
}
break;
case PSN_WIZBACK:
case PSN_WIZNEXT:
SetDlgMsgResult(hDlg, wMsg, 0);
break;
}
break;
default:
return(FALSE);
}
return(TRUE);
}
INT_PTR CALLBACK
WizExtPostAnalyzeEndDlgProc(
HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
HWND hwndParentDlg = GetParent(hDlg);
PNEWDEVWIZ NewDevWiz = (PNEWDEVWIZ )GetWindowLongPtr(hDlg, DWLP_USER);
int PrevPageId;
switch (wMsg) {
case WM_INITDIALOG: {
LPPROPSHEETPAGE lppsp = (LPPROPSHEETPAGE)lParam;
NewDevWiz = (PNEWDEVWIZ )lppsp->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)NewDevWiz);
break;
}
case WM_DESTROY:
break;
case WM_NOTIFY:
switch (((NMHDR FAR *)lParam)->code) {
case PSN_SETACTIVE:
PrevPageId = NewDevWiz->PrevPage;
NewDevWiz->PrevPage = IDD_WIZARDEXT_POSTANALYZE_END;
if (PrevPageId == IDD_NEWDEVWIZ_INSTALLDEV) {
//
// Moving backwards from finishpage
//
//
// Jump back
//
PropSheet_PressButton(hwndParentDlg, PSBTN_BACK);
}
else {
//
// Moving forward on End page
//
SetDlgMsgResult(hDlg, wMsg, IDD_NEWDEVWIZ_INSTALLDEV);
}
break;
case PSN_WIZBACK:
case PSN_WIZNEXT:
SetDlgMsgResult(hDlg, wMsg, 0);
break;
}
break;
default:
return(FALSE);
}
return(TRUE);
}