Implement the 'You need to reboot' wizard page, and use it instead of the network...
authorHervé Poussineau <hpoussin@reactos.org>
Wed, 12 Jul 2006 15:30:09 +0000 (15:30 +0000)
committerHervé Poussineau <hpoussin@reactos.org>
Wed, 12 Jul 2006 15:30:09 +0000 (15:30 +0000)
Main advantage is that the message box doesn't appear anymore during second stage setup.

svn path=/trunk/; revision=23027

reactos/dll/win32/netcfgx/netcfgx.c
reactos/dll/win32/newdev/De.rc
reactos/dll/win32/newdev/En.rc
reactos/dll/win32/newdev/Es.rc
reactos/dll/win32/newdev/Fr.rc
reactos/dll/win32/newdev/Hu.rc
reactos/dll/win32/newdev/Ru.rc
reactos/dll/win32/newdev/newdev.c
reactos/dll/win32/newdev/resource.h
reactos/dll/win32/newdev/wizard.c

index ee03c28..e9eabe4 100644 (file)
@@ -188,6 +188,7 @@ NetClassInstaller(
        HKEY hLinkageKey = NULL;
        HKEY hNetworkKey = NULL;
        HKEY hConnectionKey = NULL;
+       SP_DEVINSTALL_PARAMS_W installParams;
        
        if (InstallFunction != DIF_INSTALLDEVICE)
                return ERROR_DI_DO_DEFAULT;
@@ -437,7 +438,27 @@ NetClassInstaller(
         * which are installed after its startup. So, we have to reboot to take
         * this new netcard into account.
         */
-       MessageBox(NULL, TEXT("You need to reboot to finish the installation of your network card."), TEXT("Reboot required"), MB_OK | MB_ICONWARNING);
+       /* Should we reboot? */
+       installParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS_W);
+       if (!SetupDiGetDeviceInstallParamsW(
+               DeviceInfoSet,
+               DeviceInfoData,
+               &installParams))
+       {
+               rc = GetLastError();
+               DPRINT("SetupDiGetDeviceInstallParams() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+       installParams.Flags |= DI_NEEDRESTART;
+       if (!SetupDiSetDeviceInstallParamsW(
+               DeviceInfoSet,
+               DeviceInfoData,
+               &installParams))
+       {
+               rc = GetLastError();
+               DPRINT("SetupDiSetDeviceInstallParams() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
        rc = ERROR_SUCCESS;
 
 cleanup:
index 888c420..921a1b6 100644 (file)
@@ -79,6 +79,20 @@ BEGIN
     LTEXT           "UNKNOWN DEVICE",IDC_DEVICE,51,20,169,16
 END
 
+IDD_NEEDREBOOT DIALOG DISCARDABLE  0, 0, 317, 193
+STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | 
+    WS_SYSMENU
+CAPTION "Device installation"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    LTEXT           "Installation complete",IDC_FINISHTITLE,120,8,195,11
+    LTEXT           "You need to reboot to finish the install of:",
+                    IDC_STATIC,120,32,195,19
+    LTEXT           "Click Finish to close the wizard.",IDC_STATIC,120,174,
+                    179,11
+    LTEXT           "UNKNOWN DEVICE",IDC_DEVICE,148,53,147,12
+END
+
 IDD_FINISHPAGE DIALOG DISCARDABLE  0, 0, 317, 193
 STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | 
     WS_SYSMENU
index f521d78..f8999dc 100644 (file)
@@ -79,6 +79,20 @@ BEGIN
     LTEXT           "UNKNOWN DEVICE",IDC_DEVICE,51,20,169,16
 END
 
+IDD_NEEDREBOOT DIALOG DISCARDABLE  0, 0, 317, 193
+STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | 
+    WS_SYSMENU
+CAPTION "Device installation"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    LTEXT           "Installation complete",IDC_FINISHTITLE,120,8,195,11
+    LTEXT           "You need to reboot to finish the install of:",
+                    IDC_STATIC,120,32,195,19
+    LTEXT           "Click Finish to close the wizard.",IDC_STATIC,120,174,
+                    179,11
+    LTEXT           "UNKNOWN DEVICE",IDC_DEVICE,148,53,147,12
+END
+
 IDD_FINISHPAGE DIALOG DISCARDABLE  0, 0, 317, 193
 STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | 
     WS_SYSMENU
index 6587ff4..5083e0b 100644 (file)
@@ -79,6 +79,20 @@ BEGIN
     LTEXT           "DISPOSITIVO DESCONOCIDO",IDC_DEVICE,51,20,169,16
 END
 
+IDD_NEEDREBOOT DIALOG DISCARDABLE  0, 0, 317, 193
+STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | 
+    WS_SYSMENU
+CAPTION "Device installation"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    LTEXT           "Installation complete",IDC_FINISHTITLE,120,8,195,11
+    LTEXT           "You need to reboot to finish the install of:",
+                    IDC_STATIC,120,32,195,19
+    LTEXT           "Click Finish to close the wizard.",IDC_STATIC,120,174,
+                    179,11
+    LTEXT           "UNKNOWN DEVICE",IDC_DEVICE,148,53,147,12
+END
+
 IDD_FINISHPAGE DIALOG DISCARDABLE  0, 0, 317, 193
 STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | 
     WS_SYSMENU
index f4a0225..f834275 100644 (file)
@@ -7,7 +7,7 @@ CAPTION "Installation de mat
 FONT 8, "MS Shell Dlg"
 BEGIN
     LTEXT           "Bienvenue",IDC_WELCOMETITLE,115,8,195,24
-    LTEXT           "Cet assistant installe un nouveau pilote pour:",
+    LTEXT           "Cet assistant installe un nouveau pilote pour :",
                     IDC_STATIC,115,21,195,16
     LTEXT           "Cliquer sur Suivant pour continuer.",IDC_STATIC,115,169,195,17
     LTEXT           "MATERIEL INCONNU",IDC_DEVICE,129,36,164,11
@@ -79,6 +79,20 @@ BEGIN
     LTEXT           "MATERIEL INCONNU",IDC_DEVICE,51,20,169,16
 END
 
+IDD_NEEDREBOOT DIALOG DISCARDABLE  0, 0, 317, 193
+STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | 
+    WS_SYSMENU
+CAPTION "Device installation"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    LTEXT           "Installation terminée",IDC_FINISHTITLE,120,8,195,11
+    LTEXT           "Vous devez redémarrer l'ordinateur avant d'utiliser :",
+                    IDC_STATIC,120,32,195,19
+    LTEXT           "Cliquer sur Terminer pour fermer l'assistant.",IDC_STATIC,120,174,
+                    179,11
+    LTEXT           "UNKNOWN DEVICE",IDC_DEVICE,148,53,147,12
+END
+
 IDD_FINISHPAGE DIALOG DISCARDABLE  0, 0, 317, 193
 STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | 
     WS_SYSMENU
@@ -86,7 +100,7 @@ CAPTION "Installation de mat
 FONT 8, "MS Shell Dlg"
 BEGIN
     LTEXT           "Installation terminée",IDC_FINISHTITLE,115,8,195,11
-    LTEXT           "L'assistant a fini d'installer le pilote pour:",
+    LTEXT           "L'assistant a fini d'installer le pilote pour :",
                     IDC_STATIC,115,32,195,19
     LTEXT           "Cliquer sur Terminer pour fermer l'assistant.",IDC_STATIC,115,174,
                     179,11
index 704b50c..39cc40d 100644 (file)
@@ -80,6 +80,20 @@ BEGIN
     LTEXT           "Ismeretlen eszköz!",IDC_DEVICE,51,20,169,16
 END
 
+IDD_NEEDREBOOT DIALOG DISCARDABLE  0, 0, 317, 193
+STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | 
+    WS_SYSMENU
+CAPTION "Device installation"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    LTEXT           "Installation complete",IDC_FINISHTITLE,120,8,195,11
+    LTEXT           "You need to reboot to finish the install of:",
+                    IDC_STATIC,120,32,195,19
+    LTEXT           "Click Finish to close the wizard.",IDC_STATIC,120,174,
+                    179,11
+    LTEXT           "UNKNOWN DEVICE",IDC_DEVICE,148,53,147,12
+END
+
 IDD_FINISHPAGE DIALOG DISCARDABLE  0, 0, 317, 193
 STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | 
     WS_SYSMENU
index 1905c67..41d7241 100644 (file)
@@ -79,6 +79,20 @@ BEGIN
     LTEXT           "Íåèçâåñòíîå óñòðîéñòâî",IDC_DEVICE,51,20,169,16
 END
 
+IDD_NEEDREBOOT DIALOG DISCARDABLE  0, 0, 317, 193
+STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | 
+    WS_SYSMENU
+CAPTION "Device installation"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    LTEXT           "Installation complete",IDC_FINISHTITLE,120,8,195,11
+    LTEXT           "You need to reboot to finish the install of:",
+                    IDC_STATIC,120,32,195,19
+    LTEXT           "Click Finish to close the wizard.",IDC_STATIC,120,174,
+                    179,11
+    LTEXT           "UNKNOWN DEVICE",IDC_DEVICE,148,53,147,12
+END
+
 IDD_FINISHPAGE DIALOG DISCARDABLE  0, 0, 317, 193
 STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | 
     WS_SYSMENU
index 0ecc7e1..6528a4d 100644 (file)
@@ -457,9 +457,6 @@ PrepareFoldersToScan(
        DWORD LengthNeeded = 0;
        LPTSTR Buffer;
 
-       TRACE("Include removable devices: %s\n", IncludeRemovableDevices ? "yes" : "no");
-       TRACE("Include custom path      : %s\n", IncludeCustomPath ? "yes" : "no");
-
        /* Calculate length needed to store the search paths */
        if (IncludeRemovableDevices)
        {
@@ -748,6 +745,20 @@ DevInstallW(
        {
                /* Driver found ; install it */
                retval = InstallCurrentDriver(DevInstData);
+               if (retval && Show != SW_HIDE)
+               {
+                       /* Should we display the 'Need to reboot' page? */
+                       SP_DEVINSTALL_PARAMS installParams;
+                       installParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
+                       if (SetupDiGetDeviceInstallParams(
+                               DevInstData->hDevInfo,
+                               &DevInstData->devInfoData,
+                               &installParams))
+                       {
+                               if (installParams.Flags & (DI_NEEDRESTART | DI_NEEDREBOOT))
+                                       retval = DisplayWizard(DevInstData, hWndParent, IDD_NEEDREBOOT);
+                       }
+               }
                goto cleanup;
        }
        else if (Show == SW_HIDE)
index 08ebc7e..a3d2dbc 100644 (file)
@@ -25,6 +25,8 @@
 #define IDD_INSTALLDRV                  3
 #define IDD_NODRIVER                    4
 #define IDD_INSTALLFAILED               5
-#define IDD_FINISHPAGE                  6
+#define IDD_NEEDREBOOT                  6
+#define IDD_FINISHPAGE                  7
+#define IDD_MAXIMUMPAGE                 IDD_FINISHPAGE
 
 #endif /* RESOURCE_H */
index 8b469e3..cd2e591 100644 (file)
@@ -502,7 +502,7 @@ WelcomeDlgProc(
                        break;
        }
 
-       return FALSE;
+       return DefWindowProc(hwndDlg, uMsg, wParam, lParam);
 }
 
 static void
@@ -664,7 +664,7 @@ CHSourceDlgProc(
                        break;
        }
 
-       return FALSE;
+       return DefWindowProc(hwndDlg, uMsg, wParam, lParam);
 }
 
 static INT_PTR CALLBACK
@@ -759,7 +759,7 @@ SearchDrvDlgProc(
                        break;
        }
 
-       return FALSE;
+       return DefWindowProc(hwndDlg, uMsg, wParam, lParam);
 }
 
 static INT_PTR CALLBACK
@@ -810,9 +810,25 @@ InstallDrvDlgProc(
                        CloseHandle(hThread);
                        hThread = 0;
                        if (wParam == 0)
-                               PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_FINISHPAGE);
-                       else
-                               PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_INSTALLFAILED);
+                       {
+                               /* Should we reboot? */
+                               SP_DEVINSTALL_PARAMS installParams;
+                               installParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
+                               if (SetupDiGetDeviceInstallParams(
+                                       DevInstData->hDevInfo,
+                                       &DevInstData->devInfoData,
+                                       &installParams))
+                               {
+                                       if (installParams.Flags & (DI_NEEDRESTART | DI_NEEDREBOOT))
+                                       {
+                                               PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_NEEDREBOOT);
+                                       }
+                                       else
+                                               PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_FINISHPAGE);
+                                       break;
+                               }
+                       }
+                       PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_INSTALLFAILED);
                        break;
                }
 
