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