more-rx-updates-20060504
[openafs.git] / src / WINNT / client_creds / afswiz.cpp
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #include <winsock2.h>
11 #include <ws2tcpip.h>
12
13 extern "C" {
14 #include <afs/param.h>
15 #include <afs/stds.h>
16 #include <afs/fs_utils.h>
17 }
18
19 #include "afscreds.h"
20
21
22 /*
23  * PROTOTYPES _________________________________________________________________
24  *
25  */
26
27 BOOL CALLBACK WizCommon_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
28 BOOL CALLBACK WizStart_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
29 BOOL CALLBACK WizStarting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
30 BOOL CALLBACK WizCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
31 BOOL CALLBACK WizMount_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
32 BOOL CALLBACK WizMounting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
33 BOOL CALLBACK WizFinish_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
34
35 void WizStarting_OnInitDialog (HWND hDlg);
36 void WizStarting_OnTimer (HWND hDlg);
37
38 void WizCreds_OnInitDialog (HWND hDlg);
39 void WizCreds_OnEnable (HWND hDlg, BOOL fAllowEnable = TRUE);
40
41 void WizMount_OnInitDialog (HWND hDlg);
42 void WizMount_OnEnable (HWND hDlg, BOOL fAllowEnable = TRUE);
43 BOOL WizMount_IsSubmountValid (HWND hDlg);
44
45 void WizMounting_OnInitDialog (HWND hDlg);
46 void WizMounting_OnFinish (HWND hDlg);
47 DWORD CALLBACK WizMounting_Thread (LPVOID lp);
48
49
50 /*
51  * VARIABLES __________________________________________________________________
52  *
53  */
54
55 static struct l
56    {
57    DRIVEMAPLIST List;
58    BOOL fQueried;
59    HWND hDlg;
60    int idh;
61    TCHAR szSubmountReq[ MAX_PATH ];
62    } l;
63
64
65 /*
66  * WIZARD STATES ______________________________________________________________
67  *
68  */
69
70 typedef enum
71    {
72    STEP_START,
73    STEP_STARTING,
74    STEP_CREDS,
75    STEP_MOUNT,
76    STEP_MOUNTING,
77    STEP_FINISH,
78    } WIZSTEP;
79
80 static WIZARD_STATE aStates[] = {
81    { STEP_START,     IDD_WIZ_START,     (DLGPROC)WizStart_DlgProc,      0 },
82    { STEP_STARTING,  IDD_WIZ_STARTING,  (DLGPROC)WizStarting_DlgProc,   0 },
83    { STEP_CREDS,     IDD_WIZ_CREDS,     (DLGPROC)WizCreds_DlgProc,      0 },
84    { STEP_MOUNT,     IDD_WIZ_MOUNT,     (DLGPROC)WizMount_DlgProc,      0 },
85    { STEP_MOUNTING,  IDD_WIZ_MOUNTING,  (DLGPROC)WizMounting_DlgProc,   0 },
86    { STEP_FINISH,    IDD_WIZ_FINISH,    (DLGPROC)WizFinish_DlgProc,     0 }
87 };
88
89 static const int cStates = sizeof(aStates) / sizeof(aStates[0]);
90
91
92 /*
93  * ROUTINES ___________________________________________________________________
94  *
95  */
96
97 void ShowStartupWizard (void)
98 {
99    if (g.pWizard != NULL) // Already showing the wizard? Stop here.
100       return;
101
102    memset (&l, 0x00, sizeof(l));
103
104    g.pWizard = New(WIZARD);
105
106    g.pWizard->SetDialogTemplate (IDD_WIZARD, IDC_LHS, IDC_RHS, IDBACK, IDNEXT);
107    g.pWizard->SetGraphic (IDB_WIZ16, IDB_WIZ256);
108    g.pWizard->SetStates (aStates, cStates);
109    g.pWizard->SetState (STEP_START);
110
111    g.pWizard->Show();
112
113    Delete(g.pWizard);
114    g.pWizard = NULL;
115
116    Main_RepopulateTabs (TRUE);
117
118    FreeDriveMapList (&l.List);
119 }
120
121
122 BOOL CALLBACK WizCommon_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
123 {
124    switch (msg)
125      {
126      case WM_COMMAND:
127         switch (LOWORD(wp))
128            {
129            case IDCANCEL:
130               g.pWizard->Show(FALSE);
131               return TRUE;
132
133            case IDHELP:
134                WizCommon_DlgProc (hDlg, WM_HELP, 0, 0);
135                break;
136            }
137         break;
138
139       case WM_HELP:
140          if (l.idh)
141             WinHelp (GetParent(hDlg), g.szHelpFile, HELP_CONTEXT, l.idh);
142          break;
143      }
144    return FALSE;
145 }
146
147
148 BOOL CALLBACK WizStart_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
149 {
150    if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
151       {
152       switch (msg)
153          {
154          case WM_INITDIALOG:
155             g.pWizard->EnableButtons (NEXT_BUTTON);
156             g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
157             g.pWizard->SetDefaultControl (IDNEXT);
158             l.idh = IDH_AFSCREDS_WIZ_START;
159             EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
160             break;
161
162          case WM_COMMAND:
163             switch (LOWORD(wp))
164                {
165                case IDNEXT:
166                   g.pWizard->SetState (STEP_STARTING);
167                   break;
168
169                case IDC_WIZARD:
170                   switch (HIWORD(wp))
171                      {
172                      case wcIS_STATE_DISABLED:
173                         return IsServiceRunning();
174                      }
175                   break;
176                }
177             break;
178          }
179       }
180
181    return FALSE;
182 }
183
184
185 BOOL CALLBACK WizStarting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
186 {
187    if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
188       {
189       switch (msg)
190          {
191          case WM_INITDIALOG:
192             g.pWizard->EnableButtons (0);
193             g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
194             WizStarting_OnInitDialog (hDlg);
195             l.idh = IDH_AFSCREDS_WIZ_START_FAIL;
196             EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE);
197             break;
198
199          case WM_TIMER:
200             WizStarting_OnTimer (hDlg);
201             break;
202
203          case WM_DESTROY:
204             KillTimer (hDlg, ID_WIZARD_TIMER);
205             break;
206
207          case IDC_WIZARD:
208             switch (HIWORD(wp))
209                {
210                case wcIS_STATE_DISABLED:
211                   return IsServiceRunning();
212                }
213             break;
214          }
215       }
216
217    return FALSE;
218 }
219
220
221 void WizStarting_OnInitDialog (HWND hDlg)
222 {
223    ShowWindow (GetDlgItem (hDlg, IDC_START_FAIL), SW_HIDE);
224    ShowWindow (GetDlgItem (hDlg, IDC_START_TRY), SW_SHOW);
225
226    SC_HANDLE hManager;
227     if ((hManager = OpenSCManager (NULL, NULL, 
228                                    SC_MANAGER_CONNECT |
229                                    SC_MANAGER_ENUMERATE_SERVICE |
230                                    SC_MANAGER_QUERY_LOCK_STATUS)) != NULL)
231       {
232       SC_HANDLE hService;
233           if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), 
234                                        SERVICE_QUERY_STATUS | SERVICE_START)) != NULL)
235          {
236          if (StartService (hService, 0, 0))
237              TestAndDoMapShare(SERVICE_START_PENDING);
238
239          CloseServiceHandle (hService);
240          }
241
242       CloseServiceHandle (hManager);
243       }
244
245    SetTimer (hDlg, ID_WIZARD_TIMER, (ULONG)cmsecSERVICE, NULL);
246
247    WizStarting_OnTimer (hDlg);
248 }
249
250
251 void WizStarting_OnTimer (HWND hDlg)
252 {
253    SERVICE_STATUS Status;
254    memset (&Status, 0x00, sizeof(Status));
255    Status.dwCurrentState = SERVICE_STOPPED;
256
257    SC_HANDLE hManager;
258    if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL)
259       {
260       SC_HANDLE hService;
261       if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), GENERIC_READ)) != NULL)
262          {
263          QueryServiceStatus (hService, &Status);
264          CloseServiceHandle (hService);
265                  TestAndDoMapShare(Status.dwCurrentState);
266          }
267
268       CloseServiceHandle (hManager);
269       }
270
271    if (Status.dwCurrentState == SERVICE_RUNNING)
272       {
273       g.pWizard->SetState (STEP_CREDS);
274       }
275    else if (Status.dwCurrentState != SERVICE_START_PENDING)
276       {
277       KillTimer (hDlg, ID_WIZARD_TIMER);
278
279       ShowWindow (GetDlgItem (hDlg, IDC_START_FAIL), SW_SHOW);
280       ShowWindow (GetDlgItem (hDlg, IDC_START_TRY), SW_HIDE);
281       EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
282       }
283 }
284
285
286 BOOL CALLBACK WizCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
287 {
288    if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
289       {
290       switch (msg)
291          {
292          case WM_INITDIALOG:
293             g.pWizard->EnableButtons (NEXT_BUTTON);
294             g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
295             l.idh = IDH_AFSCREDS_WIZ_CREDS;
296             EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
297             WizCreds_OnInitDialog (hDlg);
298             break;
299
300          case WM_COMMAND:
301             switch (LOWORD(wp))
302                {
303                case IDNEXT:
304                   if (!IsDlgButtonChecked (hDlg, IDC_YESCREDS))
305                      {
306                      g.pWizard->SetState (STEP_MOUNT);
307                      }
308                   else
309                      {
310                      TCHAR szCell[ cchRESOURCE ];
311                      GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell, cchRESOURCE);
312                      TCHAR szUser[ cchRESOURCE ];
313                      GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser, cchRESOURCE);
314                      TCHAR szPassword[ cchRESOURCE ];
315                      GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szPassword, cchRESOURCE);
316
317                      WizCreds_OnEnable (hDlg, FALSE);
318
319                      if (ObtainNewCredentials (szCell, szUser, szPassword, FALSE) == 0)
320                         {
321                         g.pWizard->SetState (STEP_MOUNT);
322                         }
323                      else
324                         {
325                         WizCreds_OnEnable (hDlg);
326                         }
327                      }
328                   break;
329
330                case IDC_NOCREDS:
331                case IDC_YESCREDS:
332                case IDC_NEWCREDS_CELL:
333                case IDC_NEWCREDS_USER:
334                case IDC_NEWCREDS_PASSWORD:
335                   WizCreds_OnEnable (hDlg);
336                   break;
337                }
338             break;
339          }
340       }
341
342    return FALSE;
343 }
344
345
346 void WizCreds_OnInitDialog (HWND hDlg)
347 {
348    HKEY hk;
349
350    TCHAR szCell[ cchRESOURCE ] = TEXT("");
351    SetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell);
352
353    TCHAR szUser[ cchRESOURCE ] = TEXT("");
354    if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hk) == 0)
355       {
356       DWORD dwSize = sizeof(szUser);
357       DWORD dwType = REG_SZ;
358       RegQueryValueEx (hk, TEXT("DefaultUserName"), NULL, &dwType, (PBYTE)szUser, &dwSize);
359       RegCloseKey (hk);
360       }
361    SetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser);
362    g.pWizard->SetDefaultControl (IDC_NEWCREDS_PASSWORD);
363
364    CheckDlgButton (hDlg, IDC_NOCREDS, FALSE);
365    CheckDlgButton (hDlg, IDC_YESCREDS, TRUE);
366    WizCreds_OnEnable (hDlg);
367 }
368
369
370 void WizCreds_OnEnable (HWND hDlg, BOOL fAllowEnable)
371 {
372    BOOL fEnable = fAllowEnable;
373
374    if (IsDlgButtonChecked (hDlg, IDC_YESCREDS))
375       {
376       TCHAR szText[ cchRESOURCE ];
377       GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szText, cchRESOURCE);
378       if (!szText[0])
379          fEnable = FALSE;
380
381       GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szText, cchRESOURCE);
382       if (!szText[0])
383          fEnable = FALSE;
384
385       GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szText, cchRESOURCE);
386       if (!szText[0])
387          fEnable = FALSE;
388       }
389
390    g.pWizard->EnableButtons ((fEnable) ? NEXT_BUTTON : 0);
391
392    EnableWindow (GetDlgItem (hDlg, IDC_NOCREDS), fAllowEnable);
393    EnableWindow (GetDlgItem (hDlg, IDC_YESCREDS), fAllowEnable);
394
395    fEnable = fAllowEnable && IsDlgButtonChecked (hDlg, IDC_YESCREDS);
396    EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_CELL), fEnable);
397    EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_USER), fEnable);
398    EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_PASSWORD), fEnable);
399 }
400
401
402 BOOL CALLBACK WizMount_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
403 {
404    if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
405       {
406       switch (msg)
407          {
408          case WM_INITDIALOG:
409             g.pWizard->EnableButtons (BACK_BUTTON | NEXT_BUTTON);
410             g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
411             g.pWizard->SetDefaultControl (IDNEXT);
412             l.idh = IDH_AFSCREDS_WIZ_MOUNT;
413             EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
414
415             WizMount_OnInitDialog (hDlg);
416             break;
417
418          case WM_COMMAND:
419             switch (LOWORD(wp))
420                {
421                case IDBACK:
422                   g.pWizard->SetState (STEP_CREDS);
423                   break;
424
425                case IDNEXT:
426                   if (IsDlgButtonChecked (hDlg, IDC_YESMAP))
427                      {
428                      if (!WizMount_IsSubmountValid (hDlg))
429                         {
430                         Message (MB_ICONHAND, IDS_BADSUB_TITLE, IDS_BADSUB_DESC);
431                         break;
432                         }
433                      int iItem = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETCURSEL, 0, 0);
434                      int iDrive = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETITEMDATA, iItem, 0);
435                      l.List.aDriveMap[ iDrive ].chDrive = chDRIVE_A + iDrive;
436                      l.List.aDriveMap[ iDrive ].fActive = FALSE;
437                      l.List.aDriveMap[ iDrive ].fPersistent = TRUE;
438                      GetDlgItemText (hDlg, IDC_MAP_PATH, l.List.aDriveMap[ iDrive ].szMapping, MAX_PATH);
439                      GetDlgItemText (hDlg, IDC_MAP_DESC, l.szSubmountReq, MAX_PATH);
440                      WriteDriveMappings (&l.List);
441                      }
442                   g.pWizard->SetState (STEP_MOUNTING);
443                   break;
444
445                case IDC_NOMAP:
446                case IDC_YESMAP:
447                case IDC_MAP_PATH:
448                   WizMount_OnEnable (hDlg);
449                   break;
450                }
451             break;
452          }
453       }
454
455    return FALSE;
456 }
457
458
459 void WizMount_OnInitDialog (HWND hDlg)
460 {
461    QueryDriveMapList (&l.List);
462
463    size_t cMap = 0;
464    for (size_t iDrive = 0; iDrive < 26; ++iDrive)
465       {
466       if (l.List.aDriveMap[iDrive].szMapping[0])
467          ++cMap;
468       }
469
470    if (cMap)
471       {
472       g.pWizard->SetState (STEP_MOUNTING);
473       return;
474       }
475
476    // Fill in the combo box
477    //
478    DWORD dwDrives = GetLogicalDrives() | 0x07; // Always pretend A,B,C: are used
479
480    int iItemSel = -1;
481    HWND hCombo = GetDlgItem (hDlg, IDC_MAP_LETTER);
482    SendMessage (hCombo, WM_SETREDRAW, FALSE, 0);
483
484    for (int ii = 0; ii < 26; ++ii)
485       {
486       if (!(dwDrives & (1<<ii)))
487          {
488          TCHAR szText[ cchRESOURCE ];
489          GetString (szText, IDS_MAP_LETTER);
490
491          LPTSTR pch;
492          if ((pch = (LPTSTR)lstrchr (szText, TEXT('*'))) != NULL)
493             *pch = TEXT('A') + ii;
494
495          int iItem = SendMessage (hCombo, CB_ADDSTRING, 0, (LPARAM)szText);
496          SendMessage (hCombo, CB_SETITEMDATA, iItem, ii);
497          if (iItemSel == -1)
498             iItemSel = iItem;
499          }
500       }
501
502    SendMessage (hCombo, WM_SETREDRAW, TRUE, 0);
503    SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0);
504
505    SetDlgItemText (hDlg, IDC_MAP_PATH, cm_slash_mount_root);
506
507    CheckDlgButton (hDlg, IDC_NOMAP, FALSE);
508    CheckDlgButton (hDlg, IDC_YESMAP, TRUE);
509 }
510
511
512 void WizMount_OnEnable (HWND hDlg, BOOL fAllowEnable)
513 {
514    BOOL fEnable = fAllowEnable;
515
516    if (IsDlgButtonChecked (hDlg, IDC_YESMAP))
517       {
518       TCHAR szText[ cchRESOURCE ];
519       GetDlgItemText (hDlg, IDC_MAP_PATH, szText, cchRESOURCE);
520       if (!szText[0])
521          fEnable = FALSE;
522       }
523
524    EnableWindow (GetDlgItem (hDlg, IDC_NOMAP), fAllowEnable);
525    EnableWindow (GetDlgItem (hDlg, IDC_YESMAP), fAllowEnable);
526
527    EnableWindow (GetDlgItem (hDlg, IDNEXT), fEnable);
528    g.pWizard->EnableButtons ((fEnable) ? (BACK_BUTTON | NEXT_BUTTON) : (BACK_BUTTON));
529
530    fEnable = fAllowEnable && (!IsDlgButtonChecked (hDlg, IDC_NOMAP));
531
532    EnableWindow (GetDlgItem (hDlg, IDC_MAP_LETTER), fEnable);
533    EnableWindow (GetDlgItem (hDlg, IDC_MAP_PATH), fEnable);
534 }
535
536
537 BOOL WizMount_IsSubmountValid (HWND hDlg)
538 {
539    TCHAR szSubmount[ MAX_PATH ];
540    GetDlgItemText (hDlg, IDC_MAP_DESC, szSubmount, MAX_PATH);
541
542    if (!szSubmount[0])
543       return TRUE;
544
545    return IsValidSubmountName (szSubmount);
546 }
547
548
549 BOOL CALLBACK WizMounting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
550 {
551    if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
552       {
553       switch (msg)
554          {
555          case WM_INITDIALOG:
556             g.pWizard->EnableButtons (0);
557             g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
558             g.pWizard->SetDefaultControl (IDNEXT);
559             l.idh = IDH_AFSCREDS_WIZ_MOUNT_FAIL;
560             EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE);
561             WizMounting_OnInitDialog (hDlg);
562             break;
563
564          case WM_COMMAND:
565             switch (LOWORD(wp))
566                {
567                case IDNEXT:
568                   g.pWizard->SetState (STEP_FINISH);
569                   break;
570
571                case IDC_MAP_FINISH:
572                   WizMounting_OnFinish (hDlg);
573                   break;
574
575                case IDC_NOMAP:
576                case IDC_YESMAP:
577                case IDC_MAP_PATH:
578                   WizMount_OnEnable (hDlg);
579                   break;
580
581                case IDC_WIZARD:
582                   switch (HIWORD(wp))
583                      {
584                      case wcIS_STATE_DISABLED:
585                         size_t ii;
586                         for (ii = 0; ii < 26; ++ii)
587                            {
588                            if (!l.List.aDriveMap[ ii ].szMapping[0])
589                               continue;
590                            if (l.List.aDriveMap[ ii ].fActive)
591                               continue;
592                            return FALSE;
593                            }
594                         return TRUE;
595                      }
596                   break;
597                }
598             break;
599          }
600       }
601
602    return FALSE;
603 }
604
605
606 void WizMounting_OnInitDialog (HWND hDlg)
607 {
608    l.hDlg = hDlg;
609    ShowWindow (GetDlgItem (hDlg, IDC_MAP_TRY), SW_SHOW);
610    ShowWindow (GetDlgItem (hDlg, IDC_MAP_FAIL), SW_HIDE);
611
612    DWORD idThread;
613    CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)WizMounting_Thread, (LPVOID)0, 0, &idThread);
614 }
615
616
617 void WizMounting_OnFinish (HWND hDlg)
618 {
619    FreeDriveMapList (&l.List);
620    QueryDriveMapList (&l.List);
621
622    size_t cInactive = 0;
623    for (size_t iDrive = 0; iDrive < 26; ++iDrive)
624       {
625       if (!l.List.aDriveMap[iDrive].szMapping[0])
626          continue;
627       if (l.List.aDriveMap[iDrive].fActive)
628          continue;
629       ++cInactive;
630       }
631
632    if (!cInactive)
633       {
634       g.pWizard->SetState (STEP_FINISH);
635       }
636    else
637       {
638       ShowWindow (GetDlgItem (hDlg, IDC_MAP_TRY), SW_HIDE);
639       ShowWindow (GetDlgItem (hDlg, IDC_MAP_FAIL), SW_SHOW);
640       EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
641       }
642 }
643
644
645 DWORD CALLBACK WizMounting_Thread (LPVOID lp)
646 {
647    size_t cInactive = 0;
648    for (size_t iDrive = 0; iDrive < 26; ++iDrive)
649       {
650       if (!l.List.aDriveMap[iDrive].szMapping[0])
651          continue;
652       if (l.List.aDriveMap[iDrive].fActive)
653          continue;
654
655       DWORD status;
656       (void)ActivateDriveMap (l.List.aDriveMap[iDrive].chDrive, l.List.aDriveMap[iDrive].szMapping, l.szSubmountReq, l.List.aDriveMap[iDrive].fPersistent, &status);
657       l.szSubmountReq[0] = TEXT('\0');
658       }
659
660    PostMessage (l.hDlg, WM_COMMAND, IDC_MAP_FINISH, 0);
661    return 0;
662 }
663
664
665 BOOL CALLBACK WizFinish_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
666 {
667    if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
668       {
669       switch (msg)
670          {
671          case WM_INITDIALOG:
672             g.pWizard->EnableButtons (NEXT_BUTTON);
673             g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_FINISH);
674             g.pWizard->SetDefaultControl (IDNEXT);
675             EnableWindow (GetDlgItem (GetParent (hDlg), IDCANCEL), FALSE);
676             EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE);
677             break;
678
679          case WM_COMMAND:
680             switch (LOWORD(wp))
681                {
682                case IDNEXT:
683                   g.pWizard->Show (FALSE);
684                   break;
685                }
686             break;
687          }
688       }
689
690    return FALSE;
691 }
692