@@ -849,7 +865,7 @@ InstallDrvDlgProc(
                        break;
        }
 
-       return FALSE;
+       return DefWindowProc(hwndDlg, uMsg, wParam, lParam);
 }
 
 static INT_PTR CALLBACK
@@ -873,9 +889,13 @@ NoDriverDlgProc(
                {
                        BOOL DisableableDevice = FALSE;
 
+                       /* Get pointer to the global setup data */
                        DevInstData = (PDEVINSTDATA)((LPPROPSHEETPAGE)lParam)->lParam;
                        SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)DevInstData);
 
+                       /* Center the wizard window */
+                       CenterWindow(GetParent(hwndDlg));
+
                        hwndControl = GetDlgItem(GetParent(hwndDlg), IDCANCEL);
                        ShowWindow(hwndControl, SW_HIDE);
                        EnableWindow(hwndControl, FALSE);
@@ -960,7 +980,7 @@ NoDriverDlgProc(
                        break;
        }
 
-       return FALSE;
+       return DefWindowProc(hwndDlg, uMsg, wParam, lParam);
 }
 
 static INT_PTR CALLBACK
@@ -986,6 +1006,88 @@ InstallFailedDlgProc(
                        DevInstData = (PDEVINSTDATA)((LPPROPSHEETPAGE)lParam)->lParam;
                        SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)DevInstData);
 
