|
|
1.1 root 1: /* Copyright (C) 2004 TrueCrypt Team, truecrypt.org
2: This product uses components written by Paul Le Roux <[email protected]> */
3:
4: #include "TCdefs.h"
5:
6: #include "crypto.h"
7: #include "apidrvr.h"
8: #include "dlgcode.h"
9: #include "combo.h"
10: #include "registry.h"
11: #include "../common/resource.h"
12:
13: #include "resource.h"
14: #include "cmdline.h"
15: #include "Mount.h"
16:
17: #include "dismount.h"
18:
19: #include "Password.h"
20: #include <time.h>
21:
22: BOOL bExplore = FALSE; /* Display explorer window after mount */
23: BOOL bBeep = FALSE; /* Donot beep after mount */
24: char szFileName[TC_MAX_PATH]; /* Volume to mount */
25: char szDriveLetter[3]; /* Drive Letter to mount */
26: BOOL bCacheInDriver = FALSE; /* Cache any passwords we see */
27: BOOL bHistory = FALSE; /* Don't save history */
28: BOOL bHistoryCmdLine = FALSE; /* History control is always disabled */
29: BOOL bCloseDismountedWindows=TRUE; /* Close all open explorer windows of dismounted volume */
30: BOOL bWipeCacheOnExit = FALSE; /* Wipe password from chace on exit */
31:
32: BOOL bWipe = FALSE; /* Wipe driver passwords */
33: BOOL bAuto = FALSE; /* Do everything without user input */
34:
35: BOOL bQuiet = FALSE; /* No dialogs/messages */
36:
37: #define VMOUNTED 1
38: #define VFREE 0
39:
40: int nCurrentShowType = 0; /* current display mode, mount, unmount etc */
41: int nSelectedDriveIndex = 0; /* Item number of selected drive */
42:
43: void
44: localcleanup (void)
45: {
46: /* Free the application title */
47: if (lpszTitle != NULL)
48: free (lpszTitle);
49:
50: /* Cleanup common code resources */
51: cleanup ();
52: }
53:
54: void
55: RefreshMainDlg (HWND hwndDlg)
56: {
57: int drive = (char) (HIWORD (GetSelectedLong (GetDlgItem (hwndDlg, IDC_DRIVELIST))));
58:
59: MoveEditToCombo (GetDlgItem (hwndDlg, IDC_VOLUME));
60: LoadDriveLetters (GetDlgItem (hwndDlg, IDC_DRIVELIST), drive);
61: EnableDisableButtons (hwndDlg);
62: }
63:
64: void
65: EndMainDlg (HWND hwndDlg)
66: {
67: MoveEditToCombo (GetDlgItem (hwndDlg, IDC_VOLUME));
68: SaveSettings (hwndDlg);
69:
70: if (bWipeCacheOnExit)
71: {
72: DWORD dwResult;
73: DeviceIoControl (hDriver, WIPE_CACHE, NULL, 0, NULL, 0, &dwResult, NULL);
74: }
75:
76: EndDialog (hwndDlg, 0);
77: }
78:
79: void
80: EnableDisableButtons (HWND hwndDlg)
81: {
82: HWND hOKButton = GetDlgItem (hwndDlg, IDOK);
83: HWND hChangeButton = GetDlgItem (hwndDlg, IDC_CHANGE_PASSWORD);
84: HWND hVolume = GetDlgItem (hwndDlg, IDC_VOLUME);
85: BOOL bEnable = TRUE;
86: WORD x;
87:
88: x = LOWORD (GetSelectedLong (GetDlgItem (hwndDlg, IDC_DRIVELIST)));
89:
90: if (GetWindowTextLength (GetDlgItem (hwndDlg, IDC_VOLUME)) > 0)
91: {
92: EnableWindow (hOKButton, TRUE);
93: EnableMenuItem (GetMenu (hwndDlg), ID_MOUNT_VOLUME, MF_ENABLED);
94:
95: EnableWindow (hChangeButton, TRUE);
96: EnableMenuItem (GetMenu (hwndDlg), IDC_CHANGE_PASSWORD, MF_ENABLED);
97: }
98: else
99: {
100: EnableWindow (hOKButton, FALSE);
101: EnableMenuItem (GetMenu (hwndDlg), ID_MOUNT_VOLUME, MF_GRAYED);
102:
103: EnableWindow (hChangeButton, FALSE);
104: EnableMenuItem (GetMenu (hwndDlg), IDC_CHANGE_PASSWORD, MF_GRAYED);
105: }
106:
107: if (x == VFREE)
108: {
109: SetWindowText (hOKButton, getstr (IDS_MOUNT_BUTTON));
110:
111: EnableMenuItem (GetMenu (hwndDlg), ID_UNMOUNT_VOLUME, MF_GRAYED);
112: }
113:
114: if (x == VMOUNTED)
115: {
116: SetWindowText (hOKButton, getstr (IDS_UNMOUNT_BUTTON));
117: EnableWindow (hOKButton, TRUE);
118:
119: EnableMenuItem (GetMenu (hwndDlg), ID_MOUNT_VOLUME, MF_GRAYED);
120: EnableMenuItem (GetMenu (hwndDlg), ID_UNMOUNT_VOLUME, MF_ENABLED);
121:
122: EnableWindow (GetDlgItem (hwndDlg, IDC_VOLUME_PROPERTIES), TRUE);
123: EnableMenuItem (GetMenu (hwndDlg), IDC_VOLUME_PROPERTIES, MF_ENABLED);
124: }
125: else
126: {
127: EnableWindow (GetDlgItem (hwndDlg, IDC_VOLUME_PROPERTIES), FALSE);
128: EnableMenuItem (GetMenu (hwndDlg), IDC_VOLUME_PROPERTIES, MF_GRAYED);
129: }
130:
131: EnableWindow (GetDlgItem (hwndDlg, IDC_WIPE_CACHE), !IsPasswordCacheEmpty());
132: EnableMenuItem (GetMenu (hwndDlg), IDC_WIPE_CACHE, IsPasswordCacheEmpty() ? MF_GRAYED:MF_ENABLED);
133: EnableMenuItem (GetMenu (hwndDlg), IDC_CLEAR_HISTORY, IsComboEmpty (GetDlgItem (hwndDlg, IDC_VOLUME)) ? MF_GRAYED:MF_ENABLED);
134: }
135:
136: void
137: OpenPageHelp (HWND hwndDlg)
138: {
139: int r = (int)ShellExecute (NULL, "open", szHelpFile, NULL, NULL, SW_SHOWNORMAL);
140:
141: if (r == ERROR_FILE_NOT_FOUND)
142: MessageBox (hwndDlg, getstr (IDS_HELP_ERROR), lpszTitle, MB_ICONERROR);
143:
144: if (r == SE_ERR_NOASSOC)
145: MessageBox (hwndDlg, getstr (IDS_HELP_READER_ERROR), lpszTitle, MB_ICONERROR);
146: }
147:
148: void
149: LoadSettings (HWND hwndDlg)
150: {
151:
152: // Options
153: bCacheInDriver = ReadRegistryInt ("CachePasswordsInDriver", FALSE);
154: bExplore = ReadRegistryInt ("OpenExplorerWindowAfterMount", FALSE);
155: bCloseDismountedWindows = ReadRegistryInt ("CloseExplorerWindowsOnDismount", TRUE);
156: bHistory = ReadRegistryInt ("SaveMountedVolumesHistory", FALSE);
157: bWipeCacheOnExit = ReadRegistryInt ("WipePasswordCacheOnExit", FALSE);
158:
159: // Drive Letter
160: ReadRegistryString ("LastSelectedDrive", "", szDriveLetter, sizeof (szDriveLetter));
161:
162: // History
163: if (bHistoryCmdLine != TRUE)
164: LoadCombo (GetDlgItem (hwndDlg, IDC_VOLUME), "LastMountedVolume");
165: }
166:
167: void
168: SaveSettings (HWND hwndDlg)
169: {
170: char szTmp[32] = {0};
171: LPARAM lLetter;
172:
173: // Options
174: WriteRegistryInt ("CachePasswordsInDriver", bCacheInDriver);
175: WriteRegistryInt ("OpenExplorerWindowAfterMount", bExplore);
176: WriteRegistryInt ("CloseExplorerWindowsOnDismount", bCloseDismountedWindows);
177: WriteRegistryInt ("SaveMountedVolumesHistory", !IsButtonChecked (GetDlgItem (hwndDlg, IDC_NO_HISTORY)));
178: WriteRegistryInt ("WipePasswordCacheOnExit", bWipeCacheOnExit);
179:
180: // Drive Letter
181: lLetter = GetSelectedLong (GetDlgItem (hwndDlg, IDC_DRIVELIST));
182: if (LOWORD (lLetter) != 0xffff)
183: sprintf (szTmp, "%c:", (char) HIWORD (lLetter));
184: WriteRegistryString ("LastSelectedDrive", szTmp);
185:
186: // History
187: DumpCombo (GetDlgItem (hwndDlg, IDC_VOLUME), "LastMountedVolume", IsButtonChecked (GetDlgItem (hwndDlg, IDC_NO_HISTORY)));
188: }
189:
190: BOOL
191: SelectItem (HWND hTree, char nLetter)
192: {
193: int i;
194: LVITEM item;
195:
196: for (i = 0; i < ListView_GetItemCount(hTree); i++)
197: {
198: memset(&item, 0, sizeof(LVITEM));
199: item.mask = LVIF_PARAM;
200: item.iItem = i;
201:
202: if (ListView_GetItem (hTree, &item) == FALSE)
203: return FALSE;
204: else
205: {
206: if (HIWORD (item.lParam) == nLetter)
207: {
208: memset(&item, 0, sizeof(LVITEM));
209: item.state = LVIS_FOCUSED|LVIS_SELECTED;
210: item.stateMask = LVIS_FOCUSED|LVIS_SELECTED;
211: item.mask = LVIF_STATE;
212: item.iItem = i;
213: SendMessage(hTree, LVM_SETITEMSTATE, i, (LPARAM) &item);
214: return TRUE;
215: }
216: }
217:
218: }
219:
220: return TRUE;
221: }
222:
223:
224: // Fills drive list
225: // drive>0 = update only the corresponding drive subitems
226: void
227: LoadDriveLetters (HWND hTree, int drive)
228: {
229: char *szDriveLetters[]=
230: {"A:", "B:", "C:", "D:",
231: "E:", "F:", "G:", "H:", "I:", "J:", "K:",
232: "L:", "M:", "N:", "O:", "P:", "Q:", "R:",
233: "S:", "T:", "U:", "V:", "W:", "X:", "Y:",
234: "Z:"};
235:
236: DWORD dwResult;
237: BOOL bResult;
238: DWORD dwUsedDrives;
239: MOUNT_LIST_STRUCT driver;
240:
241: LVITEM listItem;
242: int item = 0;
243: char i;
244:
245: bResult = DeviceIoControl (hDriver, MOUNT_LIST, &driver,
246: sizeof (driver), &driver, sizeof (driver), &dwResult,
247: NULL);
248:
249: if (bResult == FALSE)
250: {
251: handleWin32Error (hTree);
252: driver.ulMountedDrives = 0;
253: }
254:
255: dwUsedDrives = GetLogicalDrives();
256: if (dwUsedDrives == 0 && bQuiet == FALSE)
257: MessageBox (hTree, getstr (IDS_DRIVELETTERS), lpszTitle, ICON_HAND);
258:
259: if(drive == 0)
260: ListView_DeleteAllItems(hTree);
261:
262: for (i = 2; i < 26; i++)
263: {
264: int curDrive = 0;
265:
266: if(drive > 0)
267: {
268: LVITEM tmp;
269: memset(&tmp, 0, sizeof(LVITEM));
270: tmp.mask = LVIF_PARAM;
271: tmp.iItem = item;
272: if (ListView_GetItem (hTree, &tmp) != FALSE)
273: curDrive = HIWORD(tmp.lParam);
274: }
275:
276: if ( driver.ulMountedDrives & (1 << i) )
277: {
278: char szTmp[256];
279:
280: memset(&listItem, 0, sizeof(listItem));
281:
282: listItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
283: listItem.iImage = 1;
284: listItem.iItem = item++;
285:
286: if(drive > 0 && drive != curDrive)
287: continue;
288:
289: if (nCurrentOS == WIN_NT)
290: ToSBCS ((void *) driver.wszVolume[i]);
291:
292: if (memcmp (driver.wszVolume[i], "\\Device", 7) == 0)
293: sprintf (szTmp, "%s", ((char *) driver.wszVolume[i]));
294: else
295: {
296: if (nCurrentOS == WIN_NT)
297: sprintf (szTmp, "%s", ((char *) driver.wszVolume[i]) + 4);
298: else
299: sprintf (szTmp, "%s", (char *) driver.wszVolume[i]);
300: }
301:
302: listItem.pszText = szDriveLetters[i];
303: listItem.lParam = MAKELONG (VMOUNTED, i + 'A');
304:
305: if(drive == 0)
306: ListView_InsertItem (hTree, &listItem);
307: else
308: ListView_SetItem (hTree, &listItem);
309:
310: listItem.mask=LVIF_TEXT;
311: listItem.pszText = szTmp;
312:
313: listItem.iSubItem = 1;
314: ListView_SetItem(hTree, &listItem);
315:
316: if(driver.diskLength[i] > 1024I64*1024*1024)
317: sprintf (szTmp,"%.1f GB",(double)(driver.diskLength[i]/1024.0/1024/1024));
318: else if(driver.diskLength[i] > 1024I64*1024)
319: sprintf (szTmp, "%I64d MB", driver.diskLength[i]/1024/1024);
320: else if(driver.diskLength[i] > 0)
321: sprintf (szTmp, "%I64d KB", driver.diskLength[i]/1024);
322: else
323: szTmp[0] = 0;
324:
325: listItem.iSubItem = 2;
326: ListView_SetItem(hTree, &listItem);
327:
328: sprintf (szTmp, "%s", get_cipher_name (driver.cipher[i]));
329: listItem.iSubItem = 3;
330: ListView_SetItem(hTree, &listItem);
331:
332: }
333: else
334: {
335: if (!(dwUsedDrives & 1 << i))
336: {
337: if(drive > 0 && drive != HIWORD (GetSelectedLong (hTree)))
338: {
339: item++;
340: continue;
341: }
342:
343: memset(&listItem,0,sizeof(listItem));
344:
345: listItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
346: listItem.iImage = 0;
347: listItem.iItem = item++;
348: listItem.pszText = szDriveLetters[i];
349: listItem.lParam = MAKELONG (VFREE, i + 'A');
350:
351: if(drive == 0)
352: ListView_InsertItem (hTree, &listItem);
353: else
354: ListView_SetItem (hTree, &listItem);
355:
356: listItem.mask=LVIF_TEXT;
357: listItem.pszText = "";
358: listItem.iSubItem = 1;
359: ListView_SetItem(hTree, &listItem);
360: listItem.iSubItem = 2;
361: ListView_SetItem(hTree, &listItem);
362: listItem.iSubItem = 3;
363: ListView_SetItem(hTree, &listItem);
364:
365: }
366: }
367: }
368: }
369:
370:
371: /* Except in response to the WM_INITDIALOG message, the dialog box procedure
372: should return nonzero if it processes the message, and zero if it does
373: not. - see DialogProc */
374: BOOL WINAPI
375: PasswordChangeDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
376: {
377:
378: WORD lw = LOWORD (wParam);
379: WORD hw = HIWORD (wParam);
380:
381: if (lParam); /* remove warning */
382: if (hw); /* remove warning */
383:
384: switch (msg)
385: {
386: case WM_INITDIALOG:
387: {
388: UINT nID[4];
389:
390: nID[0] = IDS_PASSWORD_HELP0;
391: nID[1] = IDS_PASSWORD_HELP1;
392: nID[2] = IDS_PASSWORD_HELP2;
393: nID[3] = IDS_PASSWORD_HELP3;
394:
395: SetDefaultUserFont (hwndDlg);
396:
397: SendMessage (GetDlgItem (hwndDlg, IDC_OLD_PASSWORD), EM_LIMITTEXT, MAX_PASSWORD, 0);
398: SendMessage (GetDlgItem (hwndDlg, IDC_PASSWORD), EM_LIMITTEXT, MAX_PASSWORD, 0);
399: SendMessage (GetDlgItem (hwndDlg, IDC_VERIFY), EM_LIMITTEXT, MAX_PASSWORD, 0);
400: SetWindowText (GetDlgItem (hwndDlg, IDC_BOX_HELP), getmultilinestr (nID));
401: EnableWindow (GetDlgItem (hwndDlg, IDOK), FALSE);
402:
403: return 1;
404: }
405:
406: case WM_COMMAND:
407: if (lw == IDCANCEL)
408: {
409: // Attempt to wipe passwords stored in the input field buffers
410: char tmp[MAX_PASSWORD+1];
411: memset (tmp, 'X', MAX_PASSWORD);
412: tmp[MAX_PASSWORD] = 0;
413:
414: SetWindowText (GetDlgItem (hwndDlg, IDC_PASSWORD), tmp);
415: SetWindowText (GetDlgItem (hwndDlg, IDC_OLD_PASSWORD), tmp);
416: SetWindowText (GetDlgItem (hwndDlg, IDC_VERIFY), tmp);
417:
418: EndDialog (hwndDlg, IDCANCEL);
419: return 1;
420: }
421: if (hw == EN_CHANGE)
422: {
423: VerifyPasswordAndUpdate (hwndDlg, GetDlgItem (hwndDlg, IDOK), GetDlgItem (hwndDlg, IDC_PASSWORD),
424: GetDlgItem (hwndDlg, IDC_VERIFY), NULL, NULL);
425: return 1;
426: }
427: if (lw == IDOK)
428: {
429: HWND hParent = GetParent (hwndDlg);
430: char szOldPassword[MAX_PASSWORD + 1];
431: char szPassword[MAX_PASSWORD + 1];
432: int nStatus;
433:
434: GetWindowText (GetDlgItem (hParent, IDC_VOLUME), szFileName, sizeof (szFileName));
435:
436: GetWindowText (GetDlgItem (hwndDlg, IDC_OLD_PASSWORD), szOldPassword, sizeof (szOldPassword));
437:
438: GetWindowText (GetDlgItem (hwndDlg, IDC_PASSWORD), szPassword, sizeof (szPassword));
439:
440: nStatus = ChangePwd (szFileName, szOldPassword, szPassword);
441:
442: burn (szOldPassword, sizeof (szOldPassword));
443: burn (szPassword, sizeof (szPassword));
444:
445: if (nStatus != 0)
446: handleError (hwndDlg, nStatus);
447: else
448: {
449: // Attempt to wipe passwords stored in the input field buffers
450: char tmp[MAX_PASSWORD+1];
451: memset (tmp, 'X', MAX_PASSWORD);
452: tmp[MAX_PASSWORD] = 0;
453: SetWindowText (GetDlgItem (hwndDlg, IDC_PASSWORD), tmp);
454: SetWindowText (GetDlgItem (hwndDlg, IDC_OLD_PASSWORD), tmp);
455: SetWindowText (GetDlgItem (hwndDlg, IDC_VERIFY), tmp);
456:
457: EndDialog (hwndDlg, IDOK);
458: }
459:
460: return 1;
461: }
462: return 0;
463: }
464:
465: return 0;
466: }
467:
468: /* Except in response to the WM_INITDIALOG message, the dialog box procedure
469: should return nonzero if it processes the message, and zero if it does
470: not. - see DialogProc */
471: BOOL WINAPI
472: PasswordDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
473: {
474: WORD lw = LOWORD (wParam);
475: static char* szXPwd;
476:
477: switch (msg)
478: {
479: case WM_INITDIALOG:
480: {
481: szXPwd = (char*) lParam;
482: SetDefaultUserFont (hwndDlg);
483: SendMessage (GetDlgItem (hwndDlg, IDC_PASSWORD), EM_LIMITTEXT, MAX_PASSWORD, 0);
484: SendMessage (GetDlgItem (hwndDlg, IDC_CACHE), BM_SETCHECK, bCacheInDriver ? BST_CHECKED:BST_UNCHECKED, 0);
485: return 1;
486: }
487:
488: case WM_COMMAND:
489:
490: if (lw == IDCANCEL || lw == IDOK)
491: {
492: char tmp[MAX_PASSWORD+1];
493:
494: if (lw == IDOK)
495: {
496: GetWindowText (GetDlgItem (hwndDlg, IDC_PASSWORD), szXPwd, MAX_PASSWORD + 1);
497: bCacheInDriver = IsButtonChecked (GetDlgItem (hwndDlg, IDC_CACHE));
498: }
499:
500: // Attempt to wipe password stored in the input field buffer
501: memset (tmp, 'X', MAX_PASSWORD);
502: tmp[MAX_PASSWORD] = 0;
503: SetWindowText (GetDlgItem (hwndDlg, IDC_PASSWORD), tmp);
504: SetWindowText (GetDlgItem (hwndDlg, IDC_PASSWORD), 0);
505:
506: EndDialog (hwndDlg, lw);
507: return 1;
508: }
509: return 0;
510: }
511:
512: return 0;
513: }
514:
515: BOOL WINAPI
516: PreferencesDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
517: {
518: WORD lw = LOWORD (wParam);
519:
520: switch (msg)
521: {
522: case WM_INITDIALOG:
523: {
524: SetDefaultUserFont (hwndDlg);
525:
526: SendMessage (GetDlgItem (hwndDlg, IDC_PREF_OPEN_EXPLORER), BM_SETCHECK,
527: bExplore ? BST_CHECKED:BST_UNCHECKED, 0);
528:
529: SendMessage (GetDlgItem (hwndDlg, IDC_PREF_CLOSE_DISMOUNTED_WINDOWS), BM_SETCHECK,
530: bCloseDismountedWindows ? BST_CHECKED:BST_UNCHECKED, 0);
531:
532: SendMessage (GetDlgItem (hwndDlg, IDC_PREF_WIPE_CACHE_ON_EXIT), BM_SETCHECK,
533: bWipeCacheOnExit ? BST_CHECKED:BST_UNCHECKED, 0);
534:
535: SendMessage (GetDlgItem (hwndDlg, IDC_PREF_CACHE_PASSWORDS), BM_SETCHECK,
536: bCacheInDriver ? BST_CHECKED:BST_UNCHECKED, 0);
537:
538:
539: return 1;
540: }
541:
542: case WM_COMMAND:
543:
544: if (lw == IDCANCEL)
545: {
546: EndDialog (hwndDlg, lw);
547: return 1;
548: }
549:
550: if (lw == IDOK)
551: {
552: bExplore = IsButtonChecked (GetDlgItem (hwndDlg, IDC_PREF_OPEN_EXPLORER));
553: bCloseDismountedWindows = IsButtonChecked (GetDlgItem (hwndDlg, IDC_PREF_CLOSE_DISMOUNTED_WINDOWS));
554: bWipeCacheOnExit = IsButtonChecked (GetDlgItem (hwndDlg, IDC_PREF_WIPE_CACHE_ON_EXIT));
555: bCacheInDriver = IsButtonChecked (GetDlgItem (hwndDlg, IDC_PREF_CACHE_PASSWORDS));
556:
557: EndDialog (hwndDlg, lw);
558: return 1;
559: }
560: return 0;
561: }
562:
563: return 0;
564: }
565:
566: BOOL WINAPI
567: VolumePropertiesDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
568: {
569: WORD lw = LOWORD (wParam);
570:
571: switch (msg)
572: {
573: case WM_INITDIALOG:
574: {
575: VOLUME_PROPERTIES_STRUCT prop;
576: DWORD dwResult;
577: BOOL bResult;
578:
579: LVCOLUMN lvCol;
580: LVITEM listItem;
581: HWND list = GetDlgItem (hwndDlg, IDC_VOLUME_PROPERTIES_LIST);
582: char szTmp[128];
583:
584: SetDefaultUserFont (hwndDlg);
585:
586: SendMessage (list,LVM_SETEXTENDEDLISTVIEWSTYLE,0,
587: LVS_EX_FULLROWSELECT
588: |LVS_EX_HEADERDRAGDROP
589: //|LVS_EX_GRIDLINES
590: //|LVS_EX_TWOCLICKACTIVATE
591: );
592:
593: memset (&lvCol,0,sizeof(lvCol));
594: lvCol.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM|LVCF_FMT;
595: lvCol.pszText = "Value";
596: lvCol.cx = 220;
597: lvCol.fmt = LVCFMT_LEFT ;
598: SendMessage (list,LVM_INSERTCOLUMN,0,(LPARAM)&lvCol);
599:
600: lvCol.pszText = "Property";
601: lvCol.cx = 100;
602: lvCol.fmt = LVCFMT_LEFT;
603: SendMessage (list,LVM_INSERTCOLUMN,0,(LPARAM)&lvCol);
604:
605:
606: memset (&prop, 0, sizeof(prop));
607: prop.driveNo = HIWORD (GetSelectedLong (GetDlgItem (GetParent(hwndDlg), IDC_DRIVELIST))) - 'A';
608:
609: bResult = DeviceIoControl (hDriver, VOLUME_PROPERTIES, &prop,
610: sizeof (prop), &prop, sizeof (prop), &dwResult,
611: NULL);
612:
613: memset (&listItem, 0, sizeof(listItem));
614:
615: listItem.mask = LVIF_TEXT;
616: listItem.iItem = -1;
617:
618: listItem.pszText = "Volume Location";
619: listItem.iItem++;
620: listItem.iSubItem = 0;
621: ListView_InsertItem(list, &listItem);
622: listItem.iSubItem++;
623: listItem.pszText = (LPSTR)prop.wszVolume;
624: if (nCurrentOS == WIN_NT)
625: {
626: ToSBCS (prop.wszVolume);
627: if (prop.wszVolume[0] == '?\\')
628: listItem.pszText = (LPSTR)prop.wszVolume + 4;
629: }
630: ListView_SetItem(list, &listItem);
631:
632: listItem.pszText = "Volume Size";
633: listItem.iItem++;
634: listItem.iSubItem = 0;
635: ListView_InsertItem(list, &listItem);
636: listItem.iSubItem++;
637: sprintf (szTmp, "%I64d bytes", prop.diskLength);
638: listItem.pszText = szTmp;
639: ListView_SetItem (list, &listItem);
640:
641: listItem.pszText = "Cipher";
642: listItem.iItem++;
643: listItem.iSubItem = 0;
644: ListView_InsertItem(list, &listItem);
645: listItem.iSubItem++;
646: listItem.pszText = get_cipher_name (prop.cipher);
647: ListView_SetItem (list, &listItem);
648:
649: listItem.pszText = "Key Size";
650: listItem.iItem++;
651: listItem.iSubItem = 0;
652: ListView_InsertItem(list, &listItem);
653: listItem.iSubItem++;
654: sprintf (szTmp, "%d bits", get_key_size (prop.cipher)*8);
655: listItem.pszText = szTmp;
656: ListView_SetItem (list, &listItem);
657:
658: listItem.pszText = "PKCS5 PRF";
659: listItem.iItem++;
660: listItem.iSubItem = 0;
661: ListView_InsertItem(list, &listItem);
662: listItem.iSubItem++;
663: listItem.pszText = get_hash_name (prop.pkcs5);
664: ListView_SetItem (list, &listItem);
665:
666: listItem.pszText = "PKCS5 Iterations";
667: listItem.iItem++;
668: listItem.iSubItem = 0;
669: ListView_InsertItem(list, &listItem);
670: listItem.iSubItem++;
671: sprintf (szTmp, "%d", prop.pkcs5Iterations);
672: listItem.pszText = szTmp;
673: ListView_SetItem (list, &listItem);
674:
675: {
676: FILETIME ft, curFt;
677: SYSTEMTIME st;
678: char date[128];
679: memset (date, 0, sizeof (date));
680:
681: listItem.pszText = "Volume Created";
682: listItem.iItem++;
683: listItem.iSubItem = 0;
684: ListView_InsertItem (list, &listItem);
685:
686: listItem.iSubItem++;
687: *(unsigned __int64 *)(&ft) = prop.volumeCreationTime;
688: FileTimeToSystemTime (&ft, &st);
689: GetDateFormat (LOCALE_USER_DEFAULT, 0, &st, 0, (LPSTR) szTmp, sizeof (szTmp));
690: sprintf (date, "%s ", szTmp);
691: GetTimeFormat (LOCALE_USER_DEFAULT, 0, &st, 0, (LPSTR) szTmp, sizeof (szTmp));
692: strcat (date, szTmp);
693: listItem.pszText = date;
694: ListView_SetItem (list, &listItem);
695:
696: listItem.pszText = "Password Changed";
697: listItem.iItem++;
698: listItem.iSubItem = 0;
699: ListView_InsertItem (list, &listItem);
700:
701: listItem.iSubItem++;
702: *(unsigned __int64 *)(&ft) = prop.headerCreationTime;
703: FileTimeToSystemTime (&ft, &st);
704: GetDateFormat (LOCALE_USER_DEFAULT, 0, &st, 0, (LPSTR) szTmp, sizeof (szTmp));
705: sprintf (date, "%s ", szTmp);
706: GetTimeFormat (LOCALE_USER_DEFAULT, 0, &st, 0, (LPSTR) szTmp, sizeof (szTmp));
707: strcat (date, szTmp);
708:
709: GetLocalTime (&st);
710: SystemTimeToFileTime (&st, &curFt);
711: sprintf (date + strlen (date), " (%I64d days ago)"
712: , (*(__int64 *)&curFt - *(__int64 *)&ft)/1000000000000 );
713: listItem.pszText = date;
714: ListView_SetItem (list, &listItem);
715: }
716:
717: return 1;
718: }
719:
720: case WM_COMMAND:
721:
722: if (lw == IDCANCEL)
723: {
724: EndDialog (hwndDlg, lw);
725: return 1;
726: }
727:
728: if (lw == IDOK)
729: {
730: EndDialog (hwndDlg, lw);
731: return 1;
732: }
733: return 0;
734: }
735:
736: return 0;
737: }
738:
739: void
740: BuildTree (HWND hTree)
741: {
742: HIMAGELIST hList;
743: HBITMAP hBitmap, hBitmapMask;
744: LVCOLUMN lvCol;
745: SendMessage(hTree,LVM_SETEXTENDEDLISTVIEWSTYLE,0,
746: LVS_EX_FULLROWSELECT
747: |LVS_EX_HEADERDRAGDROP
748: //|LVS_EX_GRIDLINES
749: //|LVS_EX_TWOCLICKACTIVATE
750: );
751:
752: memset(&lvCol,0,sizeof(lvCol));
753:
754: lvCol.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM|LVCF_FMT;
755: lvCol.pszText="Drive";
756: lvCol.cx=40;
757: lvCol.fmt = LVCFMT_COL_HAS_IMAGES|LVCFMT_LEFT ;
758: SendMessage (hTree,LVM_INSERTCOLUMN,0,(LPARAM)&lvCol);
759:
760: lvCol.pszText="Volume";
761: lvCol.cx=290;
762: lvCol.fmt = LVCFMT_LEFT;
763: SendMessage (hTree,LVM_INSERTCOLUMN,1,(LPARAM)&lvCol);
764:
765: lvCol.pszText="Size";
766: lvCol.cx=80;
767: lvCol.fmt = LVCFMT_RIGHT;
768: SendMessage (hTree,LVM_INSERTCOLUMN,2,(LPARAM)&lvCol);
769:
770: lvCol.pszText="Cipher";
771: lvCol.cx=110;
772: lvCol.fmt = LVCFMT_LEFT;
773: SendMessage (hTree,LVM_INSERTCOLUMN,3,(LPARAM)&lvCol);
774:
775: hBitmap = LoadBitmap (hInst, MAKEINTRESOURCE (IDB_DRIVEICON));
776: if (hBitmap == NULL)
777: return;
778: hBitmapMask = LoadBitmap (hInst, MAKEINTRESOURCE (IDB_DRIVEICON_MASK));
779:
780: hList = ImageList_Create (16, 12, ILC_COLOR8|ILC_MASK, 2, 2);
781: if (ImageList_Add (hList, hBitmap, hBitmapMask) == -1)
782: {
783: DeleteObject (hBitmap);
784: return;
785: }
786: else
787: DeleteObject (hBitmap);
788:
789: ListView_SetImageList (hTree, hList, LVSIL_NORMAL);
790: ListView_SetImageList (hTree, hList, LVSIL_SMALL);
791:
792: LoadDriveLetters (hTree, 0);
793: }
794:
795: LPARAM
796: GetSelectedLong (HWND hTree)
797: {
798: int hItem = ListView_GetSelectionMark (hTree);
799: LVITEM item;
800:
801: if (nSelectedDriveIndex != 0)
802: hItem = nSelectedDriveIndex;
803:
804: memset(&item, 0, sizeof(LVITEM));
805: item.mask = LVIF_PARAM;
806: item.iItem = hItem;
807:
808: if (ListView_GetItem (hTree, &item) == FALSE)
809: return MAKELONG (0xffff, 0xffff);
810: else
811: return item.lParam;
812: }
813:
814: LPARAM
815: GetItemLong (HWND hTree, int itemNo)
816: {
817: LVITEM item;
818:
819: memset(&item, 0, sizeof(LVITEM));
820: item.mask = LVIF_PARAM;
821: item.iItem = itemNo;
822:
823: if (ListView_GetItem (hTree, &item) == FALSE)
824: return MAKELONG (0xffff, 0xffff);
825: else
826: return item.lParam;
827: }
828:
829: static BOOL MountVolume (HWND hwndDlg, int driveNo, char *volumePath, char *szPassword, int quiet)
830: {
831: MOUNT_STRUCT driver;
832: DWORD dwResult;
833: BOOL bResult, bDevice;
834:
835: if (IsMountedVolume (volumePath))
836: {
837: if (!quiet)
838: MessageBox(0, getstr (IDS_ALREADY_MOUNTED), lpszTitle, MB_ICONASTERISK);
839: return FALSE;
840: }
841:
842: driver.nDosDriveNo = driveNo;
843: driver.bCache = bCacheInDriver;
844: driver.time = time (NULL);
845: driver.nPasswordLen = strlen (szPassword);
846: strcpy (driver.szPassword, szPassword);
847:
848: CreateFullVolumePath ((char *) driver.wszVolume, volumePath, &bDevice);
849:
850: if (nCurrentOS == WIN_NT)
851: ToUNICODE ((char *) driver.wszVolume);
852:
853: bResult = DeviceIoControl (hDriver, MOUNT, &driver,
854: sizeof (driver), &driver, sizeof (driver), &dwResult, NULL);
855:
856: burn (&driver.szPassword, sizeof (driver.szPassword));
857:
858: if (bResult == FALSE)
859: {
860: if (!quiet)
861: handleWin32Error (hwndDlg);
862: return bResult;
863: }
864: else
865: {
866: if (driver.nReturnCode == 0)
867: {
868: if (nCurrentOS == WIN_NT)
869: {
870: char *lpszPipeName = "\\\\.\\pipe\\truecryptservice";
871: DWORD bytesRead;
872: char inbuf[80];
873: char outbuf[80];
874:
875: sprintf (outbuf, "mount %d", driver.nDosDriveNo);
876:
877: bResult = CallNamedPipe (lpszPipeName,
878: outbuf, sizeof (outbuf),
879: inbuf, sizeof (inbuf),
880: &bytesRead, NMPWAIT_WAIT_FOREVER);
881:
882: if (bResult == FALSE)
883: {
884: handleWin32Error (hwndDlg);
885: }
886: else
887: {
888: DWORD os_err = 0;
889: int err = 0;
890:
891: sscanf (inbuf, "%s %d %lu", outbuf, &err, &os_err);
892:
893: if (*inbuf == '-' && !quiet)
894: {
895: if (err == ERR_OS_ERROR)
896: {
897: SetLastError (os_err);
898: handleWin32Error (hwndDlg);
899: }
900: else
901: {
902: handleError (hwndDlg, err);
903: }
904:
905: bResult = 0;
906: }
907:
908: }
909:
910: if (bResult == FALSE && !quiet)
911: {
912: if (bQuiet == FALSE)
913: MessageBox (hwndDlg, getstr (IDS_SYMLINK), lpszTitle, ICON_HAND);
914:
915: return FALSE;
916: }
917:
918: }
919: else
920: {
921: EjectStop ((char)toupper(szFileName[0]), TRUE);
922: }
923: }
924: else
925: {
926: if (bQuiet == FALSE)
927: {
928: if (!quiet) handleError (hwndDlg, driver.nReturnCode);
929: }
930: else
931: EndMainDlg (hwndDlg);
932:
933: return FALSE;
934: }
935: }
936:
937: return TRUE;
938: }
939:
940: static BOOL IsPasswordCacheEmpty (void)
941: {
942: DWORD dw;
943: return !DeviceIoControl (hDriver, CACHE_STATUS, 0, 0, 0, 0, &dw, 0);
944: }
945:
946: static BOOL IsMountedVolume (char *volname)
947: {
948: MOUNT_LIST_STRUCT mlist;
949: DWORD dwResult;
950: int i;
951: char volume[TC_MAX_PATH*2+16];
952:
953: strcpy (volume, volname);
954: if (nCurrentOS == WIN_NT)
955: {
956: if (strstr (volname, "\\Device\\") != volname)
957: sprintf(volume, "\\??\\%s", volname);
958: ToUNICODE (volume);
959: }
960:
961: memset (&mlist, 0, sizeof (mlist));
962: DeviceIoControl (hDriver, MOUNT_LIST, &mlist,
963: sizeof (mlist), &mlist, sizeof (mlist), &dwResult,
964: NULL);
965:
966: for (i=0 ; i<26; i++)
967: if (nCurrentOS != WIN_NT && 0 == strcmp ((char *)mlist.wszVolume[i], volume)
968: || nCurrentOS == WIN_NT && 0 == wcscmp (mlist.wszVolume[i], (WCHAR *)volume))
969: return TRUE;
970:
971: return FALSE;
972: }
973:
974: static int AskUserPassword (HWND hwndDlg, char *password)
975: {
976: int result = DialogBoxParam (hInst,
977: MAKEINTRESOURCE (IDD_PASSWORD_DLG), hwndDlg,
978: (DLGPROC) PasswordDlgProc, (LPARAM) password);
979:
980: if (result != IDOK)
981: *password = 0;
982:
983: return result == IDOK;
984: }
985:
986: // GUI actions
987:
988: static void Mount (HWND hwndDlg)
989: {
990: char szPassword[MAX_PASSWORD + 1];
991: int mounted = 0;
992: int nDosDriveNo = HIWORD (GetSelectedLong (GetDlgItem (hwndDlg, IDC_DRIVELIST))) - 'A';
993:
994: burn (szPassword, sizeof (szPassword));
995: GetWindowText (GetDlgItem (hwndDlg, IDC_VOLUME), szFileName,
996: sizeof (szFileName));
997:
998: if (strlen(szFileName) == 0)
999: return;
1000:
1001: if (IsMountedVolume (szFileName))
1002: {
1003: MessageBox(0, getstr (IDS_ALREADY_MOUNTED), lpszTitle, MB_ICONASTERISK);
1004: return;
1005: }
1006:
1007: // First try cached passwords and if they fail ask user for a new one
1008: ArrowWaitCursor ();
1009: mounted = MountVolume (hwndDlg, nDosDriveNo, szFileName, "", TRUE);
1010: NormalCursor ();
1011:
1012: while (!mounted)
1013: {
1014: if (!AskUserPassword (hwndDlg, szPassword))
1015: return;
1016:
1017: ArrowWaitCursor ();
1018: mounted = MountVolume (hwndDlg, nDosDriveNo, szFileName, szPassword, FALSE);
1019: NormalCursor ();
1020: }
1021:
1022: if (mounted)
1023: {
1024: if (bBeep == TRUE)
1025: MessageBeep (MB_OK);
1026:
1027: RefreshMainDlg(hwndDlg);
1028:
1029: if (bExplore == TRUE)
1030: {
1031: ArrowWaitCursor();
1032: OpenVolumeExplorerWindow (nDosDriveNo);
1033: NormalCursor();
1034: }
1035: }
1036:
1037: burn (szPassword, sizeof (szPassword));
1038: return;
1039: }
1040:
1041: void OpenVolumeExplorerWindow (int driveNo)
1042: {
1043: char dosName[5];
1044: SHFILEINFO fInfo;
1045:
1046: sprintf (dosName, "%c:\\", (char) driveNo + 'A');
1047:
1048: // Force explorer to discover the drive
1049: SHGetFileInfo (dosName, 0, &fInfo, sizeof (fInfo), 0);
1050:
1051: ShellExecute (NULL, "open", dosName, NULL, NULL, SW_SHOWNORMAL);
1052: }
1053:
1054: static BOOL CALLBACK CloseVolumeExplorerWindowsEnum( HWND hwnd, LPARAM driveNo)
1055: {
1056: char get[128], driveStr[10];
1057: HWND h;
1058:
1059: GetClassName (hwnd, get, sizeof get);
1060:
1061: if (strcmp (get, "CabinetWClass") == 0)
1062: {
1063: sprintf (driveStr, "%c:\\", driveNo + 'A');
1064:
1065: // Title bar
1066: GetWindowText (hwnd, get, sizeof get);
1067: if (strstr (get, driveStr) == get)
1068: {
1069: PostMessage (hwnd, WM_CLOSE, 0, 0);
1070: return TRUE;
1071: }
1072:
1073: // URL edit box
1074: h = FindWindowEx (hwnd, 0, "WorkerW", 0);
1075: if (!h) return TRUE;
1076: h = FindWindowEx (h, 0, "ReBarWindow32", 0);
1077: if (!h) return TRUE;
1078: h = FindWindowEx (h, 0, "ComboBoxEx32", 0);
1079: if (h)
1080: {
1081: SendMessage (h, WM_GETTEXT, sizeof get, (LPARAM) get);
1082: if (strstr (get, driveStr) == get)
1083: PostMessage (hwnd, WM_CLOSE, 0, 0);
1084: }
1085: }
1086: return TRUE;
1087: }
1088:
1089: void CloseVolumeExplorerWindows (HWND hwnd, int driveNo)
1090: {
1091: EnumWindows (CloseVolumeExplorerWindowsEnum, (LPARAM) driveNo);
1092: }
1093:
1094: static void Dismount (HWND hwndDlg)
1095: {
1096: char *lpszPipeName = "\\\\.\\pipe\\truecryptservice";
1097: DWORD bytesRead;
1098: BOOL bResult;
1099: int nDosDriveNo;
1100: char inbuf[80];
1101: char outbuf[80];
1102:
1103: nDosDriveNo = (char) (HIWORD (GetSelectedLong (GetDlgItem (hwndDlg, IDC_DRIVELIST))) - 'A');
1104:
1105: if (nCurrentOS == WIN_NT)
1106: {
1107:
1108: if (bCloseDismountedWindows)
1109: CloseVolumeExplorerWindows (hwndDlg, nDosDriveNo);
1110:
1111: /* Unmount the volume using the TrueCryptService,
1112: this is done to allow non-administrators
1113: to unmount volumes */
1114:
1115: sprintf (outbuf, "unmount %d", nDosDriveNo);
1116:
1117: ArrowWaitCursor ();
1118:
1119: bResult = CallNamedPipe (lpszPipeName,
1120: outbuf, sizeof (outbuf),
1121: inbuf, sizeof (inbuf),
1122: &bytesRead, NMPWAIT_WAIT_FOREVER);
1123:
1124: NormalCursor ();
1125:
1126: if (bResult == FALSE)
1127: {
1128: handleWin32Error (hwndDlg);
1129: }
1130: else
1131: {
1132: DWORD os_err = 0;
1133: int err = 0;
1134:
1135: sscanf (inbuf, "%s %d %lu", outbuf, &err, &os_err);
1136:
1137: if (*inbuf == '-')
1138: {
1139: //if (err == ERR_OS_ERROR)
1140: //{
1141: // SetLastError (os_err);
1142:
1143: // handleWin32Error (hwndDlg);
1144: //}
1145: //else
1146: //{
1147: // handleError (hwndDlg, err);
1148: //}
1149: MessageBox(0, getstr (IDS_UNMOUNT_FAILED), lpszTitle, MB_ICONEXCLAMATION);
1150: }
1151: else
1152: {
1153: //if (bBeep == TRUE)
1154: // MessageBeep (MB_OK);
1155:
1156: RefreshMainDlg(hwndDlg);
1157: }
1158: }
1159:
1160: }
1161: else
1162: {
1163: int err = 0;
1164:
1165: bResult = CloseSlot (nDosDriveNo, 0, &err);
1166:
1167: if (bResult == FALSE)
1168: {
1169: handleWin32Error (hwndDlg);
1170: }
1171: else
1172: {
1173: if (err != 0)
1174: {
1175: //handleError (hwndDlg, err);
1176: MessageBox(0, getstr (IDS_UNMOUNT_FAILED), lpszTitle, MB_ICONEXCLAMATION);
1177: }
1178: else
1179: {
1180: //if (bBeep == TRUE)
1181: // MessageBeep (MB_OK);
1182:
1183: RefreshMainDlg(hwndDlg);
1184: }
1185: }
1186: }
1187:
1188: return;
1189: }
1190:
1191:
1192:
1193: static void DismountAll (HWND hwndDlg)
1194: {
1195: char *lpszPipeName = "\\\\.\\pipe\\truecryptservice";
1196: DWORD bytesRead;
1197: BOOL bResult;
1198: int nDosDriveNo;
1199: char inbuf[80];
1200: char outbuf[80];
1201:
1202: nDosDriveNo = (char) (HIWORD (GetSelectedLong (GetDlgItem (hwndDlg, IDC_DRIVELIST))) -
1203: 'A');
1204:
1205: ArrowWaitCursor();
1206:
1207: if (nCurrentOS == WIN_NT)
1208: {
1209: if (bCloseDismountedWindows)
1210: {
1211: MOUNT_LIST_STRUCT driver;
1212: DWORD dwResult;
1213:
1214: if (DeviceIoControl (hDriver, MOUNT_LIST, &driver, sizeof (driver), &driver, sizeof (driver), &dwResult, NULL))
1215: {
1216: int i;
1217: for (i = 0; i < 26; i++)
1218: if ((driver.ulMountedDrives & 1 << i))
1219: CloseVolumeExplorerWindows (hwndDlg, i);
1220:
1221: }
1222: }
1223:
1224: /* Unmount the volume using the TrueCryptService,
1225: this is done to allow non-administrators
1226: to unmount volumes */
1227:
1228: strcpy (outbuf, "unmountall");
1229:
1230: ArrowWaitCursor ();
1231:
1232: bResult = CallNamedPipe (lpszPipeName,
1233: outbuf, sizeof (outbuf),
1234: inbuf, sizeof (inbuf),
1235: &bytesRead, NMPWAIT_WAIT_FOREVER);
1236:
1237: NormalCursor ();
1238:
1239: if (bResult == FALSE)
1240: {
1241: handleWin32Error (hwndDlg);
1242: }
1243: else
1244: {
1245: DWORD os_err = 0;
1246: int err = 0;
1247:
1248: sscanf (inbuf, "%s %d %lu", outbuf, &err, &os_err);
1249:
1250: if (*inbuf == '-')
1251: {
1252: //if (err == ERR_OS_ERROR)
1253: //{
1254: // SetLastError (os_err);
1255:
1256: // handleWin32Error (hwndDlg);
1257: //}
1258: //else
1259: //{
1260: // handleError (hwndDlg, err);
1261: //}
1262:
1263: RefreshMainDlg(hwndDlg);
1264: MessageBox(0, getstr (IDS_UNMOUNT_FAILED), lpszTitle, MB_ICONEXCLAMATION);
1265: }
1266: else
1267: {
1268: if (bBeep == TRUE)
1269: MessageBeep (MB_OK);
1270: }
1271: }
1272: }
1273: else
1274: {
1275: DWORD os_error;
1276: int i, err;
1277:
1278: for (i=0; i<26; i++)
1279: CloseSlot (i, 0, &err);
1280: }
1281:
1282: RefreshMainDlg (hwndDlg);
1283: NormalCursor();
1284: }
1285:
1286: static void MountAllPartitions (HWND hwndDlg)
1287: {
1288: HWND driveList = GetDlgItem (hwndDlg, IDC_DRIVELIST);
1289: int i, n, selDrive = ListView_GetSelectionMark (driveList);
1290: char szPassword[MAX_PASSWORD + 1];
1291:
1292: // User is always asked for password as we can't tell
1293: // for sure if it is needed or not
1294: burn (szPassword, sizeof (szPassword));
1295: if (!AskUserPassword (hwndDlg, szPassword))
1296: return;
1297:
1298: ArrowWaitCursor();
1299:
1300: for (i = 0; i < 64; i++)
1301: {
1302: BOOL drivePresent = FALSE;
1303:
1304: for (n = 1; n <= 32; n++)
1305: {
1306: char szFileName[TC_MAX_PATH];
1307: OPEN_TEST_STRUCT driver;
1308:
1309: sprintf (szFileName, "\\Device\\Harddisk%d\\Partition%d", i, n);
1310: if (OpenDevice (szFileName, &driver) == TRUE && !IsMountedVolume (szFileName))
1311: {
1312: int nDosDriveNo;
1313:
1314: while (LOWORD (GetItemLong (driveList, selDrive)) != 0xffff)
1315: {
1316: if(LOWORD (GetItemLong (driveList, selDrive)) != VFREE)
1317: {
1318: selDrive++;
1319: continue;
1320: }
1321: nDosDriveNo = HIWORD(GetItemLong (driveList, selDrive)) - 'A';
1322: break;
1323: }
1324:
1325: if (LOWORD (GetItemLong (driveList, selDrive)) == 0xffff)
1326: goto ret;
1327:
1328: // First try user password then cached passwords
1329: if (MountVolume (hwndDlg, nDosDriveNo, szFileName, szPassword, TRUE)
1330: || MountVolume (hwndDlg, nDosDriveNo, szFileName, "", TRUE))
1331: {
1332: LoadDriveLetters (driveList, (HIWORD (GetItemLong (GetDlgItem (hwndDlg, IDC_DRIVELIST), selDrive))));
1333: selDrive++;
1334:
1335: if (bExplore == TRUE)
1336: {
1337: ArrowWaitCursor();
1338: OpenVolumeExplorerWindow (nDosDriveNo);
1339: NormalCursor();
1340: }
1341: }
1342: }
1343: }
1344: }
1345:
1346: ret:
1347: burn (szPassword, sizeof (szPassword));
1348: EnableDisableButtons (hwndDlg);
1349: NormalCursor();
1350: }
1351:
1352: static void ChangePassword (HWND hwndDlg)
1353: {
1354: int result;
1355:
1356: GetWindowText (GetDlgItem (hwndDlg, IDC_VOLUME), szFileName, sizeof (szFileName));
1357: if (IsMountedVolume (szFileName))
1358: {
1359: MessageBox (hwndDlg, getstr (IDS_MOUNTED_NOPWCHANGE), lpszTitle, MB_ICONEXCLAMATION);
1360: return;
1361: }
1362:
1363: result = DialogBox (hInst, MAKEINTRESOURCE (IDD_PASSWORDCHANGE_DLG), hwndDlg,
1364: (DLGPROC) PasswordChangeDlgProc);
1365:
1366: if (result == IDOK)
1367: {
1368: HWND tmp = GetDlgItem (hwndDlg, IDC_PASSWORD);
1369: MessageBox (hwndDlg, getstr (IDS_PASSWORD_CHANGED), lpszTitle, MB_ICONASTERISK);
1370: SetFocus (tmp);
1371: }
1372: }
1373:
1374: static void SelectContainer (HWND hwndDlg)
1375: {
1376: if (BrowseFiles (hwndDlg, IDS_OPEN_TITLE, szFileName) == FALSE)
1377: return;
1378:
1379: AddComboItem (GetDlgItem (hwndDlg, IDC_VOLUME), szFileName);
1380: EnableDisableButtons (hwndDlg);
1381: SetFocus (GetDlgItem (hwndDlg, IDC_PASSWORD));
1382: }
1383:
1384: static void SelectPartition (HWND hwndDlg)
1385: {
1386: int nResult = DialogBoxParam (hInst, MAKEINTRESOURCE (IDD_RAWDEVICES_DLG), hwndDlg,
1387: (DLGPROC) RawDevicesDlgProc, (LPARAM) & szFileName[0]);
1388: if (nResult == IDOK)
1389: {
1390: AddComboItem (GetDlgItem (hwndDlg, IDC_VOLUME), szFileName);
1391: EnableDisableButtons (hwndDlg);
1392: SetFocus (GetDlgItem (hwndDlg, IDC_PASSWORD));
1393: }
1394: }
1395:
1396: static void WipeCache (HWND hwndDlg)
1397: {
1398: DWORD dwResult;
1399: BOOL bResult;
1400:
1401: bResult = DeviceIoControl (hDriver, WIPE_CACHE, NULL, 0, NULL, 0, &dwResult, NULL);
1402:
1403: if (bResult == FALSE)
1404: handleWin32Error (hwndDlg);
1405: else
1406: {
1407: EnableDisableButtons (hwndDlg);
1408:
1409: if (bQuiet == FALSE)
1410: MessageBox (hwndDlg, getstr (IDS_WIPE_CACHE), lpszTitle, MB_ICONINFORMATION);
1411: }
1412: }
1413:
1414:
1415: /* Except in response to the WM_INITDIALOG message, the dialog box procedure
1416: should return nonzero if it processes the message, and zero if it does
1417: not. - see DialogProc */
1418: BOOL CALLBACK
1419: MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
1420: {
1421: WORD lw = LOWORD (wParam);
1422: WORD hw = HIWORD (wParam);
1423: if (lParam); /* remove warning */
1424:
1425: switch (uMsg)
1426: {
1427:
1428: case WM_INITDIALOG:
1429: {
1430: LoadSettings (hwndDlg);
1431:
1432: /* Call the common dialog init code */
1433: InitDialog (hwndDlg);
1434: SetDefaultUserFont (hwndDlg);
1435:
1436: SendMessage (GetDlgItem (hwndDlg, IDC_VOLUME), CB_LIMITTEXT, TC_MAX_PATH, 0);
1437:
1438: SendMessage (GetDlgItem (hwndDlg, IDC_NO_DRIVES_STATIC), WM_SETFONT, (WPARAM) hBoldFont, (LPARAM) TRUE);
1439: SetWindowText (hwndDlg, lpszTitle);
1440:
1441: BuildTree (GetDlgItem (hwndDlg, IDC_DRIVELIST));
1442:
1443: ExtractCommandLine (hwndDlg, (char *) lParam);
1444:
1445: if (*szDriveLetter != 0)
1446: {
1447: SelectItem (GetDlgItem (hwndDlg, IDC_DRIVELIST), *szDriveLetter);
1448:
1449: if(nSelectedDriveIndex > SendMessage (GetDlgItem (hwndDlg, IDC_DRIVELIST), LVM_GETITEMCOUNT, 0, 0)/2)
1450: SendMessage(GetDlgItem (hwndDlg, IDC_DRIVELIST), LVM_SCROLL, 0, 1000);
1451: }
1452:
1453: SendMessage (GetDlgItem (hwndDlg, IDC_NO_HISTORY), BM_SETCHECK, bHistory ? BST_UNCHECKED : BST_CHECKED, 0);
1454:
1455: EnableDisableButtons (hwndDlg);
1456:
1457: if (bWipe == TRUE)
1458: {
1459: SendMessage (GetDlgItem (hwndDlg, IDC_WIPE_CACHE), BM_CLICK, 0, 0);
1460: }
1461:
1462: if (bAuto == TRUE && IsWindowEnabled (GetDlgItem (hwndDlg, IDOK)))
1463: {
1464: SendMessage (GetDlgItem (hwndDlg, IDOK), BM_CLICK, 0, 0);
1465: }
1466:
1467: SetFocus (GetDlgItem (hwndDlg, IDC_DRIVELIST));
1468: }
1469: return 0;
1470:
1471: case WM_SYSCOMMAND:
1472: if (lw == IDC_ABOUT)
1473: {
1474: DialogBox (hInst, MAKEINTRESOURCE (IDD_ABOUT_DLG), hwndDlg, (DLGPROC) AboutDlgProc);
1475: return 1;
1476: }
1477: return 0;
1478:
1479: case WM_HELP:
1480: OpenPageHelp (hwndDlg);
1481: return 1;
1482:
1483: case WM_NOTIFY:
1484: // Single click in drive list
1485: if (((LPNMHDR) lParam)->code == LVN_ITEMCHANGED && (((LPNMLISTVIEW) lParam)->uNewState & LVIS_FOCUSED ))
1486: {
1487: nSelectedDriveIndex = ((LPNMLISTVIEW) lParam)->iItem;
1488: EnableDisableButtons (hwndDlg);
1489:
1490: return 1;
1491: }
1492:
1493: // Double click in drive list
1494: if (((LPNMHDR) lParam)->code == LVN_ITEMACTIVATE)
1495: {
1496: int state = GetItemLong(GetDlgItem (hwndDlg, IDC_DRIVELIST), ((LPNMITEMACTIVATE)lParam)->iItem );
1497: nSelectedDriveIndex = ((LPNMITEMACTIVATE)lParam)->iItem;
1498: if (LOWORD(state) == VMOUNTED)
1499: {
1500: // Open explorer window for mounted volume
1501: ArrowWaitCursor ();
1502: OpenVolumeExplorerWindow (HIWORD(state) - 'A');
1503: NormalCursor ();
1504: }
1505: else if (LOWORD (GetSelectedLong (GetDlgItem (hwndDlg, IDC_DRIVELIST))) == VFREE)
1506: {
1507: Mount (hwndDlg);
1508: }
1509: }
1510: return 0;
1511:
1512: case WM_ERASEBKGND:
1513: return 0;
1514:
1515: case WM_COMMAND:
1516:
1517: if (lw == IDCANCEL)
1518: {
1519: EndMainDlg (hwndDlg);
1520: return 1;
1521: }
1522:
1523: if (lw == IDHELP || lw == IDM_HELP)
1524: {
1525: OpenPageHelp (hwndDlg);
1526: return 1;
1527: }
1528:
1529: if (lw == IDM_ABOUT || lw == IDB_LOGO)
1530: {
1531: DialogBox (hInst, MAKEINTRESOURCE (IDD_ABOUT_DLG), hwndDlg, (DLGPROC) AboutDlgProc);
1532: return 1;
1533: }
1534:
1535: if ((lw == IDOK || lw == ID_MOUNT_VOLUME)
1536: && LOWORD (GetSelectedLong (GetDlgItem (hwndDlg, IDC_DRIVELIST))) == VFREE)
1537: {
1538:
1539: Mount (hwndDlg);
1540: return 1;
1541: }
1542:
1543: if ((lw == IDOK || lw == ID_MOUNT_VOLUME || lw == IDC_MOUNTALL)
1544: && LOWORD (GetSelectedLong (GetDlgItem (hwndDlg, IDC_DRIVELIST))) == 0xffff)
1545: {
1546: MessageBox (hwndDlg, "No drive selected.","TrueCrypt", MB_ICONEXCLAMATION);
1547: return 1;
1548: }
1549:
1550: if (lw == IDOK && LOWORD (GetSelectedLong (GetDlgItem (hwndDlg, IDC_DRIVELIST))) == VMOUNTED
1551: || lw == ID_UNMOUNT_VOLUME)
1552: {
1553: Dismount (hwndDlg);
1554: return 1;
1555: }
1556:
1557: if (lw == IDUNMOUNTALL)
1558: {
1559: DismountAll (hwndDlg);
1560: return 1;
1561: }
1562:
1563: if (lw == IDC_MOUNTALL)
1564: {
1565: MountAllPartitions (hwndDlg);
1566: return 1;
1567: }
1568:
1569: if (lw == IDC_BROWSE_FILES)
1570: {
1571: SelectContainer (hwndDlg);
1572: return 1;
1573: }
1574:
1575: if (lw == IDC_BROWSE_DEVICES)
1576: {
1577: SelectPartition (hwndDlg);
1578: return 1;
1579: }
1580:
1581: if (lw == IDC_CHANGE_PASSWORD)
1582: {
1583: ChangePassword (hwndDlg);
1584: return 1;
1585: }
1586:
1587: if (lw == IDC_WIPE_CACHE)
1588: {
1589: WipeCache (hwndDlg);
1590: return 1;
1591: }
1592:
1593: if (lw == IDC_CLEAR_HISTORY)
1594: {
1595: ClearCombo (GetDlgItem (hwndDlg, IDC_VOLUME));
1596: DumpCombo (GetDlgItem (hwndDlg, IDC_VOLUME), "LastMountedVolume", TRUE);
1597: EnableDisableButtons (hwndDlg);
1598: return 1;
1599: }
1600:
1601: if (lw == IDC_CREATE_VOLUME)
1602: {
1603: char t[TC_MAX_PATH];
1604: char *tmp;
1605:
1606: GetModuleFileName (NULL, t, sizeof (t));
1607: tmp = strrchr (t, '\\');
1608: if (tmp)
1609: {
1610: strcpy (++tmp, "TrueCrypt Format.exe");
1611: ShellExecute (NULL, "open", t, NULL, NULL, SW_SHOWNORMAL);
1612: }
1613: return 1;
1614: }
1615:
1616: if (lw == ID_WEBSITE)
1617: {
1618: ShellExecute (NULL, "open", "http://www.truecrypt.org", NULL, NULL, SW_SHOWNORMAL);
1619: return 1;
1620: }
1621:
1622: if (lw == ID_PREFERENCES)
1623: {
1624: DialogBoxParam (hInst,
1625: MAKEINTRESOURCE (IDD_PREFERENCES_DLG), hwndDlg,
1626: (DLGPROC) PreferencesDlgProc, (LPARAM) 0);
1627: return 1;
1628: }
1629:
1630: if (lw == IDC_VOLUME_PROPERTIES)
1631: {
1632: DialogBoxParam (hInst,
1633: MAKEINTRESOURCE (IDD_VOLUME_PROPERTIES), hwndDlg,
1634: (DLGPROC) VolumePropertiesDlgProc, (LPARAM) 0);
1635: return 1;
1636: }
1637:
1638: if (lw == IDC_VOLUME && hw == CBN_EDITCHANGE)
1639: {
1640: PostMessage (hwndDlg, WM_USER, 0, 0);
1641: return 1;
1642: }
1643:
1644: if (lw == IDC_VOLUME && hw == CBN_SELCHANGE)
1645: {
1646: UpdateComboOrder (GetDlgItem (hwndDlg, IDC_VOLUME));
1647: MoveEditToCombo ((HWND) lParam);
1648: PostMessage (hwndDlg, WM_USER, 0, 0);
1649: return 1;
1650: }
1651:
1652: return 0;
1653:
1654: case WM_USER:
1655: EnableDisableButtons (hwndDlg);
1656: return 1;
1657:
1658: case WM_CLOSE:
1659: EndMainDlg (hwndDlg);
1660: return 1;
1661: }
1662:
1663: return 0;
1664: }
1665:
1666: void
1667: ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
1668: {
1669: char **lpszCommandLineArgs; /* Array of command line arguments */
1670: int nNoCommandLineArgs; /* The number of arguments in the array */
1671:
1672: /* Extract command line arguments */
1673: nNoCommandLineArgs = Win32CommandLine (lpszCommandLine, &lpszCommandLineArgs);
1674: if (nNoCommandLineArgs > 0)
1675: {
1676: int i;
1677:
1678: for (i = 0; i < nNoCommandLineArgs; i++)
1679: {
1680: argument args[]=
1681: {
1682: {"/volume", "/v"},
1683: {"/letter", "/l"},
1684: {"/explore", "/e"},
1685: {"/beep", "/b"},
1686: {"/password", "/p"},
1687: {"/auto", "/a"},
1688: {"/cache", "/c"},
1689: {"/history", "/h"},
1690: {"/wipecache", "/wc"},
1691: {"/quiet", "/q"},
1692: {"/help", "/?"},
1693: {"/dismountall", "/d"}
1694: };
1695:
1696: argumentspec as;
1697:
1698: int nArgPos;
1699: int x;
1700:
1701: as.args = args;
1702: as.arg_cnt = sizeof(args)/ sizeof(args[0]);
1703:
1704: x = GetArgumentID (&as, lpszCommandLineArgs[i], &nArgPos);
1705:
1706: switch (x)
1707: {
1708: case 'd':
1709: DismountAll (hwndDlg);
1710: ExitProcess (0);
1711: break;
1712:
1713: case 'v':
1714: if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, nArgPos, &i,
1715: nNoCommandLineArgs, szFileName, sizeof (szFileName)))
1716: AddComboItem (GetDlgItem (hwndDlg, IDC_VOLUME), szFileName);
1717: break;
1718:
1719: case 'l':
1720: GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, nNoCommandLineArgs,
1721: szDriveLetter, sizeof (szDriveLetter));
1722: *szDriveLetter = (char) toupper (*szDriveLetter);
1723: break;
1724:
1725: case 'e':
1726: bExplore = TRUE;
1727: break;
1728:
1729: case 'b':
1730: bBeep = TRUE;
1731: break;
1732:
1733: case 'p':
1734: {
1735: char szTmp[MAX_PASSWORD + 1];
1736:
1737: GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, nNoCommandLineArgs,
1738: szTmp, sizeof (szTmp));
1739:
1740: if (strlen(szTmp) == 1 && *szTmp == '?')
1741: {
1742:
1743: int result = DialogBoxParam (hInst,
1744: MAKEINTRESOURCE (IDD_PASSWORD_DLG), hwndDlg,
1745: (DLGPROC) PasswordDlgProc, (LPARAM) szTmp);
1746:
1747: if (result != IDOK)
1748: *szTmp = 0;
1749: }
1750:
1751: SetWindowText (GetDlgItem (hwndDlg, IDC_PASSWORD), szTmp);
1752: burn (szTmp, sizeof (szTmp));
1753: }
1754: break;
1755:
1756: case 'a':
1757: bAuto = TRUE;
1758: break;
1759:
1760: case 'c':
1761: {
1762: char szTmp[8];
1763: GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, nNoCommandLineArgs,
1764: szTmp, sizeof (szTmp));
1765: if (!_stricmp(szTmp,"y") || !_stricmp(szTmp,"yes"))
1766: bCacheInDriver = TRUE;
1767: if (!_stricmp(szTmp,"n") || !_stricmp(szTmp,"no"))
1768: bCacheInDriver = FALSE;
1769: }
1770: break;
1771:
1772: case 'h':
1773: {
1774: char szTmp[8];
1775: GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, nNoCommandLineArgs,
1776: szTmp, sizeof (szTmp));
1777: if (!_stricmp(szTmp,"y") || !_stricmp(szTmp,"yes"))
1778: {
1779: bHistory = TRUE;
1780: bHistoryCmdLine = TRUE;
1781: }
1782:
1783: if (!_stricmp(szTmp,"n") || !_stricmp(szTmp,"no"))
1784: {
1785: bHistory = FALSE;
1786: bHistoryCmdLine = TRUE;
1787: }
1788: }
1789: break;
1790:
1791: case 'w':
1792: bWipe = TRUE;
1793: break;
1794:
1795: case 'q':
1796: bQuiet = TRUE;
1797: break;
1798:
1799: case '?':
1800: DialogBoxParam (hInst, MAKEINTRESOURCE (IDD_COMMANDHELP_DLG), hwndDlg, (DLGPROC)
1801: CommandHelpDlgProc, (LPARAM) &as);
1802: exit(0);
1803: break;
1804:
1805: // no option = file name
1806: default:
1807: AddComboItem (GetDlgItem (hwndDlg, IDC_VOLUME), lpszCommandLineArgs[0]);
1808: }
1809: }
1810: }
1811:
1812: /* Free up the command line arguments */
1813: while (--nNoCommandLineArgs >= 0)
1814: {
1815: free (lpszCommandLineArgs[nNoCommandLineArgs]);
1816: }
1817: }
1818:
1819: int WINAPI
1820: WINMAIN (HINSTANCE hInstance, HINSTANCE hPrevInstance, char *lpszCommandLine,
1821: int nCmdShow)
1822: {
1823: int status;
1824:
1825: if (nCmdShow && hPrevInstance); /* Remove unused parameter warning */
1826:
1827: atexit (localcleanup);
1828:
1829: /* Allocate, dup, then store away the application title */
1830: lpszTitle = err_strdup (getstr (IDS_TITLE));
1831:
1832: /* Call InitApp to initialize the common code */
1833: InitApp (hInstance);
1834:
1835: status = DriverAttach ();
1836: if (status != 0)
1837: {
1838: if (status == ERR_OS_ERROR)
1839: handleWin32Error (NULL);
1840: else
1841: handleError (NULL, status);
1842:
1843: AbortProcess (IDS_NODRIVER);
1844: }
1845:
1846: /* Create the main dialog box */
1847: DialogBoxParam (hInstance, MAKEINTRESOURCE (IDD_MOUNT_DLG), NULL, (DLGPROC) MainDialogProc,
1848: (LPARAM) lpszCommandLine);
1849:
1850: /* Terminate */
1851: return 0;
1852: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.