Leaked source code of windows server 2003
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.
 
 
 
 
 
 

940 lines
33 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation
//
// File: selclass.c
//
//--------------------------------------------------------------------------
#include "hdwwiz.h"
int CALLBACK
ClassListCompare(
LPARAM lParam1,
LPARAM lParam2,
LPARAM lParamSort
)
{
TCHAR ClassDescription1[LINE_LEN];
TCHAR ClassDescription2[LINE_LEN];
UNREFERENCED_PARAMETER(lParamSort);
//
// Check if the 1st item is GUID_DEVCLASS_UNKNOWN
//
if (IsEqualGUID((LPGUID)lParam1, &GUID_DEVCLASS_UNKNOWN)) {
return -1;
}
//
// Check if the 2nd item is GUID_DEVCLASS_UNKNOWN
//
if (IsEqualGUID((LPGUID)lParam2, &GUID_DEVCLASS_UNKNOWN)) {
return 1;
}
if (SetupDiGetClassDescription((LPGUID)lParam1,
ClassDescription1,
LINE_LEN,
NULL
) &&
SetupDiGetClassDescription((LPGUID)lParam2,
ClassDescription2,
LINE_LEN,
NULL
)) {
return (lstrcmpi(ClassDescription1, ClassDescription2));
}
return 0;
}
void InitHDW_PickClassDlg(
HWND hwndClassList,
PHARDWAREWIZ HardwareWiz
)
{
LPGUID ClassGuid, lpClassGuidSelected;
GUID ClassGuidSelected;
int lvIndex;
DWORD ClassGuidNum;
LV_ITEM lviItem;
TCHAR ClassDescription[LINE_LEN];
SendMessage(hwndClassList, WM_SETREDRAW, FALSE, 0L);
// Clear the Class List
ListView_DeleteAllItems(hwndClassList);
lviItem.mask = LVIF_TEXT | LVIF_PARAM;
lviItem.iItem = -1;
lviItem.iSubItem = 0;
ClassGuid = HardwareWiz->ClassGuidList;
ClassGuidNum = HardwareWiz->ClassGuidNum;
// keep track of previosuly selected item
if (IsEqualGUID(&HardwareWiz->lvClassGuidSelected, &GUID_NULL)) {
lpClassGuidSelected = NULL;
} else {
ClassGuidSelected = HardwareWiz->lvClassGuidSelected;
HardwareWiz->lvClassGuidSelected = GUID_NULL;
lpClassGuidSelected = &ClassGuidSelected;
}
while (ClassGuidNum--) {
if (SetupDiGetClassDescription(ClassGuid,
ClassDescription,
LINE_LEN,
NULL
)) {
if (IsEqualGUID(ClassGuid, &GUID_DEVCLASS_UNKNOWN)) {
//
// We need to special case the UNKNOWN class and to give it a
// special icon (blank) and special text (Show All Devices).
//
LoadString(hHdwWiz,
IDS_SHOWALLDEVICES,
ClassDescription,
SIZECHARS(ClassDescription)
);
lviItem.iImage = g_BlankIconIndex;
lviItem.mask |= LVIF_IMAGE;
} else if (SetupDiGetClassImageIndex(&HardwareWiz->ClassImageList,
ClassGuid,
&lviItem.iImage
)) {
lviItem.mask |= LVIF_IMAGE;
} else {
lviItem.mask &= ~LVIF_IMAGE;
}
lviItem.pszText = ClassDescription;
lviItem.lParam = (LPARAM) ClassGuid;
lvIndex = ListView_InsertItem(hwndClassList, &lviItem);
//
// check for previous selection
//
if (lpClassGuidSelected &&
IsEqualGUID(lpClassGuidSelected, ClassGuid)) {
ListView_SetItemState(hwndClassList,
lvIndex,
LVIS_SELECTED|LVIS_FOCUSED,
LVIS_SELECTED|LVIS_FOCUSED
);
lpClassGuidSelected = NULL;
}
}
ClassGuid++;
}
//
// Sort the list
//
ListView_SortItems(hwndClassList, (PFNLVCOMPARE)ClassListCompare, NULL);
//
// if previous selection wasn't found select first in list.
//
if (IsEqualGUID(&HardwareWiz->lvClassGuidSelected, &GUID_NULL)) {
lvIndex = 0;
ListView_SetItemState(hwndClassList,
lvIndex,
LVIS_SELECTED|LVIS_FOCUSED,
LVIS_SELECTED|LVIS_FOCUSED
);
}
//
// previous selection was found, fetch its current index
//
else {
lvIndex = ListView_GetNextItem(hwndClassList,
-1,
LVNI_SELECTED
);
}
//
// scroll the selected item into view.
//
ListView_EnsureVisible(hwndClassList, lvIndex, FALSE);
ListView_SetColumnWidth(hwndClassList, 0, LVSCW_AUTOSIZE_USEHEADER);
SendMessage(hwndClassList, WM_SETREDRAW, TRUE, 0L);
}
INT_PTR CALLBACK
HdwPickClassDlgProc(
HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
HWND hwndClassList = GetDlgItem(hDlg, IDC_HDW_PICKCLASS_CLASSLIST);
HWND hwndParentDlg = GetParent(hDlg);
PHARDWAREWIZ HardwareWiz = (PHARDWAREWIZ)GetWindowLongPtr(hDlg, DWLP_USER);
switch (wMsg) {
case WM_INITDIALOG: {
LPPROPSHEETPAGE lppsp = (LPPROPSHEETPAGE)lParam;
LV_COLUMN lvcCol;
HardwareWiz = (PHARDWAREWIZ)lppsp->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)HardwareWiz);
//
// Get the Class Icon Image Lists. We do this only the first
// time this dialog is initialized.
//
if (HardwareWiz->ClassImageList.cbSize) {
ListView_SetImageList(hwndClassList,
HardwareWiz->ClassImageList.ImageList,
LVSIL_SMALL
);
}
// Insert a column for the class list
lvcCol.mask = LVCF_FMT | LVCF_WIDTH;
lvcCol.fmt = LVCFMT_LEFT;
lvcCol.iSubItem = 0;
ListView_InsertColumn(hwndClassList, 0, (LV_COLUMN FAR *)&lvcCol);
//
// Save the class before the user chooses one. This will be restored
// in the event the install is cancelled.
//
HardwareWiz->SavedClassGuid = HardwareWiz->DeviceInfoData.ClassGuid;
break;
}
case WM_DESTROY:
break;
case WM_NOTIFY:
switch (((NMHDR FAR *)lParam)->code) {
//
// This dialog is being activated. Each time we are activated
// we free up the current DeviceInfo and create a new one. Although
// inefficient, its necessary to reenumerate the class list.
//
case PSN_SETACTIVE:
PropSheet_SetWizButtons(hwndParentDlg, PSWIZB_BACK | PSWIZB_NEXT);
HardwareWiz->PrevPage = IDD_ADDDEVICE_SELECTCLASS;
//
// If we have DeviceInfo from going forward delete it.
//
if (HardwareWiz->ClassGuidSelected) {
SetupDiDeleteDeviceInfo(HardwareWiz->hDeviceInfo, &HardwareWiz->DeviceInfoData);
memset(&HardwareWiz->DeviceInfoData, 0, sizeof(SP_DEVINFO_DATA));
}
HardwareWiz->ClassGuidSelected = NULL;
HdwBuildClassInfoList(HardwareWiz,
DIBCI_NOINSTALLCLASS
);
InitHDW_PickClassDlg(hwndClassList, HardwareWiz);
break;
case PSN_RESET:
break;
case PSN_WIZBACK:
HardwareWiz->PrevPage = IDD_ADDDEVICE_SELECTCLASS;
if (HardwareWiz->EnterInto == IDD_ADDDEVICE_SELECTCLASS) {
SetDlgMsgResult(hDlg, wMsg, HardwareWiz->EnterFrom);
} else {
SetDlgMsgResult(hDlg, wMsg, IDD_ADDDEVICE_ASKDETECT);
}
break;
case PSN_WIZNEXT: {
LPGUID ClassGuidSelected;
SetDlgMsgResult(hDlg, wMsg, IDD_ADDDEVICE_SELECTDEVICE);
if (IsEqualGUID(&HardwareWiz->lvClassGuidSelected, &GUID_NULL)) {
HardwareWiz->ClassGuidSelected = NULL;
break;
}
ClassGuidSelected = &HardwareWiz->lvClassGuidSelected;
HardwareWiz->ClassGuidSelected = ClassGuidSelected;
//
// Add a new element to the DeviceInfo from the GUID and class name
//
HardwareWiz->DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
if (!SetupDiGetClassDescription(HardwareWiz->ClassGuidSelected,
HardwareWiz->ClassDescription,
SIZECHARS(HardwareWiz->ClassDescription),
NULL
)
||
!SetupDiClassNameFromGuid(HardwareWiz->ClassGuidSelected,
HardwareWiz->ClassName,
SIZECHARS(HardwareWiz->ClassName),
NULL
))
{
// unhandled error!
HardwareWiz->ClassGuidSelected = NULL;
break;
}
if (IsEqualGUID(HardwareWiz->ClassGuidSelected, &GUID_DEVCLASS_UNKNOWN)) {
ClassGuidSelected = (LPGUID)&GUID_NULL;
}
if (!SetupDiCreateDeviceInfo(HardwareWiz->hDeviceInfo,
HardwareWiz->ClassName,
ClassGuidSelected,
NULL,
hwndParentDlg,
DICD_GENERATE_ID,
&HardwareWiz->DeviceInfoData
)
||
!SetupDiSetSelectedDevice(HardwareWiz->hDeviceInfo,
&HardwareWiz->DeviceInfoData
))
{
HardwareWiz->ClassGuidSelected = NULL;
break;
}
break;
}
case NM_DBLCLK:
PropSheet_PressButton(hwndParentDlg, PSBTN_NEXT);
break;
case LVN_ITEMCHANGED: {
LPNM_LISTVIEW lpnmlv = (LPNM_LISTVIEW)lParam;
if ((lpnmlv->uChanged & LVIF_STATE)) {
if (lpnmlv->uNewState & LVIS_SELECTED) {
HardwareWiz->lvClassGuidSelected = *((LPGUID)lpnmlv->lParam);
} else if (IsEqualGUID((LPGUID)lpnmlv->lParam, &HardwareWiz->lvClassGuidSelected)) {
HardwareWiz->lvClassGuidSelected = GUID_NULL;
}
}
break;
}
}
break;
case WM_SYSCOLORCHANGE:
_OnSysColorChange(hDlg, wParam, lParam);
// Update the ImageList Background color
ImageList_SetBkColor((HIMAGELIST)SendMessage(GetDlgItem(hDlg, IDC_HDW_PICKCLASS_CLASSLIST), LVM_GETIMAGELIST, (WPARAM)(LVSIL_SMALL), 0L),
GetSysColor(COLOR_WINDOW));
break;
default:
return(FALSE);
}
return(TRUE);
}
void
DestroyDynamicWizard(
HWND hwndParentDlg,
PHARDWAREWIZ HardwareWiz,
BOOL WmDestroy
)
{
DWORD Pages;
PSP_INSTALLWIZARD_DATA InstallWizard = &HardwareWiz->InstallDynaWiz;
SP_DEVINSTALL_PARAMS DeviceInstallParams;
Pages = InstallWizard->NumDynamicPages;
InstallWizard->NumDynamicPages = 0;
if (InstallWizard->DynamicPageFlags & DYNAWIZ_FLAG_PAGESADDED) {
if (!WmDestroy) {
while (Pages--) {
PropSheet_RemovePage(hwndParentDlg,
(WPARAM)-1,
InstallWizard->DynamicPages[Pages]
);
InstallWizard->DynamicPages[Pages] = NULL;
}
}
DeviceInstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
if (SetupDiGetDeviceInstallParams(HardwareWiz->hDeviceInfo,
&HardwareWiz->DeviceInfoData,
&DeviceInstallParams
))
{
DeviceInstallParams.Flags |= DI_CLASSINSTALLPARAMS;
SetupDiSetDeviceInstallParams(HardwareWiz->hDeviceInfo,
&HardwareWiz->DeviceInfoData,
&DeviceInstallParams
);
}
InstallWizard->DynamicPageFlags &= ~DYNAWIZ_FLAG_PAGESADDED;
InstallWizard->ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
InstallWizard->ClassInstallHeader.InstallFunction = DIF_DESTROYWIZARDDATA;
InstallWizard->hwndWizardDlg = hwndParentDlg;
if (SetupDiSetClassInstallParams(HardwareWiz->hDeviceInfo,
&HardwareWiz->DeviceInfoData,
&InstallWizard->ClassInstallHeader,
sizeof(SP_INSTALLWIZARD_DATA)
))
{
SetupDiCallClassInstaller(DIF_DESTROYWIZARDDATA,
HardwareWiz->hDeviceInfo,
&HardwareWiz->DeviceInfoData
);
}
}
if (!WmDestroy) {
}
}
//
// The real select device page is in either setupapi or the class installer
// for dyanwiz. this page is a blank page which never shows its face
// to have a consistent place to jump to when the class is known.
//
INT_PTR CALLBACK
HdwSelectDeviceDlgProc(
HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
HWND hwndParentDlg = GetParent(hDlg);
PHARDWAREWIZ HardwareWiz = (PHARDWAREWIZ)GetWindowLongPtr(hDlg, DWLP_USER);
UNREFERENCED_PARAMETER(wParam);
switch (wMsg) {
case WM_INITDIALOG: {
LPPROPSHEETPAGE lppsp = (LPPROPSHEETPAGE)lParam;
HardwareWiz = (PHARDWAREWIZ)lppsp->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)HardwareWiz);
break;
}
case WM_DESTROY:
break;
case WM_NOTIFY:
switch (((NMHDR FAR *)lParam)->code) {
case PSN_SETACTIVE: {
int PrevPage, BackUpPage;
PrevPage = HardwareWiz->PrevPage;
HardwareWiz->PrevPage = IDD_ADDDEVICE_SELECTDEVICE;
BackUpPage = HardwareWiz->EnterInto == IDD_ADDDEVICE_SELECTDEVICE
? HardwareWiz->EnterFrom : IDD_ADDDEVICE_SELECTCLASS;
//
// If we are coming from select class, driver update or Install NewDevice
// then we are going forward.
//
if (!HardwareWiz->ClassGuidSelected || PrevPage == IDD_WIZARDEXT_PRESELECT) {
//
// going backwards, cleanup and backup
//
SetupDiSetSelectedDriver(HardwareWiz->hDeviceInfo,
&HardwareWiz->DeviceInfoData,
NULL
);
SetupDiDestroyDriverInfoList(HardwareWiz->hDeviceInfo,
&HardwareWiz->DeviceInfoData,
SPDIT_COMPATDRIVER
);
SetupDiDestroyDriverInfoList(HardwareWiz->hDeviceInfo,
&HardwareWiz->DeviceInfoData,
SPDIT_CLASSDRIVER
);
//
// Cleanup the WizExtPreSelect Page
//
if (HardwareWiz->WizExtPreSelect.hPropSheet) {
PropSheet_RemovePage(GetParent(hDlg),
(WPARAM)-1,
HardwareWiz->WizExtPreSelect.hPropSheet
);
}
SetDlgMsgResult(hDlg, wMsg, BackUpPage);
break;
}
// Set the Cursor to an Hourglass
SetCursor(LoadCursor(NULL, IDC_WAIT));
HardwareWiz->WizExtPreSelect.hPropSheet = CreateWizExtPage(IDD_WIZARDEXT_PRESELECT,
WizExtPreSelectDlgProc,
HardwareWiz
);
if (HardwareWiz->WizExtPreSelect.hPropSheet) {
PropSheet_AddPage(hwndParentDlg, HardwareWiz->WizExtPreSelect.hPropSheet);
SetDlgMsgResult(hDlg, wMsg, IDD_WIZARDEXT_PRESELECT);
}
else {
SetDlgMsgResult(hDlg, wMsg, BackUpPage);
}
break;
}
}
break;
default:
return(FALSE);
}
return(TRUE);
}
INT_PTR CALLBACK
WizExtPreSelectDlgProc(
HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
HWND hwndParentDlg = GetParent(hDlg);
PHARDWAREWIZ HardwareWiz = (PHARDWAREWIZ)GetWindowLongPtr(hDlg, DWLP_USER);
int PrevPageId;
UNREFERENCED_PARAMETER(wParam);
switch (wMsg) {
case WM_INITDIALOG: {
LPPROPSHEETPAGE lppsp = (LPPROPSHEETPAGE)lParam;
HardwareWiz = (PHARDWAREWIZ)lppsp->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)HardwareWiz);
break;
}
case WM_DESTROY:
break;
case WM_NOTIFY:
switch (((NMHDR FAR *)lParam)->code) {
case PSN_SETACTIVE:
PrevPageId = HardwareWiz->PrevPage;
HardwareWiz->PrevPage = IDD_WIZARDEXT_PRESELECT;
if (PrevPageId == IDD_ADDDEVICE_SELECTDEVICE) {
//
// Moving forward on first page
//
//
// Set the Cursor to an Hourglass
//
SetCursor(LoadCursor(NULL, IDC_WAIT));
//
// Add ClassWizard Extension pages
//
AddClassWizExtPages(hwndParentDlg,
HardwareWiz,
&HardwareWiz->WizExtPreSelect.DeviceWizardData,
DIF_NEWDEVICEWIZARD_PRESELECT
);
//
// Add the end page, which is first of the select page set
//
HardwareWiz->WizExtSelect.hPropSheet = CreateWizExtPage(IDD_WIZARDEXT_SELECT,
WizExtSelectDlgProc,
HardwareWiz
);
if (HardwareWiz->WizExtSelect.hPropSheet) {
PropSheet_AddPage(hwndParentDlg, HardwareWiz->WizExtSelect.hPropSheet);
}
PropSheet_PressButton(hwndParentDlg, PSBTN_NEXT);
} else {
//
// Moving backwards on first page
//
//
// Clean up proppages added.
//
if (HardwareWiz->WizExtSelect.hPropSheet) {
PropSheet_RemovePage(hwndParentDlg,
(WPARAM)-1,
HardwareWiz->WizExtSelect.hPropSheet
);
HardwareWiz->WizExtSelect.hPropSheet = NULL;
}
RemoveClassWizExtPages(hwndParentDlg,
&HardwareWiz->WizExtPreSelect.DeviceWizardData
);
//
// Jump back
//
SetDlgMsgResult(hDlg, wMsg, IDD_ADDDEVICE_SELECTDEVICE);
}
break;
case PSN_WIZNEXT:
SetDlgMsgResult(hDlg, wMsg, 0);
break;
}
break;
default:
return(FALSE);
}
return(TRUE);
}
INT_PTR CALLBACK
WizExtSelectDlgProc(
HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
HWND hwndParentDlg = GetParent(hDlg);
PHARDWAREWIZ HardwareWiz = (PHARDWAREWIZ)GetWindowLongPtr(hDlg, DWLP_USER);
int PrevPageId;
PSP_INSTALLWIZARD_DATA InstallWizard;
UNREFERENCED_PARAMETER(wParam);
switch (wMsg) {
case WM_INITDIALOG: {
LPPROPSHEETPAGE lppsp = (LPPROPSHEETPAGE)lParam;
HardwareWiz = (PHARDWAREWIZ)lppsp->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)HardwareWiz);
break;
}
case WM_DESTROY:
DestroyDynamicWizard(hwndParentDlg, HardwareWiz, TRUE);
break;
case WM_NOTIFY:
switch (((NMHDR FAR *)lParam)->code) {
case PSN_SETACTIVE:
PrevPageId = HardwareWiz->PrevPage;
HardwareWiz->PrevPage = IDD_WIZARDEXT_SELECT;
if (PrevPageId == IDD_WIZARDEXT_PRESELECT) {
SP_DEVINSTALL_PARAMS DeviceInstallParams;
//
// Moving forward on first page
//
//
// Prepare to call the class installer, for class install wizard pages.
// and Add in setup's SelectDevice wizard page.
//
InstallWizard = &HardwareWiz->InstallDynaWiz;
memset(InstallWizard, 0, sizeof(SP_INSTALLWIZARD_DATA));
InstallWizard->ClassInstallHeader.InstallFunction = DIF_INSTALLWIZARD;
InstallWizard->ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
InstallWizard->hwndWizardDlg = GetParent(hDlg);
if (!SetupDiSetClassInstallParams(HardwareWiz->hDeviceInfo,
&HardwareWiz->DeviceInfoData,
&InstallWizard->ClassInstallHeader,
sizeof(SP_INSTALLWIZARD_DATA)
))
{
SetDlgMsgResult(hDlg, wMsg, IDD_WIZARDEXT_PRESELECT);
break;
}
//
// Get current DeviceInstall parameters, and then set the fields
// we wanted changed from default
//
DeviceInstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
if (!SetupDiGetDeviceInstallParams(HardwareWiz->hDeviceInfo,
&HardwareWiz->DeviceInfoData,
&DeviceInstallParams
))
{
SetDlgMsgResult(hDlg, wMsg, IDD_WIZARDEXT_PRESELECT);
break;
}
DeviceInstallParams.Flags |= DI_SHOWCLASS | DI_SHOWOEM | DI_CLASSINSTALLPARAMS;
if (IsEqualGUID(HardwareWiz->ClassGuidSelected, &GUID_DEVCLASS_UNKNOWN)) {
DeviceInstallParams.FlagsEx &= ~DI_FLAGSEX_FILTERCLASSES;
} else {
DeviceInstallParams.FlagsEx |= DI_FLAGSEX_FILTERCLASSES;
}
DeviceInstallParams.hwndParent = hwndParentDlg;
if (!SetupDiSetDeviceInstallParams(HardwareWiz->hDeviceInfo,
&HardwareWiz->DeviceInfoData,
&DeviceInstallParams
))
{
SetDlgMsgResult(hDlg, wMsg, IDD_WIZARDEXT_PRESELECT);
break;
}
//
// Call the class installer for installwizard
// If no class install wizard pages default to run the standard
// setup wizard select device page.
//
if (SetupDiCallClassInstaller(DIF_INSTALLWIZARD,
HardwareWiz->hDeviceInfo,
&HardwareWiz->DeviceInfoData
)
&&
SetupDiGetClassInstallParams(HardwareWiz->hDeviceInfo,
&HardwareWiz->DeviceInfoData,
&InstallWizard->ClassInstallHeader,
sizeof(SP_INSTALLWIZARD_DATA),
NULL
)
&&
InstallWizard->NumDynamicPages)
{
DWORD Pages;
InstallWizard->DynamicPageFlags |= DYNAWIZ_FLAG_PAGESADDED;
for (Pages = 0; Pages < InstallWizard->NumDynamicPages; ++Pages ) {
PropSheet_AddPage(hwndParentDlg, InstallWizard->DynamicPages[Pages]);
}
HardwareWiz->SelectDevicePage = SetupDiGetWizardPage(HardwareWiz->hDeviceInfo,
&HardwareWiz->DeviceInfoData,
InstallWizard,
SPWPT_SELECTDEVICE,
SPWP_USE_DEVINFO_DATA
);
PropSheet_AddPage(hwndParentDlg, HardwareWiz->SelectDevicePage);
} else {
InstallWizard->DynamicPageFlags = 0;
HardwareWiz->SelectDevicePage = NULL;
if (!AddClassWizExtPages(hwndParentDlg,
HardwareWiz,
&HardwareWiz->WizExtSelect.DeviceWizardData,
DIF_NEWDEVICEWIZARD_SELECT
))
{
HardwareWiz->SelectDevicePage = SetupDiGetWizardPage(HardwareWiz->hDeviceInfo,
&HardwareWiz->DeviceInfoData,
InstallWizard,
SPWPT_SELECTDEVICE,
SPWP_USE_DEVINFO_DATA
);
PropSheet_AddPage(hwndParentDlg, HardwareWiz->SelectDevicePage);
}
}
//
// Clear the class install parameters.
//
SetupDiSetClassInstallParams(HardwareWiz->hDeviceInfo,
&HardwareWiz->DeviceInfoData,
NULL,
0
);
//
// Add the end page, which is the preanalyze page.
//
HardwareWiz->WizExtPreAnalyze.hPropSheet = CreateWizExtPage(IDD_WIZARDEXT_PREANALYZE,
WizExtPreAnalyzeDlgProc,
HardwareWiz
);
PropSheet_AddPage(hwndParentDlg, HardwareWiz->WizExtPreAnalyze.hPropSheet);
PropSheet_PressButton(hwndParentDlg, PSBTN_NEXT);
} else {
//
// Moving backwards on first page
//
//
// Clean up proppages added.
//
DestroyDynamicWizard(hwndParentDlg, HardwareWiz, FALSE);
if (HardwareWiz->SelectDevicePage) {
PropSheet_RemovePage(hwndParentDlg,
(WPARAM)-1,
HardwareWiz->SelectDevicePage
);
HardwareWiz->SelectDevicePage = NULL;
}
if (HardwareWiz->WizExtPreAnalyze.hPropSheet) {
PropSheet_RemovePage(hwndParentDlg,
(WPARAM)-1,
HardwareWiz->WizExtPreAnalyze.hPropSheet
);
HardwareWiz->WizExtPreAnalyze.hPropSheet = NULL;
}
RemoveClassWizExtPages(hwndParentDlg,
&HardwareWiz->WizExtSelect.DeviceWizardData
);
//
// Jump back
//
SetDlgMsgResult(hDlg, wMsg, IDD_WIZARDEXT_PRESELECT);
}
break;
case PSN_WIZNEXT:
SetDlgMsgResult(hDlg, wMsg, 0);
break;
}
break;
default:
return(FALSE);
}
return(TRUE);
}