+                       /* Center the wizard window */
+                       CenterWindow(GetParent(hwndDlg));
+
+                       hwndControl = GetDlgItem(GetParent(hwndDlg), IDCANCEL);
+                       ShowWindow(hwndControl, SW_HIDE);
+                       EnableWindow(hwndControl, FALSE);
+
+                       SendDlgItemMessage(
+                               hwndDlg,
+                               IDC_DEVICE,
+                               WM_SETTEXT,
+                               0,
+                               (LPARAM)DevInstData->drvInfoData.Description);
+
+                       /* Set title font */
+                       SendDlgItemMessage(
+                               hwndDlg,
+                               IDC_FINISHTITLE,
+                               WM_SETFONT,
+                               (WPARAM)DevInstData->hTitleFont,
+                               (LPARAM)TRUE);
+                       break;
+               }
+
+               case WM_NOTIFY:
+               {
+                       LPNMHDR lpnm = (LPNMHDR)lParam;
+
+                       switch (lpnm->code)
+                       {
+                               case PSN_SETACTIVE:
+                                       /* Enable the correct buttons on for the active page */
+                                       PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_FINISH);
+                                       break;
+
+                               case PSN_WIZBACK:
+                                       /* Handle a Back button click, if necessary */
+                                       break;
+
+                               case PSN_WIZFINISH:
+                                       /* Handle a Finish button click, if necessary */
+                                       break;
+
+                               default:
+                                       break;
+                       }
+                       break;
+               }
+
+               default:
+                       break;
+       }
+
+       return DefWindowProc(hwndDlg, uMsg, wParam, lParam);
+}
+
+static INT_PTR CALLBACK
+NeedRebootDlgProc(
+       IN HWND hwndDlg,
+       IN UINT uMsg,
+       IN WPARAM wParam,
+       IN LPARAM lParam)
+{
+       PDEVINSTDATA DevInstData;
+       UNREFERENCED_PARAMETER(wParam);
+
+       /* Retrieve pointer to the global setup data */
+       DevInstData = (PDEVINSTDATA)GetWindowLongPtr(hwndDlg, GWL_USERDATA);
+
+       switch (uMsg)
+       {
+               case WM_INITDIALOG:
+               {
+                       HWND hwndControl;
+
+                       /* Get pointer to the global setup data */
+                       DevInstData = (PDEVINSTDATA)((LPPROPSHEETPAGE)lParam)->lParam;
+                       SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)DevInstData);
+
+                       /* Center the wizard window */
+                       CenterWindow(GetParent(hwndDlg));
+
                        hwndControl = GetDlgItem(GetParent(hwndDlg), IDCANCEL);
                        ShowWindow(hwndControl, SW_HIDE);
                        EnableWindow(hwndControl, FALSE);
@@ -1036,7 +1138,7 @@ InstallFailedDlgProc(
                        break;
        }
 
-       return FALSE;
+       return DefWindowProc(hwndDlg, uMsg, wParam, lParam);
 }
 
 static INT_PTR CALLBACK
