- More dialogs implementation
[reactos.git] / reactos / dll / cpl / hdwwiz / hdwwiz.c
1 /*
2 * ReactOS New devices installation
3 * Copyright (C) 2005, 2008 ReactOS Team
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library 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 GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19 /*
20 * PROJECT: ReactOS Add hardware control panel
21 * FILE: dll/cpl/hdwwiz/hdwwiz.c
22 * PURPOSE: ReactOS Add hardware control panel
23 * PROGRAMMER: Hervé Poussineau (hpoussin@reactos.org)
24 * Dmitry Chapyshev (dmitry@reactos.org)
25 */
26
27 #include "resource.h"
28 #include "hdwwiz.h"
29
30 /* GLOBALS ******************************************************************/
31
32 HINSTANCE hApplet = NULL;
33 HFONT hTitleFont;
34 SP_CLASSIMAGELIST_DATA ImageListData;
35 PWSTR pDeviceStatusText;
36 HANDLE hProcessHeap;
37
38 typedef BOOL (WINAPI *PINSTALL_NEW_DEVICE)(HWND, LPGUID, PDWORD);
39
40
41 /* STATIC FUNCTIONS *********************************************************/
42
43 static HFONT
44 CreateTitleFont(VOID)
45 {
46 NONCLIENTMETRICS ncm;
47 LOGFONT LogFont;
48 HDC hdc;
49 INT FontSize;
50 HFONT hFont;
51
52 ncm.cbSize = sizeof(NONCLIENTMETRICS);
53 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
54
55 LogFont = ncm.lfMessageFont;
56 LogFont.lfWeight = FW_BOLD;
57 _tcscpy(LogFont.lfFaceName, _T("MS Shell Dlg"));
58
59 hdc = GetDC(NULL);
60 FontSize = 12;
61 LogFont.lfHeight = 0 - GetDeviceCaps (hdc, LOGPIXELSY) * FontSize / 72;
62 hFont = CreateFontIndirect(&LogFont);
63 ReleaseDC(NULL, hdc);
64
65 return hFont;
66 }
67
68 static INT_PTR CALLBACK
69 StartPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
70 {
71 switch (uMsg)
72 {
73 case WM_INITDIALOG:
74 {
75 /* Set title font */
76 SendDlgItemMessage(hwndDlg, IDC_FINISHTITLE, WM_SETFONT, (WPARAM)hTitleFont, (LPARAM)TRUE);
77 }
78 break;
79
80 case WM_NOTIFY:
81 {
82 LPNMHDR lpnm = (LPNMHDR)lParam;
83
84 switch (lpnm->code)
85 {
86 case PSN_SETACTIVE:
87 {
88 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT);
89 }
90 break;
91 }
92 }
93 break;
94 }
95
96 return FALSE;
97 }
98
99 static INT_PTR CALLBACK
100 SearchPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
101 {
102 switch (uMsg)
103 {
104 case WM_INITDIALOG:
105 {
106 /* TODO: PnP devices search */
107 }
108 break;
109
110 case WM_NOTIFY:
111 {
112 LPNMHDR lpnm = (LPNMHDR)lParam;
113
114 switch (lpnm->code)
115 {
116 case PSN_SETACTIVE:
117 {
118 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT | PSWIZB_BACK);
119 }
120 break;
121 }
122 }
123 break;
124 }
125
126 return FALSE;
127 }
128
129 static INT_PTR CALLBACK
130 IsConnctedPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
131 {
132 switch (uMsg)
133 {
134 case WM_COMMAND:
135 {
136 if(HIWORD(wParam) == BN_CLICKED)
137 {
138 if ((SendDlgItemMessage(hwndDlg, IDC_CONNECTED, BM_GETCHECK, 0, 0) == BST_CHECKED) ||
139 (SendDlgItemMessage(hwndDlg, IDC_NOTCONNECTED, BM_GETCHECK, 0, 0) == BST_CHECKED))
140 {
141 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT | PSWIZB_BACK);
142 }
143 else
144 {
145 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK);
146 }
147 }
148 }
149 break;
150
151 case WM_NOTIFY:
152 {
153 LPNMHDR lpnm = (LPNMHDR)lParam;
154
155 switch (lpnm->code)
156 {
157 case PSN_SETACTIVE:
158 {
159 if ((SendDlgItemMessage(hwndDlg, IDC_CONNECTED, BM_GETCHECK, 0, 0) == BST_CHECKED) ||
160 (SendDlgItemMessage(hwndDlg, IDC_NOTCONNECTED, BM_GETCHECK, 0, 0) == BST_CHECKED))
161 {
162 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT | PSWIZB_BACK);
163 }
164 else
165 {
166 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK);
167 }
168 }
169 break;
170
171 case PSN_WIZNEXT:
172 {
173 if (SendDlgItemMessage(hwndDlg, IDC_NOTCONNECTED, BM_GETCHECK, 0, 0) == BST_CHECKED)
174 SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_NOTCONNECTEDPAGE);
175 else
176 SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_PROBELISTPAGE);
177
178 return TRUE;
179 }
180 }
181 }
182 break;
183 }
184
185 return FALSE;
186 }
187
188 static INT_PTR CALLBACK
189 FinishPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
190 {
191 switch (uMsg)
192 {
193 case WM_INITDIALOG:
194 {
195 /* Set title font */
196 SendDlgItemMessage(hwndDlg, IDC_FINISHTITLE, WM_SETFONT, (WPARAM)hTitleFont, (LPARAM)TRUE);
197 }
198 break;
199
200 case WM_NOTIFY:
201 {
202 LPNMHDR lpnm = (LPNMHDR)lParam;
203
204 switch (lpnm->code)
205 {
206 case PSN_SETACTIVE:
207 {
208 /* Only "Finish" button */
209 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_FINISH);
210 }
211 break;
212 }
213 }
214 break;
215 }
216
217 return FALSE;
218 }
219
220 static INT_PTR CALLBACK
221 NotConnectedPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
222 {
223 switch (uMsg)
224 {
225 case WM_INITDIALOG:
226 {
227 /* Set title font */
228 SendDlgItemMessage(hwndDlg, IDC_FINISHTITLE, WM_SETFONT, (WPARAM)hTitleFont, (LPARAM)TRUE);
229 }
230 break;
231
232 case WM_NOTIFY:
233 {
234 LPNMHDR lpnm = (LPNMHDR)lParam;
235
236 switch (lpnm->code)
237 {
238 case PSN_SETACTIVE:
239 {
240 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_FINISH | PSWIZB_BACK);
241 }
242 break;
243
244 case PSN_WIZBACK:
245 {
246 SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_ISCONNECTEDPAGE);
247 return TRUE;
248 }
249 }
250 }
251 break;
252 }
253
254 return FALSE;
255 }
256
257 static VOID
258 TrimGuidString(LPWSTR szString, LPWSTR szNewString)
259 {
260 WCHAR szBuffer[39];
261 INT Index;
262
263 if (wcslen(szString) == 38)
264 {
265 if ((szString[0] == L'{') && (szString[37] == L'}'))
266 {
267 for (Index = 0; Index < wcslen(szString); Index++)
268 szBuffer[Index] = szString[Index + 1];
269
270 szBuffer[36] = L'\0';
271 wcscpy(szNewString, szBuffer);
272 return;
273 }
274 }
275 wcscpy(szNewString, L"\0");
276 }
277
278 static VOID
279 InitProbeListPage(HWND hwndDlg)
280 {
281 LV_COLUMN Column;
282 LV_ITEM Item;
283 WCHAR szBuffer[MAX_STR_SIZE], szGuid[MAX_STR_SIZE],
284 szTrimGuid[MAX_STR_SIZE], szStatusText[MAX_STR_SIZE];
285 HWND hList = GetDlgItem(hwndDlg, IDC_PROBELIST);
286 PWSTR pstrStatusText;
287 HDEVINFO hDevInfo;
288 SP_DEVINFO_DATA DevInfoData;
289 ULONG ulStatus, ulProblemNumber;
290 GUID ClassGuid;
291 RECT Rect;
292 DWORD Index;
293
294 if (!hList) return;
295
296 ZeroMemory(&Column, sizeof(LV_COLUMN));
297
298 GetClientRect(hList, &Rect);
299
300 Column.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
301 Column.fmt = LVCFMT_LEFT;
302 Column.iSubItem = 0;
303 Column.pszText = NULL;
304 Column.cx = Rect.right - GetSystemMetrics(SM_CXVSCROLL);
305 (VOID) ListView_InsertColumn(hList, 0, &Column);
306
307 ZeroMemory(&Item, sizeof(LV_ITEM));
308
309 LoadString(hApplet, IDS_ADDNEWDEVICE, szBuffer, sizeof(szBuffer) / sizeof(WCHAR));
310
311 Item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
312 Item.pszText = (LPTSTR) szBuffer;
313 Item.iItem = 0;
314 Item.iImage = -1;
315 (VOID) ListView_InsertItem(hList, &Item);
316
317 (VOID) ListView_SetExtendedListViewStyle(hList, LVS_EX_FULLROWSELECT);
318
319 hDevInfo = SetupDiGetClassDevsEx(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT, NULL, NULL, 0);
320
321 if (hDevInfo == INVALID_HANDLE_VALUE) return;
322
323 /* get the device image List */
324 ImageListData.cbSize = sizeof(ImageListData);
325 SetupDiGetClassImageList(&ImageListData);
326
327 DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
328 for (Index = 0; TRUE; Index++)
329 {
330 if (!SetupDiEnumDeviceInfo(hDevInfo, Index, &DevInfoData)) break;
331
332 if (CM_Get_DevNode_Status_Ex(&ulStatus, &ulProblemNumber, DevInfoData.DevInst, 0, NULL) == CR_SUCCESS)
333 {
334 if (ulStatus & DN_NO_SHOW_IN_DM) continue;
335 }
336
337 /* get the device's friendly name */
338 if (!SetupDiGetDeviceRegistryProperty(hDevInfo,
339 &DevInfoData,
340 SPDRP_FRIENDLYNAME,
341 0,
342 (BYTE*)szBuffer,
343 MAX_STR_SIZE,
344 NULL))
345 {
346 /* if the friendly name fails, try the description instead */
347 SetupDiGetDeviceRegistryProperty(hDevInfo,
348 &DevInfoData,
349 SPDRP_DEVICEDESC,
350 0,
351 (BYTE*)szBuffer,
352 MAX_STR_SIZE,
353 NULL);
354 }
355
356 SetupDiGetDeviceRegistryProperty(hDevInfo,
357 &DevInfoData,
358 SPDRP_CLASSGUID,
359 0,
360 (BYTE*)szGuid,
361 MAX_STR_SIZE,
362 NULL);
363
364 TrimGuidString(szGuid, szTrimGuid);
365 UuidFromStringW(szTrimGuid, &ClassGuid);
366
367 SetupDiGetClassImageIndex(&ImageListData,
368 &ClassGuid,
369 &Item.iImage);
370
371 DeviceProblemTextW(NULL,
372 DevInfoData.DevInst,
373 ulProblemNumber,
374 szStatusText,
375 sizeof(szStatusText) / sizeof(WCHAR));
376
377 pstrStatusText = (PWSTR)HeapAlloc(hProcessHeap, 0, sizeof(szStatusText));
378 lstrcpy(pstrStatusText, szStatusText);
379
380 /* Set device name */
381 Item.pszText = (LPWSTR) szBuffer;
382 Item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
383 Item.lParam = (LPARAM) pstrStatusText;
384 Item.iItem = (INT) ListView_GetItemCount(hList);
385 (VOID) ListView_InsertItem(hList, &Item);
386
387 DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
388 }
389
390 (VOID) ListView_SetImageList(hList, ImageListData.ImageList, LVSIL_SMALL);
391 SetupDiDestroyDeviceInfoList(hDevInfo);
392 }
393
394 static INT_PTR CALLBACK
395 ProbeListPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
396 {
397 INT Index;
398
399 switch (uMsg)
400 {
401 case WM_INITDIALOG:
402 {
403 pDeviceStatusText = (PWSTR)HeapAlloc(hProcessHeap, 0, MAX_STR_SIZE);
404 InitProbeListPage(hwndDlg);
405 }
406 break;
407
408 case WM_COMMAND:
409 {
410
411 }
412 break;
413
414 case WM_NOTIFY:
415 {
416 LPNMHDR lpnm = (LPNMHDR)lParam;
417
418 switch (lpnm->code)
419 {
420 case PSN_SETACTIVE:
421 {
422 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK);
423 }
424 break;
425
426 case NM_CLICK:
427 {
428 Index = (INT) SendMessage(GetDlgItem(hwndDlg, IDC_PROBELIST), LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
429 if (Index != -1)
430 {
431 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT);
432 }
433 }
434 break;
435
436 case PSN_WIZNEXT:
437 {
438 Index = (INT) SendMessage(GetDlgItem(hwndDlg, IDC_PROBELIST), LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
439 if (Index != -1)
440 {
441 if (Index == 0)
442 {
443 SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_SELECTWAYPAGE);
444 }
445 else
446 {
447 LVITEM Item;
448 PWSTR pts;
449
450 ZeroMemory(&Item, sizeof(LV_ITEM));
451 Item.mask = LVIF_PARAM;
452 Item.iItem = Index;
453 (VOID) ListView_GetItem(GetDlgItem(hwndDlg, IDC_PROBELIST), &Item);
454 pts = (PWSTR) Item.lParam;
455 wcscpy(pDeviceStatusText, pts);
456
457 SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_HWSTATUSPAGE);
458 }
459 }
460 return TRUE;
461 }
462 }
463 }
464 break;
465
466 case WM_DESTROY:
467 {
468 INT Index;
469 LVITEM Item;
470
471 for (Index = ListView_GetItemCount(GetDlgItem(hwndDlg, IDC_PROBELIST)); --Index > 0;)
472 {
473 ZeroMemory(&Item, sizeof(LV_ITEM));
474 Item.mask = LVIF_PARAM;
475 Item.iItem = Index;
476 (VOID) ListView_GetItem(GetDlgItem(hwndDlg, IDC_PROBELIST), &Item);
477 HeapFree(hProcessHeap, 0, (LPVOID) Item.lParam);
478 }
479 HeapFree(hProcessHeap, 0, (LPVOID) pDeviceStatusText);
480 }
481 break;
482 }
483
484 return FALSE;
485 }
486
487 static INT_PTR CALLBACK
488 SelectWayPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
489 {
490 switch (uMsg)
491 {
492 case WM_NOTIFY:
493 {
494 LPNMHDR lpnm = (LPNMHDR)lParam;
495
496 switch (lpnm->code)
497 {
498 case PSN_SETACTIVE:
499 {
500 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT | PSWIZB_BACK);
501 SendDlgItemMessage(hwndDlg, IDC_AUTOINSTALL, BM_SETCHECK, 1, 1);
502 }
503 break;
504
505 case PSN_WIZNEXT:
506 {
507 if (SendDlgItemMessage(hwndDlg, IDC_AUTOINSTALL, BM_GETCHECK, 0, 0) == BST_CHECKED)
508 SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_PROGRESSPAGE);
509 else
510 SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_HWTYPESPAGE);
511
512 return TRUE;
513 }
514 }
515 }
516 break;
517 }
518
519 return FALSE;
520 }
521
522 static INT_PTR CALLBACK
523 DevStatusPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
524 {
525 switch (uMsg)
526 {
527 case WM_INITDIALOG:
528 {
529 /* Set title font */
530 SendDlgItemMessage(hwndDlg, IDC_FINISHTITLE, WM_SETFONT, (WPARAM)hTitleFont, (LPARAM)TRUE);
531 /* Set status text */
532 SetWindowText(GetDlgItem(hwndDlg, IDC_HWSTATUSEDIT), pDeviceStatusText);
533 }
534 break;
535
536 case WM_NOTIFY:
537 {
538 LPNMHDR lpnm = (LPNMHDR)lParam;
539
540 switch (lpnm->code)
541 {
542 case PSN_SETACTIVE:
543 {
544 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_FINISH | PSWIZB_BACK);
545 }
546 break;
547
548 case PSN_WIZBACK:
549 {
550 SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_PROBELISTPAGE);
551 return TRUE;
552 }
553 }
554 }
555 break;
556 }
557
558 return FALSE;
559 }
560
561 static INT_PTR CALLBACK
562 HdTypesPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
563 {
564 switch (uMsg)
565 {
566 case WM_NOTIFY:
567 {
568 LPNMHDR lpnm = (LPNMHDR)lParam;
569
570 switch (lpnm->code)
571 {
572 case PSN_SETACTIVE:
573 {
574 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK);
575 }
576 break;
577
578 case PSN_WIZBACK:
579 {
580 SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_SELECTWAYPAGE);
581 return TRUE;
582 }
583 }
584 }
585 break;
586 }
587
588 return FALSE;
589 }
590
591 static INT_PTR CALLBACK
592 ProgressPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
593 {
594 switch (uMsg)
595 {
596 case WM_NOTIFY:
597 {
598 LPNMHDR lpnm = (LPNMHDR)lParam;
599
600 switch (lpnm->code)
601 {
602 case PSN_SETACTIVE:
603 {
604 PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK);
605 }
606 break;
607
608 case PSN_WIZBACK:
609 {
610 SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_SELECTWAYPAGE);
611 return TRUE;
612 }
613 }
614 }
615 break;
616 }
617
618 return FALSE;
619 }
620
621 static VOID
622 HardwareWizardInit(HWND hwnd)
623 {
624 HPROPSHEETPAGE ahpsp[10];
625 PROPSHEETPAGE psp = {0};
626 PROPSHEETHEADER psh;
627 UINT nPages = 0;
628
629 /* Create the Start page, until setup is working */
630 psp.dwSize = sizeof(PROPSHEETPAGE);
631 psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER;
632 psp.hInstance = hApplet;
633 psp.lParam = 0;
634 psp.pfnDlgProc = StartPageDlgProc;
635 psp.pszTemplate = MAKEINTRESOURCE(IDD_STARTPAGE);
636 ahpsp[nPages++] = CreatePropertySheetPage(&psp);
637
638 /* Create search page */
639 psp.dwSize = sizeof(PROPSHEETPAGE);
640 psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
641 psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_SEARCHTITLE);
642 psp.pszHeaderSubTitle = NULL;
643 psp.hInstance = hApplet;
644 psp.lParam = 0;
645 psp.pfnDlgProc = SearchPageDlgProc;
646 psp.pszTemplate = MAKEINTRESOURCE(IDD_SEARCHPAGE);
647 ahpsp[nPages++] = CreatePropertySheetPage(&psp);
648
649 /* Create is connected page */
650 psp.dwSize = sizeof(PROPSHEETPAGE);
651 psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
652 psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_ISCONNECTED);
653 psp.pszHeaderSubTitle = NULL;
654 psp.hInstance = hApplet;
655 psp.lParam = 0;
656 psp.pfnDlgProc = IsConnctedPageDlgProc;
657 psp.pszTemplate = MAKEINTRESOURCE(IDD_ISCONNECTEDPAGE);
658 ahpsp[nPages++] = CreatePropertySheetPage(&psp);
659
660 /* Create probe list page */
661 psp.dwSize = sizeof(PROPSHEETPAGE);
662 psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
663 psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_PROBELISTTITLE);
664 psp.pszHeaderSubTitle = NULL;
665 psp.hInstance = hApplet;
666 psp.lParam = 0;
667 psp.pfnDlgProc = ProbeListPageDlgProc;
668 psp.pszTemplate = MAKEINTRESOURCE(IDD_PROBELISTPAGE);
669 ahpsp[nPages++] = CreatePropertySheetPage(&psp);
670
671 /* Create select search way page */
672 psp.dwSize = sizeof(PROPSHEETPAGE);
673 psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
674 psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_SELECTWAYTITLE);
675 psp.pszHeaderSubTitle = NULL;
676 psp.hInstance = hApplet;
677 psp.lParam = 0;
678 psp.pfnDlgProc = SelectWayPageDlgProc;
679 psp.pszTemplate = MAKEINTRESOURCE(IDD_SELECTWAYPAGE);
680 ahpsp[nPages++] = CreatePropertySheetPage(&psp);
681
682 /* Create device status page */
683 psp.dwSize = sizeof(PROPSHEETPAGE);
684 psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER;
685 psp.hInstance = hApplet;
686 psp.lParam = 0;
687 psp.pfnDlgProc = DevStatusPageDlgProc;
688 psp.pszTemplate = MAKEINTRESOURCE(IDD_HWSTATUSPAGE);
689 ahpsp[nPages++] = CreatePropertySheetPage(&psp);
690
691 /* Create hardware types page */
692 psp.dwSize = sizeof(PROPSHEETPAGE);
693 psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
694 psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_HDTYPESTITLE);
695 psp.pszHeaderSubTitle = NULL;
696 psp.hInstance = hApplet;
697 psp.lParam = 0;
698 psp.pfnDlgProc = HdTypesPageDlgProc;
699 psp.pszTemplate = MAKEINTRESOURCE(IDD_HWTYPESPAGE);
700 ahpsp[nPages++] = CreatePropertySheetPage(&psp);
701
702 /* Create progress page */
703 psp.dwSize = sizeof(PROPSHEETPAGE);
704 psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
705 psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_SEARCHTITLE);
706 psp.pszHeaderSubTitle = NULL;
707 psp.hInstance = hApplet;
708 psp.lParam = 0;
709 psp.pfnDlgProc = ProgressPageDlgProc;
710 psp.pszTemplate = MAKEINTRESOURCE(IDD_PROGRESSPAGE);
711 ahpsp[nPages++] = CreatePropertySheetPage(&psp);
712
713 /* Create finish page */
714 psp.dwSize = sizeof(PROPSHEETPAGE);
715 psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER;
716 psp.hInstance = hApplet;
717 psp.lParam = 0;
718 psp.pfnDlgProc = FinishPageDlgProc;
719 psp.pszTemplate = MAKEINTRESOURCE(IDD_FINISHPAGE);
720 ahpsp[nPages++] = CreatePropertySheetPage(&psp);
721
722 /* Create not connected page */
723 psp.dwSize = sizeof(PROPSHEETPAGE);
724 psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER;
725 psp.hInstance = hApplet;
726 psp.lParam = 0;
727 psp.pfnDlgProc = NotConnectedPageDlgProc;
728 psp.pszTemplate = MAKEINTRESOURCE(IDD_NOTCONNECTEDPAGE);
729 ahpsp[nPages++] = CreatePropertySheetPage(&psp);
730
731 /* Create the property sheet */
732 psh.dwSize = sizeof(PROPSHEETHEADER);
733 psh.dwFlags = PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER;
734 psh.hInstance = hApplet;
735 psh.hwndParent = hwnd;
736 psh.nPages = nPages;
737 psh.nStartPage = 0;
738 psh.phpage = ahpsp;
739 psh.pszbmWatermark = MAKEINTRESOURCE(IDB_WATERMARK);
740 psh.pszbmHeader = MAKEINTRESOURCE(IDB_HEADER);
741
742 /* Create title font */
743 hTitleFont = CreateTitleFont();
744
745 /* Display the wizard */
746 PropertySheet(&psh);
747
748 DeleteObject(hTitleFont);
749 }
750
751 /* FUNCTIONS ****************************************************************/
752
753 BOOL WINAPI
754 InstallNewDevice(HWND hwndParent, LPGUID ClassGuid, PDWORD pReboot)
755 {
756 return FALSE;
757 }
758
759 VOID WINAPI
760 AddHardwareWizard(HWND hwnd, LPWSTR lpName)
761 {
762 if (lpName != NULL)
763 {
764 DPRINT1("No support of remote installation yet!\n");
765 return;
766 }
767
768 HardwareWizardInit(hwnd);
769 }
770
771 /* Control Panel Callback */
772 LONG CALLBACK
773 CPlApplet(HWND hwndCpl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
774 {
775 switch (uMsg)
776 {
777 case CPL_INIT:
778 return TRUE;
779
780 case CPL_GETCOUNT:
781 return 1;
782
783 case CPL_INQUIRE:
784 {
785 CPLINFO *CPlInfo = (CPLINFO*)lParam2;
786 CPlInfo->lData = 0;
787 CPlInfo->idIcon = IDI_CPLICON;
788 CPlInfo->idName = IDS_CPLNAME;
789 CPlInfo->idInfo = IDS_CPLDESCRIPTION;
790 }
791 break;
792
793 case CPL_DBLCLK:
794 AddHardwareWizard(hwndCpl, NULL);
795 break;
796 }
797
798 return FALSE;
799 }
800
801 BOOL WINAPI
802 DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
803 {
804 UNREFERENCED_PARAMETER(lpvReserved);
805
806 switch (dwReason)
807 {
808 case DLL_PROCESS_ATTACH:
809 hApplet = hinstDLL;
810 hProcessHeap = GetProcessHeap();
811 DisableThreadLibraryCalls(hinstDLL);
812 break;
813 }
814
815 return TRUE;
816 }