dc_pass *__get_pass_keyfiles( HWND h_pass, BOOL use_keyfiles, int key_list ) { dc_pass *pass; wchar_t *s_pass; size_t plen; int rlt; if ( (pass = secure_alloc(sizeof(dc_pass))) == NULL ) { return NULL; } if ( (s_pass = secure_alloc((MAX_PASSWORD + 1) * sizeof(wchar_t))) == NULL) { return NULL; } GetWindowText( h_pass, s_pass, MAX_PASSWORD + 1 ); if ( wcslen(s_pass) > 0 ) { plen = wcslen(s_pass) * sizeof(wchar_t); pass->size = d32( min( plen, MAX_PASSWORD * sizeof(wchar_t) ) ); mincpy( &pass->pass, s_pass, pass->size ); secure_free( s_pass ); } if ( use_keyfiles ) { _list_key_files *key_file; if ( key_file = _first_keyfile(key_list) ) { do { rlt = dc_add_keyfiles( pass, key_file->path ); if ( rlt != ST_OK ) { __error_s( GetParent(h_pass), L"Keyfiles not loaded", rlt ); secure_free( pass ); pass = NULL; break; } key_file = _next_keyfile( key_file, key_list ); } while ( key_file != NULL ); } } return pass; }
void _reboot( ) { int rlt; if ( (rlt = enable_privilege(SE_SHUTDOWN_NAME)) == ST_OK ) { ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0); ExitProcess(0); } else { __error_s( HWND_DESKTOP, NULL, rlt ); } }
BOOL _is_removable_media( int dsk_num ) { dc_disk_p *d_info; BOOL rem_media = FALSE; d_info = dc_disk_open( dsk_num, FALSE ); if ( d_info != NULL ) { rem_media = d_info->media == RemovableMedia; dc_disk_close( d_info ); } else { __error_s( __dlg, L"Error get volume information", ST_ACCESS_DENIED ); } return rem_media; }
int WINAPI wWinMain( HINSTANCE hinst, HINSTANCE hprev, LPWSTR cmd_line, int cmd_show ) { int rlt; int ver; int app_start = on_app_start( cmd_line ); #ifdef LOG_FILE _log( L"%0.8X app start", app_start ); #endif if ( app_start == ST_NEED_EXIT ) { return 0; } if ( _ui_init(hinst) == 0 ) { __error_s( HWND_DESKTOP, L"Error GUI initialization", ST_OK ); return 0; } if ( is_admin( ) != ST_OK ) { __error_s( HWND_DESKTOP, L"Admin Privileges Required", ST_OK ); return 0; } #ifdef _M_IX86 if ( is_wow64( ) != 0 ) { __error_s( HWND_DESKTOP, L"Please use x64 version of DiskCryptor", ST_OK ); return 0; } #endif if ( dc_is_old_runned( ) != 0 ) { __error_s( HWND_DESKTOP, L"DiskCryptor 0.1-0.4 installed, please completely uninstall it before use this version.", ST_OK ); return 0; } #ifdef LOG_FILE _log( L"%0.8X driver status", dc_driver_status( ) ); #endif if ( dc_is_driver_works( ) == FALSE ) { if ( ( rlt = _drv_action(DA_INSTAL, 0) ) != NO_ERROR ) { __error_s( HWND_DESKTOP, NULL, rlt ); } return 0; } if ( ( rlt = dc_open_device( ) ) != ST_OK ) { __error_s( HWND_DESKTOP, L"Can not open DC device", rlt ); return 0; } ver = dc_get_version( ); #ifdef LOG_FILE _log( L"%0.8X dc version", ver ); #endif if ( ver < DC_DRIVER_VER ) { if ( ( rlt = _drv_action(DA_UPDATE, ver) ) != NO_ERROR ) { __error_s( HWND_DESKTOP, NULL, rlt ); } return 0; } if ( ver > DC_DRIVER_VER ) { __msg_i( HWND_DESKTOP, L"DiskCryptor driver v%d detected\n" L"Please use last program version", ver ); return 0; } { HWND h_find; WNDCLASS wc = { 0 }; wc.lpszClassName = DC_CLASS; wc.lpfnWndProc = &_class_dlg_proc; wc.cbWndExtra = DLGWINDOWEXTRA; wc.hIcon = LoadIcon(hinst, MAKEINTRESOURCE(IDI_ICON_TRAY)); dlg_class = RegisterClass(&wc); #ifdef LOG_FILE _log( L"%0.8X register class", dlg_class ); #endif h_find = FindWindow(DC_CLASS, NULL); #ifdef LOG_FILE _log( L"%0.8X find window", h_find ); #endif if ( h_find != NULL ) { ShowWindow( h_find, SW_SHOW ); SetForegroundWindow( h_find ); #ifdef LOG_FILE _log( L"show window [ %0.8X ] return", h_find ); #endif return 0; } } if ( ( rlt = rnd_init( ) ) != ST_OK ) { __error_s( HWND_DESKTOP, L"Can not initialize RNG", rlt ); return 0; } if ( (rlt = dc_load_config(&__config) == NO_ERROR ? ST_OK : ST_ERROR) != ST_OK ) { __error_s( HWND_DESKTOP, L"Error get config", rlt ); return 0; } InitializeCriticalSection( &crit_sect ); #ifdef LOG_FILE _log( L"initialize critical section" ); #endif _init_list_head( &__drives ); _init_list_head( &__action ); _init_keyfiles_list( ); #ifdef LOG_FILE _log( L"init keyfiles list" ); #endif { HWND h_dialog; MSG msg; __hacc = LoadAccelerators( hinst, MAKEINTRESOURCE(IDR_MAIN_ACCEL) ); #ifdef LOG_FILE _log( L"before create dialog" ); #endif h_dialog = CreateDialog( GetModuleHandleA(NULL), MAKEINTRESOURCE(IDD_MAIN_DLG), HWND_DESKTOP, _main_dialog_proc ); #ifdef LOG_FILE _log( L"%0.8X create dialog", h_dialog ); #endif rlt = ShowWindow( h_dialog, app_start == ST_AUTORUNNED ? SW_HIDE : SW_SHOW ); #ifdef LOG_FILE _log( L"%0.8X show window", rlt ); #endif while ( GetMessage( &msg, NULL, 0, 0 ) ) { if ( !TranslateAccelerator( h_dialog, __hacc, &msg ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } } DestroyAcceleratorTable( __hacc ); } return TRUE; }
void _run_wizard_action( HWND hwnd, _wz_sheets *sheets, _dnode *node ) { BOOL set_loader = (BOOL) SendMessage( GetDlgItem(sheets[WPAGE_ENC_BOOT].hwnd, IDC_COMBO_BOOT_INST), CB_GETCURSEL, 0, 0 ); wchar_t *fs_name = fs_names[SendMessage( GetDlgItem(sheets[WPAGE_ENC_FRMT].hwnd, IDC_COMBO_FS_LIST), CB_GETCURSEL, 0, 0 )]; int kb_layout = _get_combo_val( GetDlgItem(sheets[WPAGE_ENC_PASS].hwnd, IDC_COMBO_KBLAYOUT), kb_layouts ); BOOL q_format = _get_check( sheets[WPAGE_ENC_FRMT].hwnd, IDC_CHECK_QUICK_FORMAT ); int is_small = ( IsWindowEnabled( GetDlgItem( sheets[WPAGE_ENC_CONF].hwnd, IDC_COMBO_ALGORT ) ) ? FALSE : TRUE ); crypt_info crypt; dc_pass *pass = NULL; crypt.cipher_id = _get_combo_val( GetDlgItem(sheets[WPAGE_ENC_CONF].hwnd, IDC_COMBO_ALGORT), cipher_names ); crypt.wp_mode = _get_combo_val( GetDlgItem(sheets[WPAGE_ENC_CONF].hwnd, IDC_COMBO_PASSES), wipe_modes ); node->dlg.rlt = ST_ERROR; switch ( node->dlg.act_type ) { /////////////////////////////////////////////////////////////// case ACT_REENCRYPT : /////////////////////////////////////////////////////////////// /////// REENCRYPT VOLUME ////////////////////////////////////// { wchar_t mnt_point[MAX_PATH] = { 0 }; wchar_t vol[MAX_PATH]; dlgpass dlg_info = { node, NULL, NULL, mnt_point }; ShowWindow(hwnd, FALSE); if ( _dlg_get_pass(__dlg, &dlg_info) == ST_OK ) { node->mnt.info.status.crypt.wp_mode = crypt.wp_mode; node->dlg.rlt = dc_start_re_encrypt( node->mnt.info.device, dlg_info.pass, &crypt ); secure_free( dlg_info.pass ); if ( mnt_point[0] != 0 ) { _snwprintf( vol, sizeof_w(vol), L"%s\\", node->mnt.info.w32_device ); _set_trailing_slash( mnt_point ); if ( SetVolumeMountPoint(mnt_point, vol) == 0 ) { __error_s( __dlg, L"Error when adding mount point", node->dlg.rlt ); } } } else { node->dlg.rlt = ST_CANCEL; } } break; /////////////////////////////////////////////////////////////// case ACT_ENCRYPT_CD : /////////////////////////////////////////////////////////////// /////// ENCRYPT CD //////////////////////////////////////////// { _init_speed_stat( &node->dlg.iso.speed ); pass = _get_pass_keyfiles( sheets[WPAGE_ENC_PASS].hwnd, IDE_PASS, IDC_USE_KEYFILES, KEYLIST_CURRENT ); if ( pass ) { DWORD resume; { wchar_t s_src_path[MAX_PATH] = { 0 }; wchar_t s_dst_path[MAX_PATH] = { 0 }; GetWindowText( GetDlgItem(sheets[WPAGE_ENC_ISO].hwnd, IDE_ISO_SRC_PATH), s_src_path, sizeof_w(s_src_path) ); GetWindowText( GetDlgItem(sheets[WPAGE_ENC_ISO].hwnd, IDE_ISO_DST_PATH), s_dst_path, sizeof_w(s_dst_path) ); wcscpy( node->dlg.iso.s_iso_src, s_src_path ); wcscpy( node->dlg.iso.s_iso_dst, s_dst_path ); node->dlg.iso.cipher_id = crypt.cipher_id; node->dlg.iso.pass = pass; } node->dlg.iso.h_thread = CreateThread( NULL, 0, _thread_enc_iso_proc, pv(node), CREATE_SUSPENDED, NULL ); SetThreadPriority( node->dlg.iso.h_thread, THREAD_PRIORITY_LOWEST ); resume = ResumeThread( node->dlg.iso.h_thread ); if ( !node->dlg.iso.h_thread || resume == (DWORD) -1 ) { __error_s( hwnd, L"Error create thread", -1 ); secure_free(pass); } } } break; /////////////////////////////////////////////////////////////// default : /////////////////////////////////////////////////////////////// { node->mnt.info.status.crypt.wp_mode = crypt.wp_mode; node->dlg.rlt = ST_OK; if ( sheets[WPAGE_ENC_BOOT].show ) { if ( set_loader ) { node->dlg.rlt = _set_boot_loader( hwnd, -1, is_small ); } } if ( ( node->dlg.rlt == ST_OK ) && ( IsWindowEnabled( GetDlgItem( sheets[WPAGE_ENC_PASS].hwnd, IDC_LAYOUTS_LIST ) ) ) ) { node->dlg.rlt = _update_layout( node, kb_layout, NULL ); } if ( node->dlg.rlt == ST_OK ) { switch ( node->dlg.act_type ) { /////////////////////////////////////////////////////////////// case ACT_ENCRYPT : /////////////////////////////////////////////////////////////// /////// ENCRYPT VOLUME //////////////////////////////////////// { pass = _get_pass_keyfiles( sheets[WPAGE_ENC_PASS].hwnd, IDE_PASS, IDC_USE_KEYFILES, KEYLIST_CURRENT ); if ( pass != NULL ) { node->dlg.rlt = dc_start_encrypt( node->mnt.info.device, pass, &crypt ); secure_free(pass); } } break; /////////////////////////////////////////////////////////////// case ACT_FORMAT : /////////////////////////////////////////////////////////////// /////// FORMAT VOLUME ///////////////////////////////////////// { pass = _get_pass_keyfiles( sheets[WPAGE_ENC_PASS].hwnd, IDE_PASS, IDC_USE_KEYFILES, KEYLIST_CURRENT ); if ( pass ) { node->dlg.rlt = dc_start_format( node->mnt.info.device, pass, &crypt ); secure_free(pass); } } break; } } } } node->dlg.q_format = q_format; node->dlg.fs_name = fs_name; if ( !node->dlg.iso.h_thread ) { EndDialog( hwnd, 0 ); } }
static DWORD WINAPI _thread_enc_dec_proc( LPVOID lparam ) { BOOL encrypting; int i = 0; int rlt, wp_mode; wchar_t device[MAX_PATH]; _dnode *node; _dact *act; dc_open_device( ); EnterCriticalSection( &crit_sect ); node = pv(lparam); act = _create_act_thread(node, -1, -1); if ( !node || !act ) { return 0L; } wcscpy( device, act->device ); do { if ( act->status != ACT_RUNNING ) { break; } if ( i-- == 0 ) { dc_sync_enc_state( device ); i = 20; } encrypting = act->act != ACT_DECRYPT; wp_mode = act->wp_mode; LeaveCriticalSection( &crit_sect ); rlt = encrypting ? dc_enc_step(device, wp_mode) : dc_dec_step(device); EnterCriticalSection(&crit_sect); if ( rlt == ST_FINISHED ) { act->status = ACT_STOPPED; break; } if ( rlt == ST_CANCEL ) { Sleep(5000); } if ( ( rlt != ST_OK ) && ( rlt != ST_RW_ERR ) && ( rlt != ST_CANCEL ) ) { dc_status st; wchar_t *act_name; dc_get_device_status( device, &st ); switch ( act->act ) { case ACT_ENCRYPT: act_name = L"Encryption"; break; case ACT_DECRYPT: act_name = L"Decryption"; break; case ACT_REENCRYPT: act_name = L"Reencryption"; break; } __error_s( HWND_DESKTOP, L"%s error on volume [%s]", rlt, act_name, st.mnt_point ); act->status = ACT_STOPPED; break; } } while (1); dc_sync_enc_state(device); LeaveCriticalSection(&crit_sect); return 1L; }
DWORD WINAPI _thread_format_proc( LPVOID lparam ) { int i = 0; int rlt, wp_mode; wchar_t device[MAX_PATH]; _dnode *node; _dact *act; dc_open_device( ); EnterCriticalSection(&crit_sect); node = pv(lparam); act = _create_act_thread(node, -1, -1); if ( !node || !act ) { return 0L; } wcscpy(device, act->device); do { if ( act->status != ACT_RUNNING ) { break; } if ( i-- == 0 ) { dc_sync_enc_state(device); i = 20; } wp_mode = act->wp_mode; LeaveCriticalSection( &crit_sect ); rlt = dc_format_step( device, wp_mode ); EnterCriticalSection( &crit_sect ); if ( rlt == ST_FINISHED ) { act->status = ACT_STOPPED; break; } if ( ( rlt != ST_OK ) && ( rlt != ST_RW_ERR ) ) { dc_status st; dc_get_device_status( device, &st ); __error_s( HWND_DESKTOP, L"Format error on volume [%s]", rlt, st.mnt_point ); act->status = ACT_STOPPED; break; } } while (1); if ( rlt == ST_FINISHED ) { _finish_formating( node ); } LeaveCriticalSection( &crit_sect ); return 1L; }
_dact *_create_act_thread( _dnode *node, int act_type, // -1 - search int act_status // ) { list_entry *item; _dact *act; DWORD resume; BOOL exist = FALSE; if ( !node ) { return NULL; } _clear_act_list( ); for ( item = __action.flink; item != &__action; item = item->flink ) { act = contain_record(item, _dact, list); if ( !wcscmp(act->device, node->mnt.info.device) ) { exist = TRUE; if ( act_type == -1 ) { return act; } else { break; } } } if ( act_type != -1 ) { if ( !exist ) { act = malloc(sizeof(_dact)); memset(act, 0, sizeof(_dact)); act->wp_mode = node->mnt.info.status.crypt.wp_mode; wcsncpy( act->device, node->mnt.info.device, MAX_PATH ); _init_speed_stat( &act->speed ); } act->h_thread = NULL; act->status = act_status; act->act = act_type; if ( act_status == ACT_RUNNING ) { void *proc; switch (act_type) { case ACT_REENCRYPT: case ACT_ENCRYPT: case ACT_DECRYPT: proc = _thread_enc_dec_proc; break; case ACT_FORMAT: proc = _thread_format_proc; break; } act->h_thread = CreateThread( NULL, 0, proc, pv(node), CREATE_SUSPENDED, NULL ); SetThreadPriority(act->h_thread, THREAD_PRIORITY_LOWEST); resume = ResumeThread(act->h_thread); if ( !act->h_thread || resume == (DWORD)-1 ) { free(act); __error_s( __dlg, L"Error create thread", -1 ); return NULL; } } if ( !exist ) { _insert_tail_list(&__action, &act->list); } return act; } return NULL; }
INT_PTR CALLBACK _main_dialog_proc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam ) { WORD id = LOWORD(wparam); WORD code = HIWORD(wparam); _wnd_data *wnd; _dnode *sel; _dmnt *mnt; int k = 0; switch ( message ) { case WM_INITDIALOG : { memset( __lists, HWND_NULL, sizeof(__lists) ); __lists[HMAIN_DRIVES] = GetDlgItem( hwnd, IDC_DISKDRIVES ); __dlg = hwnd; _init_main_dlg( hwnd ); _load_diskdrives( hwnd, &__drives, _list_volumes(0) ); { TCITEM tab_item = { TCIF_TEXT }; HWND h_tab = GetDlgItem(hwnd, IDT_INFO); _tab_data *d_tab = malloc(sizeof(_tab_data)); zeroauto( d_tab, sizeof(_tab_data) ); d_tab->curr_tab = 1; wnd_set_long( hwnd, GWL_USERDATA, d_tab ); wnd = _sub_class( h_tab, SUB_NONE, CreateDialog( __hinst, MAKEINTRESOURCE(DLG_MAIN_INFO), GetDlgItem(hwnd, IDC_MAIN_TAB), _tab_proc ), CreateDialog( __hinst, MAKEINTRESOURCE(DLG_MAIN_ACTION), GetDlgItem(hwnd, IDC_MAIN_TAB), _tab_proc ), HWND_NULL ); { __lists[HMAIN_INFO] = GetDlgItem( wnd->dlg[0], IDC_INF_TABLE ); __lists[HMAIN_ACT] = GetDlgItem( wnd->dlg[1], IDC_ACT_TABLE ); } { __dlg_act_info = wnd->dlg[1]; _list_insert_col( __lists[HMAIN_INFO], 380 ); _list_insert_col( __lists[HMAIN_INFO], 90 ); while ( _list_insert_item( __lists[HMAIN_INFO], k, 0, _info_table_items[k], 0 ) ) k++; _set_header_text( __lists[HMAIN_INFO], 0, STR_HEAD_NO_ICONS, sizeof_w(STR_HEAD_NO_ICONS) ); _list_insert_col( __lists[HMAIN_ACT], 90 ); _list_insert_col( __lists[HMAIN_ACT], 70 ); _list_insert_col( __lists[HMAIN_ACT], 85 ); _list_insert_col( __lists[HMAIN_ACT], 50 ); _list_insert_item( __lists[HMAIN_ACT], 0, 0, _act_table_items[0], 0 ); ListView_SetItemText( __lists[HMAIN_ACT], 0, 2, _act_table_items[3] ); _list_insert_item( __lists[HMAIN_ACT], 1, 0, _act_table_items[1], 0 ); ListView_SetItemText( __lists[HMAIN_ACT], 1, 2, _act_table_items[4] ); _init_combo( GetDlgItem( __dlg_act_info, IDC_COMBO_PASSES), wipe_modes, WP_NONE, FALSE, -1 ); SendMessage( GetDlgItem( __dlg_act_info, IDC_PROGRESS ), PBM_SETBARCOLOR, 0, _cl( COLOR_BTNSHADOW, DARK_CLR - 20 ) ); SendMessage( GetDlgItem( __dlg_act_info, IDC_PROGRESS ), PBM_SETRANGE, 0, MAKELPARAM(0, PRG_STEP) ); } tab_item.pszText = L"Info"; TabCtrl_InsertItem( h_tab, 0, &tab_item ); { NMHDR mhdr = { 0, 0, TCN_SELCHANGE }; TabCtrl_SetCurSel( h_tab, 0 ); SendMessage(hwnd, WM_NOTIFY, IDT_INFO, (LPARAM)&mhdr); } } SendMessage( hwnd, WM_SYSCOLORCHANGE, 0, 0 ); _set_timer( MAIN_TIMER, TRUE, TRUE ); _set_timer( RAND_TIMER, TRUE, FALSE ); _set_timer( POST_TIMER, TRUE, FALSE ); return 0L; } break; case WM_WINDOWPOSCHANGED : { WINDOWPOS *pos = (WINDOWPOS *)lparam; int flags = pos->flags; _dlg_right = pos->cx + pos->x; _dlg_bottom = pos->cy + pos->y; _dlg_left = pos->x; if ( ( flags & SWP_SHOWWINDOW ) || ( flags & SWP_HIDEWINDOW ) ) { _set_timer( MAIN_TIMER, flags & SWP_SHOWWINDOW, TRUE ); } return 0L; } break; case WM_ENTERSIZEMOVE : { //_middle_ctl( // GetDlgItem(hwnd, IDC_DISKDRIVES), // GetDlgItem(hwnd, IDC_RESIZING), // TRUE // ); //ShowWindow(GetDlgItem(hwnd, IDC_DISKDRIVES), SW_HIDE); return 0L; } break; case WM_EXITSIZEMOVE : { //ShowWindow(GetDlgItem(hwnd, IDC_DISKDRIVES), SW_SHOW); return 0L; } break; case WM_SIZING : { RECT *rect = ((RECT *)lparam); rect->right = _dlg_right; rect->left = _dlg_left; if ( rect->bottom - rect->top < MAIN_DLG_MIN_HEIGHT ) { rect->bottom = rect->top + MAIN_DLG_MIN_HEIGHT; } return 1L; } break; case WM_SIZE : { int height = HIWORD(lparam); int width = LOWORD(lparam); int k; _size_move_ctls _resize[ ] = { { -1, IDC_DISKDRIVES, FALSE, 0, 0 }, { -1, IDC_STATIC_LIST, TRUE, 0, 0 }, { -1, IDC_STATIC_RIGHT, TRUE, 0, 0 } }; _size_move_ctls _move[ ] = { { IDC_STATIC_LIST, IDC_MAIN_TAB, TRUE, 0, 6 }, { IDC_STATIC_LIST, IDT_INFO, FALSE, 0, 3 }, { IDT_INFO, IDC_LINE_BOTTOM, TRUE, 0, 2 } }; { int c_size_hide = _main_headers[1].width; int c_size_show = c_size_hide - GetSystemMetrics(SM_CXVSCROLL); int c_size_curr = ListView_GetColumnWidth( __lists[HMAIN_DRIVES], 1 ); if ( GetWindowLong(__lists[HMAIN_DRIVES], GWL_STYLE) & WS_VSCROLL ) { if ( c_size_curr != c_size_show ) ListView_SetColumnWidth( __lists[HMAIN_DRIVES], 1, c_size_show ); } else { if ( c_size_curr != c_size_hide ) ListView_SetColumnWidth( __lists[HMAIN_DRIVES], 1, c_size_hide ); } } if ( height == 0 || width == 0 ) { return 0L; } for ( k = 0; k < array_num(_resize); k++ ) { _resize_ctl( GetDlgItem(hwnd, _resize[k].id), height - _dlg_height, 0, _resize[k].val ); } _dlg_height = height; for ( k = 0; k < array_num(_move); k++ ) { _relative_move( GetDlgItem( hwnd, _move[k].anchor ), GetDlgItem( hwnd, _move[k].id ), _move[k].dy, _move[k].dy, _move[k].val ); InvalidateRect( GetDlgItem( hwnd, _move[k].id ), NULL, TRUE ); } _middle_ctl( GetDlgItem( hwnd, IDC_DISKDRIVES ), GetDlgItem( hwnd, IDC_RESIZING ), TRUE ); return 0L; } break; case WM_SYSCOMMAND : { if ( wparam == SC_MINIMIZE || wparam == SC_RESTORE ) { _set_timer( MAIN_TIMER, wparam == SC_RESTORE, TRUE ); } return 0L; } break; case WM_APP + WM_APP_SHOW : { ShowWindow( hwnd, SW_HIDE ); } break; case WM_NOTIFY : { if ( wparam == IDT_INFO ) { if ( ((NMHDR *)lparam)->code == TCN_SELCHANGE ) { HWND h_tab = GetDlgItem( hwnd, IDT_INFO ); if ( !_is_curr_in_group(h_tab) ) { _change_page( h_tab, TabCtrl_GetCurSel(h_tab) ); } } } if ( wparam == IDC_DISKDRIVES ) { sel = pv( _get_sel_item( __lists[HMAIN_DRIVES] ) ); mnt = &sel->mnt; if ( ((NMHDR *)lparam)->code == LVN_ITEMCHANGED && (((NMLISTVIEW *)lparam)->uNewState & LVIS_FOCUSED ) ) { _update_info_table( FALSE ); _activate_page( ); _refresh_menu( ); return 1L; } if ( ((NMHDR *)lparam)->code == LVN_ITEMACTIVATE ) { BOOL mount = ( !(sel->mnt.info.status.flags & F_ENABLED) ) && ( sel->mnt.fs[0] == '\0' ); if (! mount ) { if (! sel->is_root ) __execute( mnt->info.status.mnt_point ); } else { _menu_mount( sel ); } } switch( ((NM_LISTVIEW *)lparam)->hdr.code ) { case LVN_KEYDOWN : { WORD key = ((NMLVKEYDOWN *)lparam)->wVKey; int item = ListView_GetSelectionMark( __lists[HMAIN_DRIVES] ); switch ( key ) { case VK_UP: item -= 1; break; case VK_DOWN: item += 1; break; } if ( _is_root_item(_get_item_index( __lists[HMAIN_DRIVES], item )) ) { ListView_SetItemState( __lists[HMAIN_DRIVES], item, LVIS_FOCUSED, TRUE ); } if ( key != VK_APPS ) { break; } } case NM_RCLICK : { int item; HMENU h_popup = CreatePopupMenu( ); _dact *act = _create_act_thread( sel, -1, -1 ); _update_info_table( FALSE ); _activate_page( ); _set_timer(MAIN_TIMER, FALSE, FALSE); _refresh_menu( ); if ( ListView_GetSelectedCount( __lists[HMAIN_DRIVES] ) && !_is_root_item((LPARAM)sel) && _is_active_item((LPARAM)sel) ) { if ( mnt->info.status.flags & F_ENABLED ) { if ( mnt->info.status.flags & F_CDROM ) { AppendMenu( h_popup, MF_STRING, ID_VOLUMES_UNMOUNT, IDS_UNMOUNT ); } else { if ( mnt->info.status.flags & F_FORMATTING ) { AppendMenu( h_popup, MF_STRING, ID_VOLUMES_FORMAT, IDS_FORMAT ); } else { if ( IS_UNMOUNTABLE(&mnt->info.status) ) { AppendMenu( h_popup, MF_STRING, ID_VOLUMES_UNMOUNT, IDS_UNMOUNT ); } if ( !(mnt->info.status.flags & F_SYNC) ) { AppendMenu( h_popup, MF_SEPARATOR, 0, NULL ); AppendMenu( h_popup, MF_STRING, ID_VOLUMES_CHANGEPASS, IDS_CHPASS ); } if ( !(act && act->status == ACT_RUNNING) ) { if ( mnt->info.status.flags & F_SYNC ) { if ( GetMenuItemCount(h_popup) > 0 ) { AppendMenu( h_popup, MF_SEPARATOR, 0, NULL ); } AppendMenu( h_popup, MF_STRING, ID_VOLUMES_ENCRYPT, IDS_ENCRYPT ); } else { if ( GetMenuItemCount(h_popup) > 0 ) { AppendMenu( h_popup, MF_SEPARATOR, 0, NULL ); } AppendMenu( h_popup, MF_STRING, ID_VOLUMES_REENCRYPT, IDS_REENCRYPT ); } AppendMenu( h_popup, MF_STRING, ID_VOLUMES_DECRYPT, IDS_DECRYPT ); } } } } else { if ( mnt->info.status.flags & F_CDROM ) { if ( *mnt->fs == '\0' ) { AppendMenu( h_popup, MF_STRING, ID_VOLUMES_MOUNT, IDS_MOUNT ); } } else { if ( *mnt->fs == '\0' ) { AppendMenu( h_popup, MF_STRING, ID_VOLUMES_MOUNT, IDS_MOUNT ); } else { AppendMenu( h_popup, MF_STRING, ID_VOLUMES_ENCRYPT, IDS_ENCRYPT ); } if ( IS_UNMOUNTABLE(&mnt->info.status) ) { AppendMenu( h_popup, MF_SEPARATOR, 0, NULL ); AppendMenu( h_popup, MF_STRING, ID_VOLUMES_FORMAT, IDS_FORMAT ); } } } } /* _state_menu( popup, sel && sel->status.flags & F_LOCKED ? MF_GRAYED : MF_ENABLED ); */ item = TrackPopupMenu( h_popup, TPM_RETURNCMD | TPM_LEFTBUTTON, LOWORD(GetMessagePos( )), HIWORD(GetMessagePos( )), 0, hwnd, NULL ); DestroyMenu( h_popup ); switch ( item ) { case ID_VOLUMES_DECRYPT : _menu_decrypt(sel); break; case ID_VOLUMES_ENCRYPT : _menu_encrypt(sel); break; case ID_VOLUMES_FORMAT : _menu_format(sel); break; case ID_VOLUMES_REENCRYPT : _menu_reencrypt(sel); break; case ID_VOLUMES_UNMOUNT : _menu_unmount(sel); break; case ID_VOLUMES_MOUNT : _menu_mount(sel); break; case ID_VOLUMES_CHANGEPASS : _menu_change_pass(sel); break; } if ( item ) { _refresh( TRUE ); } _set_timer( MAIN_TIMER, TRUE, TRUE ); } break; case NM_CLICK : { sel = pv( _get_item_index( __lists[HMAIN_DRIVES], ((NM_LISTVIEW *)lparam)->iItem ) ); _update_info_table( FALSE ); _activate_page( ); _refresh_menu( ); } break; } } if ( ((NMHDR *)lparam)->code == HDN_ITEMCHANGED ) { InvalidateRect( __lists[HMAIN_DRIVES], NULL, TRUE ); } if ( ((NMHDR *)lparam)->code == HDN_ITEMCHANGING ) { return 0L; } if ( ((NMHDR *)lparam)->code == HDN_BEGINTRACK ) { return 1L; } } break; case WM_COMMAND: { _dnode *node = pv( _get_sel_item( __lists[HMAIN_DRIVES] ) ); switch (id) { case ID_SHIFT_TAB : case ID_TAB : { HWND h_current = GetFocus( ); HWND h_next = GetNextDlgTabItem( hwnd, h_current, id == ID_SHIFT_TAB ); SetFocus( h_next ); } break; case ID_TOOLS_DRIVER : { if ( __msg_q( __dlg, L"Remove DiskCryptor driver?") ) { int rlt; if ( (rlt = _drv_action(DA_REMOVE, 0)) != ST_OK ) { __error_s( __dlg, L"Error remove DiskCryptor driver", rlt ); } else { return 0L; } } } break; case ID_TOOLS_BENCHMARK : _dlg_benchmark( __dlg ); break; case ID_HELP_ABOUT : _dlg_about( __dlg ); break; case ID_HOMEPAGE : __execute( DC_HOMEPAGE ); break; case ID_EXIT : { SendMessage( hwnd, WM_CLOSE, 0, 1 ); } break; case IDC_BTN_WIZARD : _menu_wizard(node); break; case ID_VOLUMES_DELETE_MNTPOINT : { wchar_t *mnt_point = node->mnt.info.status.mnt_point; if ( __msg_q( __dlg, L"Are you sure you want to delete mount point [%s]?", mnt_point ) ) { _set_trailing_slash(mnt_point); DeleteVolumeMountPoint(mnt_point); } } break; case IDC_BTN_DECRYPT_ : case ID_VOLUMES_DECRYPT : _menu_decrypt( node ); break; case IDC_BTN_ENCRYPT_ : case ID_VOLUMES_ENCRYPT : _menu_encrypt( node ); break; case ID_VOLUMES_MOUNTALL : case IDC_BTN_MOUNTALL_ : _menu_mountall( ); break; case ID_VOLUMES_DISMOUNTALL : case IDC_BTN_UNMOUNTALL_ : _menu_unmountall( ); break; case ID_VOLUMES_DISMOUNT : _menu_unmount( node ); break; case ID_VOLUMES_MOUNT : _menu_mount( node ); break; case ID_VOLUMES_FORMAT : _menu_format(node); break; case ID_VOLUMES_REENCRYPT : _menu_reencrypt( node ); break; case ID_TOOLS_SETTINGS : _dlg_options( __dlg ); break; case ID_BOOT_OPTIONS : _dlg_config_loader( __dlg, FALSE ); break; case ID_VOLUMES_CHANGEPASS : _menu_change_pass( node ); break; case ID_TOOLS_CLEARCACHE : _menu_clear_cache( ); break; case ID_VOLUMES_BACKUPHEADER : _menu_backup_header( node ); break; case ID_VOLUMES_RESTOREHEADER : _menu_restore_header( node ); break; case ID_TOOLS_ENCRYPT_CD: _menu_encrypt_cd( ); break; } switch ( id ) { case IDC_BTN_MOUNT_: { node->mnt.info.status.flags & F_ENABLED ? _menu_unmount(node) : _menu_mount(node); } break; case ID_TOOLS_BSOD : { if ( __msg_q( __dlg, L"Crash?" ) ) { dc_get_bsod( ); } } break; } if ( id == IDCANCEL ) { ShowWindow(hwnd, SW_HIDE); } _refresh(TRUE); } break; case WM_CLOSE : { if ( lparam ) { _tray_icon(FALSE); EndDialog(hwnd, 0); ExitProcess(0); } else { ShowWindow(hwnd, SW_HIDE); } return 0L; } break; case WM_DESTROY : { PostQuitMessage(0); return 0L; } break; case WM_HOTKEY : { switch (wparam) { case 0 : { int mount_cnt; dc_mount_all(NULL, &mount_cnt, 0); } break; case 1 : dc_unmount_all( ); break; case 2 : dc_clean_pass_cache( ); break; case 3 : dc_get_bsod( ); break; } return 1L; } break; case WM_ENDSESSION : { if ( lparam & ENDSESSION_LOGOFF ) { if ( __config.conf_flags & CONF_DISMOUNT_LOGOFF ) { dc_unmount_all( ); } if ( __config.conf_flags & CONF_WIPEPAS_LOGOFF ) { dc_clean_pass_cache( ); } } } break; case WM_SYSCOLORCHANGE : { COLORREF cl_light = _cl( COLOR_BTNFACE, LGHT_CLR ); COLORREF cl_button = GetSysColor( COLOR_BTNFACE ); int k; for ( k = 0; k < array_num(__lists); k++ ) { if ( ( __lists[k] != HWND_NULL ) && ( __lists[k] != NULL ) ) { ListView_SetBkColor( __lists[k], cl_button ); ListView_SetTextBkColor( __lists[k], cl_button ); ListView_SetExtendedListViewStyle( __lists[k], LVS_EX_FULLROWSELECT ); if ( !IsWindowEnabled( __lists[k] ) ) { // EnableWindow( __lists[k], TRUE ); // EnableWindow( __lists[k], FALSE ); } } } TreeView_SetBkColor( GetDlgItem(hwnd, IDC_TREE), cl_light ); ListView_SetBkColor( __lists[HMAIN_DRIVES], cl_light ); ListView_SetTextBkColor( __lists[HMAIN_DRIVES], cl_light ); ListView_SetExtendedListViewStyle( __lists[HMAIN_DRIVES], LVS_EX_FULLROWSELECT ); ListView_SetImageList( __lists[HMAIN_DRIVES], __dsk_img, LVSIL_SMALL ); } break; case WM_APP + WM_APP_TRAY : { switch ( lparam ) { case WM_LBUTTONDOWN : { BOOL show = !IsWindowVisible(hwnd); ShowWindow(hwnd, show ? SW_SHOW : SW_HIDE); if ( show ) { SetForegroundWindow(hwnd); } } break; case WM_RBUTTONDOWN : { POINT pt; int item; HMENU menu = CreatePopupMenu( ); AppendMenu( menu, MF_STRING, ID_VOLUMES_UNMOUNTALL, IDS_UNMOUNTALL ); AppendMenu( menu, MF_STRING, ID_VOLUMES_MOUNTALL, IDS_MOUNTALL ); AppendMenu( menu, MF_SEPARATOR, 0, NULL ); AppendMenu( menu, MF_STRING, ID_TOOLS_SETTINGS, IDS_SETTINGS ); AppendMenu( menu, MF_STRING, ID_HELP_ABOUT, IDS_ABOUT ); AppendMenu( menu, MF_SEPARATOR, 0, NULL ); AppendMenu( menu, MF_STRING, ID_EXIT, IDS_EXIT ); GetCursorPos(&pt); SetForegroundWindow( hwnd ); item = TrackPopupMenu ( menu, TPM_RETURNCMD | TPM_LEFTALIGN | TPM_BOTTOMALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwnd, NULL ); DestroyMenu( menu ); switch (item) { case ID_VOLUMES_UNMOUNTALL : _menu_unmountall( ); break; case ID_VOLUMES_MOUNTALL : _menu_mountall( ); break; case ID_HELP_ABOUT : _dlg_about( HWND_DESKTOP ); break; case ID_TOOLS_SETTINGS : _dlg_options( __dlg ); break; case ID_EXIT : { SendMessage(hwnd, WM_CLOSE, 0, 1); } break; } } break; } } break; default: { int rlt = _draw_proc( message, lparam ); if (rlt != -1) { return rlt; } } } return 0L; }
static INT_PTR CALLBACK _keyfiles_dlg_proc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam ) { static int key_list; static list_entry *head; switch ( message ) { case WM_CLOSE : { EndDialog( hwnd, 0 ); return 0L; } break; case WM_NOTIFY : { if( wparam == IDC_LIST_KEYFILES ) { if ( ((NMHDR *)lparam)->code == LVN_ITEMCHANGED && (((NMLISTVIEW *)lparam)->uNewState & LVIS_FOCUSED ) ) { HWND h_list = GetDlgItem( hwnd, IDC_LIST_KEYFILES ); EnableWindow(GetDlgItem( hwnd, IDB_REMOVE_ITEM), ListView_GetSelectedCount( h_list ) ); return 1L; } if ( ((NM_LISTVIEW *)lparam)->hdr.code == NM_CLICK ) { HWND h_list = GetDlgItem( hwnd, IDC_LIST_KEYFILES ); EnableWindow( GetDlgItem( hwnd, IDB_REMOVE_ITEM), ListView_GetSelectedCount( h_list ) ); } } } case WM_COMMAND : { HWND h_list = GetDlgItem( hwnd, IDC_LIST_KEYFILES ); int code = HIWORD(wparam); int id = LOWORD(wparam); switch ( id ) { case IDB_GENERATE_KEYFILE : { wchar_t s_file[MAX_PATH] = { L"keyfile" }; byte keyfile[64]; int rlt; if ( _save_file_dialog( hwnd, s_file, countof(s_file), L"Save 64 bytes random keyfile as.." ) ) { if ( (rlt = dc_get_random(keyfile, sizeof(keyfile))) == ST_OK ) { rlt = save_file(s_file, keyfile, sizeof(keyfile)); burn(keyfile, sizeof(keyfile)); } if ( rlt == ST_OK ) { if ( __msg_q(hwnd, L"Keyfile \"%s\" successfully created\n\n" L"Add this file to the keyfiles list?", s_file ) ) { _ui_keys_list_refresh(hwnd); if ( key_list == KEYLIST_EMBEDDED ) { ListView_DeleteAllItems( h_list ); } _add_item( h_list, s_file ); _ui_embedded( hwnd, key_list ); } } else { __error_s( hwnd, L"Error creating Keyfile", rlt ); } } } break; case IDB_REMOVE_ITEM : { ListView_DeleteItem( h_list, ListView_GetSelectionMark(h_list) ); _ui_keys_list_refresh( hwnd ); _ui_embedded( hwnd, key_list ); } break; case IDB_REMOVE_ITEMS : { ListView_DeleteAllItems( h_list ); _ui_keys_list_refresh( hwnd ); _ui_embedded( hwnd, key_list ); } break; case IDB_ADD_FOLDER : { wchar_t path[MAX_PATH]; if ( _folder_choice(hwnd, path, L"Choice folder..") ) { _ui_keys_list_refresh( hwnd ); _set_trailing_slash( path ); _add_item( h_list, path ); } } break; case IDB_ADD_FILE : { wchar_t s_path[MAX_PATH] = { 0 }; if ( _open_file_dialog(hwnd, s_path, countof(s_path), L"Select File..") ) { if ( key_list == KEYLIST_EMBEDDED ) { HWND h_file = CreateFile( s_path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL ); if ( h_file != INVALID_HANDLE_VALUE ) { if ( GetFileSize( h_file, NULL ) != 64 ) { __error_s( hwnd, L"Embedded keyfile must be 64 byte size", ST_ERROR ); } else { _ui_keys_list_refresh( hwnd ); _add_item( h_list, s_path ); } CloseHandle( h_file ); } _ui_embedded( hwnd, key_list ); } else { _ui_keys_list_refresh( hwnd ); _add_item( h_list, s_path ); } } } break; } if ( id == IDCANCEL ) { EndDialog(hwnd, 0); } if ( id == IDOK ) { int k = 0; _keyfiles_wipe(key_list); for ( ; k < ListView_GetItemCount( h_list ); k ++ ) { wchar_t item[MAX_PATH]; _get_item_text( h_list, k, 0, item, countof(item) ); if ( wcscmp(item, IDS_EMPTY_LIST) != 0 ) { _list_key_files *new_node; if ( (new_node = secure_alloc(sizeof(_list_key_files))) == NULL ) { __error_s( hwnd, L"Can't allocate memory", ST_NOMEM ); _keyfiles_wipe(key_list); break; } wcsncpy(new_node->path, item, countof(new_node->path)); _insert_tail_list(head, &new_node->next); } } EndDialog(hwnd, 0); } } break; case WM_INITDIALOG : { HWND h_list = GetDlgItem(hwnd, IDC_LIST_KEYFILES); _list_key_files *key_file; key_list = (int)lparam; head = _KEYFILES_HEAD_( key_list ); _init_list_headers( h_list, _keyfiles_headers ); if ( key_file = _first_keyfile( key_list ) ) { EnableWindow( GetDlgItem(hwnd, IDB_REMOVE_ITEMS), TRUE ); do { _list_insert_item( h_list, ListView_GetItemCount(h_list), 0, key_file->path, 0 ); key_file = _next_keyfile( key_file, key_list ); } while ( key_file != NULL ); } _ui_keys_list_refresh( hwnd ); _ui_embedded( hwnd, key_list ); ListView_SetBkColor( h_list, GetSysColor(COLOR_BTNFACE) ); ListView_SetTextBkColor( h_list, GetSysColor(COLOR_BTNFACE) ); ListView_SetExtendedListViewStyle( h_list, LVS_EX_FLATSB | LVS_EX_FULLROWSELECT ); SetForegroundWindow(hwnd); return 1L; } break; case WM_CTLCOLOREDIT : { return _ctl_color(wparam, _cl(COLOR_BTNFACE, LGHT_CLR)); } break; default: { int rlt = _draw_proc(message, lparam); if (rlt != -1) return rlt; } } return 0L; }