@@ -1062,6 +1164,9 @@ FinishDlgProc(
                        DevInstData = (PDEVINSTDATA)((LPPROPSHEETPAGE)lParam)->lParam;
                        SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)DevInstData);
 
+                       /* Center the wizard window */
+                       CenterWindow(GetParent(hwndDlg));
+
                        hwndControl = GetDlgItem(GetParent(hwndDlg), IDCANCEL);
                        ShowWindow(hwndControl, SW_HIDE);
                        EnableWindow(hwndControl, FALSE);
@@ -1112,7 +1217,7 @@ FinishDlgProc(
                        break;
        }
 
-       return FALSE;
+       return DefWindowProc(hwndDlg, uMsg, wParam, lParam);
 }
 
 static HFONT
@@ -1147,7 +1252,7 @@ DisplayWizard(
        IN UINT startPage)
 {
        PROPSHEETHEADER psh;
-       HPROPSHEETPAGE ahpsp[IDD_FINISHPAGE + 1];
+       HPROPSHEETPAGE ahpsp[IDD_MAXIMUMPAGE + 1];
        PROPSHEETPAGE psp;
 
        /* Create the Welcome page */
@@ -1190,6 +1295,12 @@ DisplayWizard(
        psp.pszTemplate = MAKEINTRESOURCE(IDD_INSTALLFAILED);
        ahpsp[IDD_INSTALLFAILED] = CreatePropertySheetPage(&psp);
 
+       /* Create the Need reboot page */
+       psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER;
+       psp.pfnDlgProc = (DLGPROC) NeedRebootDlgProc;
+       psp.pszTemplate = MAKEINTRESOURCE(IDD_NEEDREBOOT);
+       ahpsp[IDD_NEEDREBOOT] = CreatePropertySheetPage(&psp);
+
        /* Create the Finish page */
        psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER;
        psp.pfnDlgProc = (DLGPROC) FinishDlgProc;
@@ -1201,7 +1312,7 @@ DisplayWizard(
        psh.dwFlags = PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER;
        psh.hInstance = hDllInstance;
        psh.hwndParent = hwndParent;
-       psh.nPages = IDD_FINISHPAGE + 1;
+       psh.nPages = IDD_MAXIMUMPAGE + 1;
        psh.nStartPage = startPage;
        psh.phpage = ahpsp;
        psh.pszbmWatermark = MAKEINTRESOURCE(IDB_WATERMARK);