3 * Copyright (C) 2004-2008 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 * COPYRIGHT: See COPYING in the top level directory
21 * PROJECT: ReactOS GUI first stage setup application
22 * FILE: base/setup/reactos/reactos.c
23 * PROGRAMMERS: Eric Kohl
25 * Dmitry Chapyshev (dmitry@reactos.org)
31 /* GLOBALS ******************************************************************/
34 LONG
LoadGenentry(HINF hinf
,PCTSTR name
,PGENENTRY
*gen
,PINFCONTEXT context
);
36 /* FUNCTIONS ****************************************************************/
39 CenterWindow(HWND hWnd
)
45 hWndParent
= GetParent(hWnd
);
46 if (hWndParent
== NULL
)
47 hWndParent
= GetDesktopWindow();
49 GetWindowRect(hWndParent
, &rcParent
);
50 GetWindowRect(hWnd
, &rcWindow
);
54 ((rcParent
.right
- rcParent
.left
) - (rcWindow
.right
- rcWindow
.left
)) / 2,
55 ((rcParent
.bottom
- rcParent
.top
) - (rcWindow
.bottom
- rcWindow
.top
)) / 2,
70 ncm
.cbSize
= sizeof(NONCLIENTMETRICS
);
71 SystemParametersInfo(SPI_GETNONCLIENTMETRICS
, 0, &ncm
, 0);
73 LogFont
= ncm
.lfMessageFont
;
74 LogFont
.lfWeight
= FW_BOLD
;
75 _tcscpy(LogFont
.lfFaceName
, _T("MS Shell Dlg"));
79 LogFont
.lfHeight
= 0 - GetDeviceCaps (hdc
, LOGPIXELSY
) * FontSize
/ 72;
80 hFont
= CreateFontIndirect(&LogFont
);
86 static INT_PTR CALLBACK
87 StartDlgProc(HWND hwndDlg
,
92 PSETUPDATA pSetupData
;
94 /* Retrieve pointer to the global setup data */
95 pSetupData
= (PSETUPDATA
)GetWindowLongPtr (hwndDlg
, GWL_USERDATA
);
100 /* Save pointer to the global setup data */
101 pSetupData
= (PSETUPDATA
)((LPPROPSHEETPAGE
)lParam
)->lParam
;
102 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pSetupData
);
104 /* Center the wizard window */
105 CenterWindow(GetParent(hwndDlg
));
108 SendDlgItemMessage(hwndDlg
,
111 (WPARAM
)pSetupData
->hTitleFont
,
117 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
122 PropSheet_SetWizButtons(GetParent(hwndDlg
), PSWIZB_NEXT
);
139 static INT_PTR CALLBACK
140 TypeDlgProc(HWND hwndDlg
,
145 PSETUPDATA pSetupData
;
147 /* Retrieve pointer to the global setup data */
148 pSetupData
= (PSETUPDATA
)GetWindowLongPtr (hwndDlg
, GWL_USERDATA
);
153 /* Save pointer to the global setup data */
154 pSetupData
= (PSETUPDATA
)((LPPROPSHEETPAGE
)lParam
)->lParam
;
155 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pSetupData
);
157 /* Check the 'install' radio button */
158 CheckDlgButton(hwndDlg
, IDC_INSTALL
, BST_CHECKED
);
160 /* Disable the 'update' radio button and text */
161 EnableWindow(GetDlgItem(hwndDlg
, IDC_UPDATE
), FALSE
);
162 EnableWindow(GetDlgItem(hwndDlg
, IDC_UPDATETEXT
), FALSE
);
167 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
172 PropSheet_SetWizButtons(GetParent(hwndDlg
), PSWIZB_NEXT
| PSWIZB_BACK
);
175 case PSN_QUERYCANCEL
:
176 SetWindowLongPtr(hwndDlg
,
178 MessageBox(GetParent(hwndDlg
),
179 pSetupData
->szAbortMessage
,
180 pSetupData
->szAbortTitle
,
181 MB_YESNO
| MB_ICONQUESTION
) != IDYES
);
184 case PSN_WIZNEXT
: // set the selected data
185 pSetupData
->RepairUpdateFlag
= !(SendMessage(GetDlgItem(hwndDlg
, IDC_INSTALL
),
188 (LPARAM
) 0) == BST_CHECKED
);
204 static INT_PTR CALLBACK
205 DeviceDlgProc(HWND hwndDlg
,
210 PSETUPDATA pSetupData
;
215 /* Retrieve pointer to the global setup data */
216 pSetupData
= (PSETUPDATA
)GetWindowLongPtr (hwndDlg
, GWL_USERDATA
);
221 /* Save pointer to the global setup data */
222 pSetupData
= (PSETUPDATA
)((LPPROPSHEETPAGE
)lParam
)->lParam
;
223 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pSetupData
);
225 hList
= GetDlgItem(hwndDlg
, IDC_COMPUTER
);
227 for (i
=0; i
< pSetupData
->CompCount
; i
++)
229 tindex
= SendMessage(hList
, CB_ADDSTRING
, (WPARAM
) 0, (LPARAM
) pSetupData
->pComputers
[i
].Value
);
230 SendMessage(hList
, CB_SETITEMDATA
, tindex
, i
);
232 SendMessage(hList
, CB_SETCURSEL
, 0, 0); // set first as default
234 hList
= GetDlgItem(hwndDlg
, IDC_DISPLAY
);
236 for (i
=0; i
< pSetupData
->DispCount
; i
++)
238 tindex
= SendMessage(hList
, CB_ADDSTRING
, (WPARAM
) 0, (LPARAM
) pSetupData
->pDisplays
[i
].Value
);
239 SendMessage(hList
, CB_SETITEMDATA
, tindex
, i
);
241 SendMessage(hList
, CB_SETCURSEL
, 0, 0); // set first as default
243 hList
= GetDlgItem(hwndDlg
, IDC_KEYBOARD
);
245 for (i
=0; i
< pSetupData
->KeybCount
; i
++)
247 tindex
= SendMessage(hList
,CB_ADDSTRING
,(WPARAM
)0,(LPARAM
)pSetupData
->pKeyboards
[i
].Value
);
248 SendMessage(hList
,CB_SETITEMDATA
,tindex
,i
);
250 SendMessage(hList
,CB_SETCURSEL
,0,0); // set first as default
255 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
260 PropSheet_SetWizButtons(GetParent(hwndDlg
), PSWIZB_NEXT
| PSWIZB_BACK
);
263 case PSN_QUERYCANCEL
:
264 SetWindowLongPtr(hwndDlg
,
266 MessageBox(GetParent(hwndDlg
),
267 pSetupData
->szAbortMessage
,
268 pSetupData
->szAbortTitle
,
269 MB_YESNO
| MB_ICONQUESTION
) != IDYES
);
272 case PSN_WIZNEXT
: // set the selected data
274 hList
= GetDlgItem(hwndDlg
, IDC_COMPUTER
);
276 tindex
= SendMessage(hList
, CB_GETCURSEL
, (WPARAM
) 0, (LPARAM
) 0);
277 if (tindex
!= CB_ERR
)
279 pSetupData
->SelectedComputer
= SendMessage(hList
,
285 hList
= GetDlgItem(hwndDlg
, IDC_DISPLAY
);
287 tindex
= SendMessage(hList
, CB_GETCURSEL
, (WPARAM
) 0, (LPARAM
) 0);
288 if (tindex
!= CB_ERR
)
290 pSetupData
->SelectedDisplay
= SendMessage(hList
,
296 hList
=GetDlgItem(hwndDlg
, IDC_KEYBOARD
);
298 tindex
= SendMessage(hList
, CB_GETCURSEL
, (WPARAM
) 0, (LPARAM
) 0);
299 if (tindex
!= CB_ERR
)
301 pSetupData
->SelectedKeyboard
= SendMessage(hList
,
322 static INT_PTR CALLBACK
323 SummaryDlgProc(HWND hwndDlg
,
328 PSETUPDATA pSetupData
;
330 /* Retrieve pointer to the global setup data */
331 pSetupData
= (PSETUPDATA
)GetWindowLongPtr (hwndDlg
, GWL_USERDATA
);
336 /* Save pointer to the global setup data */
337 pSetupData
= (PSETUPDATA
)((LPPROPSHEETPAGE
)lParam
)->lParam
;
338 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pSetupData
);
343 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
348 PropSheet_SetWizButtons(GetParent(hwndDlg
), PSWIZB_NEXT
| PSWIZB_BACK
);
351 case PSN_QUERYCANCEL
:
352 SetWindowLongPtr(hwndDlg
,
354 MessageBox(GetParent(hwndDlg
),
355 pSetupData
->szAbortMessage
,
356 pSetupData
->szAbortTitle
,
357 MB_YESNO
| MB_ICONQUESTION
) != IDYES
);
372 static INT_PTR CALLBACK
373 ProcessDlgProc(HWND hwndDlg
,
378 PSETUPDATA pSetupData
;
380 /* Retrieve pointer to the global setup data */
381 pSetupData
= (PSETUPDATA
)GetWindowLongPtr (hwndDlg
, GWL_USERDATA
);
386 /* Save pointer to the global setup data */
387 pSetupData
= (PSETUPDATA
)((LPPROPSHEETPAGE
)lParam
)->lParam
;
388 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pSetupData
);
393 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
398 PropSheet_SetWizButtons(GetParent(hwndDlg
), PSWIZB_NEXT
);
399 // disable all buttons during installation process
400 // PropSheet_SetWizButtons(GetParent(hwndDlg), 0 );
402 case PSN_QUERYCANCEL
:
403 SetWindowLongPtr(hwndDlg
,
405 MessageBox(GetParent(hwndDlg
),
406 pSetupData
->szAbortMessage
,
407 pSetupData
->szAbortTitle
,
408 MB_YESNO
| MB_ICONQUESTION
) != IDYES
);
424 static INT_PTR CALLBACK
425 RestartDlgProc(HWND hwndDlg
,
430 PSETUPDATA pSetupData
;
432 /* Retrieve pointer to the global setup data */
433 pSetupData
= (PSETUPDATA
)GetWindowLongPtr (hwndDlg
, GWL_USERDATA
);
438 /* Save pointer to the global setup data */
439 pSetupData
= (PSETUPDATA
)((LPPROPSHEETPAGE
)lParam
)->lParam
;
440 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pSetupData
);
443 /*SendDlgItemMessage(hwndDlg,
455 hWndProgress
= GetDlgItem(hwndDlg
, IDC_RESTART_PROGRESS
);
456 Position
= SendMessage(hWndProgress
, PBM_GETPOS
, 0, 0);
459 KillTimer(hwndDlg
, 1);
460 PropSheet_PressButton(GetParent(hwndDlg
), PSBTN_FINISH
);
464 SendMessage(hWndProgress
, PBM_SETPOS
, Position
+ 1, 0);
474 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
478 case PSN_SETACTIVE
: // Only "Finish" for closing the App
479 PropSheet_SetWizButtons(GetParent(hwndDlg
), PSWIZB_FINISH
);
480 SendDlgItemMessage(hwndDlg
, IDC_RESTART_PROGRESS
, PBM_SETRANGE
, 0, MAKELPARAM(0, 300));
481 SendDlgItemMessage(hwndDlg
, IDC_RESTART_PROGRESS
, PBM_SETPOS
, 0, 0);
482 SetTimer(hwndDlg
, 1, 50, NULL
);
500 PSETUPDATA pSetupData
)
502 WCHAR szPath
[MAX_PATH
];
505 HINF hTxtsetupSif
= INVALID_HANDLE_VALUE
;
506 INFCONTEXT InfContext
;
507 //TCHAR szValue[MAX_PATH];
512 GetModuleFileNameW(NULL
,szPath
,MAX_PATH
);
513 ch
= strrchrW(szPath
,L
'\\');
517 wcscat(szPath
, L
"\\txtsetup.sif");
518 hTxtsetupSif
= SetupOpenInfFileW(szPath
, NULL
, INF_STYLE_OLDNT
, NULL
);
519 if (hTxtsetupSif
== INVALID_HANDLE_VALUE
)
521 TCHAR message
[512], caption
[64];
523 // txtsetup.sif cannot be found
524 LoadString(pSetupData
->hInstance
, IDS_NO_TXTSETUP_SIF
, message
, sizeof(message
)/sizeof(TCHAR
));
525 LoadString(pSetupData
->hInstance
, IDS_CAPTION
, caption
, sizeof(caption
)/sizeof(TCHAR
));
527 MessageBox(NULL
, message
, caption
, MB_OK
| MB_ICONERROR
);
532 pSetupData
->LangCount
= SetupGetLineCount(hTxtsetupSif
, _T("Language"));
533 if (pSetupData
->LangCount
> 0)
535 pSetupData
->pLanguages
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(LANG
) * pSetupData
->LangCount
);
536 if (pSetupData
->pLanguages
== NULL
)
543 if (SetupFindFirstLine(hTxtsetupSif
, _T("Language"), NULL
, &InfContext
))
547 SetupGetStringField(&InfContext
,
549 pSetupData
->pLanguages
[Count
].LangId
,
550 sizeof(pSetupData
->pLanguages
[Count
].LangId
) / sizeof(TCHAR
),
553 SetupGetStringField(&InfContext
,
555 pSetupData
->pLanguages
[Count
].LangName
,
556 sizeof(pSetupData
->pLanguages
[Count
].LangName
) / sizeof(TCHAR
),
560 while (SetupFindNextLine(&InfContext
, &InfContext
) && Count
< pSetupData
->LangCount
);
564 // get keyboard layout list
565 pSetupData
->KbLayoutCount
= SetupGetLineCount(hTxtsetupSif
, _T("KeyboardLayout"));
566 if (pSetupData
->KbLayoutCount
> 0)
568 pSetupData
->pKbLayouts
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(KBLAYOUT
) * pSetupData
->KbLayoutCount
);
569 if (pSetupData
->pKbLayouts
== NULL
)
576 if (SetupFindFirstLine(hTxtsetupSif
, _T("KeyboardLayout"), NULL
, &InfContext
))
580 SetupGetStringField(&InfContext
,
582 pSetupData
->pKbLayouts
[Count
].LayoutId
,
583 sizeof(pSetupData
->pKbLayouts
[Count
].LayoutId
) / sizeof(TCHAR
),
586 SetupGetStringField(&InfContext
,
588 pSetupData
->pKbLayouts
[Count
].LayoutName
,
589 sizeof(pSetupData
->pKbLayouts
[Count
].LayoutName
) / sizeof(TCHAR
),
593 while (SetupFindNextLine(&InfContext
, &InfContext
) && Count
< pSetupData
->KbLayoutCount
);
597 // get default for keyboard and language
598 pSetupData
->DefaultKBLayout
= -1;
599 pSetupData
->DefaultLang
= -1;
601 // TODO: get defaults from underlaying running system
602 if (SetupFindFirstLine(hTxtsetupSif
, _T("NLS"), _T("DefaultLayout"), &InfContext
))
604 SetupGetStringField(&InfContext
, 1, tmp
, sizeof(tmp
) / sizeof(TCHAR
), &LineLength
);
605 for (Count
= 0; Count
< pSetupData
->KbLayoutCount
; Count
++)
607 if (_tcscmp(tmp
, pSetupData
->pKbLayouts
[Count
].LayoutId
) == 0)
609 pSetupData
->DefaultKBLayout
= Count
;
615 if (SetupFindFirstLine(hTxtsetupSif
, _T("NLS"), _T("DefaultLanguage"), &InfContext
))
617 SetupGetStringField(&InfContext
, 1, tmp
, sizeof(tmp
) / sizeof(TCHAR
), &LineLength
);
618 for (Count
= 0; Count
< pSetupData
->LangCount
; Count
++)
620 if (_tcscmp(tmp
, pSetupData
->pLanguages
[Count
].LangId
) == 0)
622 pSetupData
->DefaultLang
= Count
;
628 // get computers list
629 pSetupData
->CompCount
= LoadGenentry(hTxtsetupSif
,_T("Computer"),&pSetupData
->pComputers
,&InfContext
);
632 pSetupData
->DispCount
= LoadGenentry(hTxtsetupSif
,_T("Display"),&pSetupData
->pDisplays
,&InfContext
);
635 pSetupData
->KeybCount
= LoadGenentry(hTxtsetupSif
, _T("Keyboard"),&pSetupData
->pKeyboards
,&InfContext
);
637 // get install directory
638 if (SetupFindFirstLine(hTxtsetupSif
, _T("SetupData"), _T("DefaultPath"), &InfContext
))
640 SetupGetStringField(&InfContext
,
642 pSetupData
->InstallDir
,
643 sizeof(pSetupData
->InstallDir
) / sizeof(TCHAR
),
650 if (pSetupData
->pKbLayouts
!= NULL
)
652 HeapFree(GetProcessHeap(), 0, pSetupData
->pKbLayouts
);
653 pSetupData
->pKbLayouts
= NULL
;
656 if (pSetupData
->pLanguages
!= NULL
)
658 HeapFree(GetProcessHeap(), 0, pSetupData
->pLanguages
);
659 pSetupData
->pLanguages
= NULL
;
663 if (hTxtsetupSif
!= INVALID_HANDLE_VALUE
)
664 SetupCloseInfFile(hTxtsetupSif
);
669 LONG
LoadGenentry(HINF hinf
,PCTSTR name
,PGENENTRY
*gen
,PINFCONTEXT context
)
674 TotalCount
= SetupGetLineCount(hinf
, name
);
677 *gen
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(GENENTRY
) * TotalCount
);
680 if (SetupFindFirstLine(hinf
, name
, NULL
, context
))
685 SetupGetStringField(context
,
688 sizeof((*gen
)[Count
].Id
) / sizeof(TCHAR
),
691 SetupGetStringField(context
,
694 sizeof((*gen
)[Count
].Value
) / sizeof(TCHAR
),
698 while (SetupFindNextLine(context
, context
) && Count
< TotalCount
);
706 BOOL
isUnattendSetup(VOID
)
708 WCHAR szPath
[MAX_PATH
];
711 INFCONTEXT InfContext
;
712 TCHAR szValue
[MAX_PATH
];
717 GetModuleFileNameW(NULL
, szPath
, MAX_PATH
);
718 ch
= strrchrW(szPath
, L
'\\');
722 wcscat(szPath
, L
"\\unattend.inf");
723 hUnattendedInf
= SetupOpenInfFileW(szPath
, NULL
, INF_STYLE_OLDNT
, NULL
);
725 if (hUnattendedInf
!= INVALID_HANDLE_VALUE
)
727 if (SetupFindFirstLine(hUnattendedInf
, _T("Unattend"), _T("UnattendSetupEnabled"),&InfContext
))
729 if (SetupGetStringField(&InfContext
,
732 sizeof(szValue
) / sizeof(TCHAR
),
733 &LineLength
) && (_tcsicmp(szValue
, _T("yes")) == 0))
735 result
= 1; // unattendSetup enabled
736 // read values and store in SetupData
739 SetupCloseInfFile(hUnattendedInf
);
748 EnableShutdownPrivilege(VOID
)
750 HANDLE hToken
= NULL
;
751 TOKEN_PRIVILEGES Privileges
;
753 /* Get shutdown privilege */
754 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES
, &hToken
))
756 // FatalError("OpenProcessToken() failed!");
760 if (!LookupPrivilegeValue(NULL
,
762 &Privileges
.Privileges
[0].Luid
))
764 // FatalError("LookupPrivilegeValue() failed!");
768 Privileges
.PrivilegeCount
= 1;
769 Privileges
.Privileges
[0].Attributes
= SE_PRIVILEGE_ENABLED
;
771 if (AdjustTokenPrivileges(hToken
,
775 (PTOKEN_PRIVILEGES
)NULL
,
778 // FatalError("AdjustTokenPrivileges() failed!");
791 _tWinMain(HINSTANCE hInst
,
792 HINSTANCE hPrevInstance
,
796 PSETUPDATA pSetupData
= NULL
;
798 HPROPSHEETPAGE ahpsp
[8];
799 PROPSHEETPAGE psp
= {0};
802 pSetupData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(SETUPDATA
));
803 if (pSetupData
== NULL
)
808 pSetupData
->hInstance
= hInst
;
809 pSetupData
->bUnattend
= isUnattendSetup();
811 LoadString(hInst
,IDS_ABORTSETUP
, pSetupData
->szAbortMessage
, sizeof(pSetupData
->szAbortMessage
)/sizeof(TCHAR
));
812 LoadString(hInst
,IDS_ABORTSETUP2
, pSetupData
->szAbortTitle
, sizeof(pSetupData
->szAbortTitle
)/sizeof(TCHAR
));
814 /* Create title font */
815 pSetupData
->hTitleFont
= CreateTitleFont();
817 if (!pSetupData
->bUnattend
)
819 if (!LoadSetupData(pSetupData
))
821 HeapFree(GetProcessHeap(), 0, pSetupData
);
825 /* Create the Start page, until setup is working */
826 psp
.dwSize
= sizeof(PROPSHEETPAGE
);
827 psp
.dwFlags
= PSP_DEFAULT
| PSP_HIDEHEADER
;
828 psp
.hInstance
= hInst
;
829 psp
.lParam
= (LPARAM
)pSetupData
;
830 psp
.pfnDlgProc
= StartDlgProc
;
831 psp
.pszTemplate
= MAKEINTRESOURCE(IDD_STARTPAGE
);
832 ahpsp
[nPages
++] = CreatePropertySheetPage(&psp
);
834 /* Create install type selection page */
835 psp
.dwSize
= sizeof(PROPSHEETPAGE
);
836 psp
.dwFlags
= PSP_DEFAULT
| PSP_USEHEADERTITLE
| PSP_USEHEADERSUBTITLE
;
837 psp
.pszHeaderTitle
= MAKEINTRESOURCE(IDS_TYPETITLE
);
838 psp
.pszHeaderSubTitle
= MAKEINTRESOURCE(IDS_TYPESUBTITLE
);
839 psp
.hInstance
= hInst
;
840 psp
.lParam
= (LPARAM
)pSetupData
;
841 psp
.pfnDlgProc
= TypeDlgProc
;
842 psp
.pszTemplate
= MAKEINTRESOURCE(IDD_TYPEPAGE
);
843 ahpsp
[nPages
++] = CreatePropertySheetPage(&psp
);
845 /* Create device settings page */
846 psp
.dwSize
= sizeof(PROPSHEETPAGE
);
847 psp
.dwFlags
= PSP_DEFAULT
| PSP_USEHEADERTITLE
| PSP_USEHEADERSUBTITLE
;
848 psp
.pszHeaderTitle
= MAKEINTRESOURCE(IDS_DEVICETITLE
);
849 psp
.pszHeaderSubTitle
= MAKEINTRESOURCE(IDS_DEVICESUBTITLE
);
850 psp
.hInstance
= hInst
;
851 psp
.lParam
= (LPARAM
)pSetupData
;
852 psp
.pfnDlgProc
= DeviceDlgProc
;
853 psp
.pszTemplate
= MAKEINTRESOURCE(IDD_DEVICEPAGE
);
854 ahpsp
[nPages
++] = CreatePropertySheetPage(&psp
);
856 /* Create install device settings page / boot method / install directory */
857 psp
.dwSize
= sizeof(PROPSHEETPAGE
);
858 psp
.dwFlags
= PSP_DEFAULT
| PSP_USEHEADERTITLE
| PSP_USEHEADERSUBTITLE
;
859 psp
.pszHeaderTitle
= MAKEINTRESOURCE(IDS_DRIVETITLE
);
860 psp
.pszHeaderSubTitle
= MAKEINTRESOURCE(IDS_DRIVESUBTITLE
);
861 psp
.hInstance
= hInst
;
862 psp
.lParam
= (LPARAM
)pSetupData
;
863 psp
.pfnDlgProc
= DriveDlgProc
;
864 psp
.pszTemplate
= MAKEINTRESOURCE(IDD_DRIVEPAGE
);
865 ahpsp
[nPages
++] = CreatePropertySheetPage(&psp
);
867 /* Create summary page */
868 psp
.dwSize
= sizeof(PROPSHEETPAGE
);
869 psp
.dwFlags
= PSP_DEFAULT
| PSP_USEHEADERTITLE
| PSP_USEHEADERSUBTITLE
;
870 psp
.pszHeaderTitle
= MAKEINTRESOURCE(IDS_SUMMARYTITLE
);
871 psp
.pszHeaderSubTitle
= MAKEINTRESOURCE(IDS_SUMMARYSUBTITLE
);
872 psp
.hInstance
= hInst
;
873 psp
.lParam
= (LPARAM
)pSetupData
;
874 psp
.pfnDlgProc
= SummaryDlgProc
;
875 psp
.pszTemplate
= MAKEINTRESOURCE(IDD_SUMMARYPAGE
);
876 ahpsp
[nPages
++] = CreatePropertySheetPage(&psp
);
879 /* Create installation progress page */
880 psp
.dwSize
= sizeof(PROPSHEETPAGE
);
881 psp
.dwFlags
= PSP_DEFAULT
| PSP_USEHEADERTITLE
| PSP_USEHEADERSUBTITLE
;
882 psp
.pszHeaderTitle
= MAKEINTRESOURCE(IDS_PROCESSTITLE
);
883 psp
.pszHeaderSubTitle
= MAKEINTRESOURCE(IDS_PROCESSSUBTITLE
);
884 psp
.hInstance
= hInst
;
885 psp
.lParam
= (LPARAM
)pSetupData
;
886 psp
.pfnDlgProc
= ProcessDlgProc
;
887 psp
.pszTemplate
= MAKEINTRESOURCE(IDD_PROCESSPAGE
);
888 ahpsp
[nPages
++] = CreatePropertySheetPage(&psp
);
890 /* Create finish to reboot page */
891 psp
.dwSize
= sizeof(PROPSHEETPAGE
);
892 psp
.dwFlags
= PSP_DEFAULT
| PSP_HIDEHEADER
;
893 psp
.hInstance
= hInst
;
894 psp
.lParam
= (LPARAM
)pSetupData
;
895 psp
.pfnDlgProc
= RestartDlgProc
;
896 psp
.pszTemplate
= MAKEINTRESOURCE(IDD_RESTARTPAGE
);
897 ahpsp
[nPages
++] = CreatePropertySheetPage(&psp
);
899 /* Create the property sheet */
900 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
901 psh
.dwFlags
= PSH_WIZARD97
| PSH_WATERMARK
| PSH_HEADER
;
902 psh
.hInstance
= hInst
;
903 psh
.hwndParent
= NULL
;
907 psh
.pszbmWatermark
= MAKEINTRESOURCE(IDB_WATERMARK
);
908 psh
.pszbmHeader
= MAKEINTRESOURCE(IDB_HEADER
);
910 /* Display the wizard */
913 if (pSetupData
->hTitleFont
)
914 DeleteObject(pSetupData
->hTitleFont
);
916 HeapFree(GetProcessHeap(), 0, pSetupData
);
919 EnableShutdownPrivilege();
920 ExitWindowsEx(EWX_REBOOT
, 0);