INT_PTR CALLBACK _wizard_encrypt_dlg_proc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam ) { WORD code = LOWORD(wparam); WORD id = LOWORD(wparam); static _wz_sheets sheets[ ] = { { DLG_WIZ_ISO, 0, TRUE, IDE_ISO_SRC_PATH, 0 }, { DLG_WIZ_FORMAT, 0, TRUE, IDC_COMBO_FS_LIST, 0 }, { DLG_WIZ_CONF, 0, TRUE, IDC_COMBO_ALGORT, 0 }, { DLG_WIZ_LOADER, 0, TRUE, IDC_COMBO_BOOT_INST, 0 }, { DLG_WIZ_PASS, 0, TRUE, IDE_PASS, 0 }, { DLG_WIZ_PROGRESS, 0, TRUE, -1, 0 }, { -1, 0, TRUE } }; static int enc_sheets[ ][WZR_MAX_STEPS] = { { 2, 3, 4, -1 }, // ACT_ENCRYPT { 2, 4, -1, -1 }, // ACT_DECRYPT { 2, -1, -1, -1 }, // ACT_REENCRYPT { 1, 2, 4, -1 }, // ACT_FORMAT { 0, 2, 4, 5 } // ACT_ENCRYPT_CD }; static vol_inf *vol; static _dnode *node; static index = 0; static count = 0; int k = 0; int cr = 0; int check = 0; switch ( message ) { case WM_INITDIALOG : { { node = (_dnode *)lparam; if ( node == NULL ) { EndDialog(hwnd, 0); return 0L; } vol = &((_dnode *)lparam)->mnt.info; } h_wizard = hwnd; h_hook = SetWindowsHookEx( WH_GETMESSAGE, (HOOKPROC)_get_msg_proc, NULL, GetCurrentThreadId( ) ); SetWindowText(hwnd, vol->device); count = _init_wizard_encrypt_pages( hwnd, pv(&sheets), node ); sheets[count].hwnd = (HWND)lparam; node->dlg.h_page = sheets[WPAGE_ENC_PROGRESS].hwnd; k = 0; while ( sheets[k].id != -1 ) { if ( ! _array_include(enc_sheets[node->dlg.act_type], k) ) { sheets[k].show = FALSE; } k++; } index = enc_sheets[node->dlg.act_type][0]; ShowWindow( sheets[index].hwnd, SW_SHOW ); if ( node->dlg.act_type == ACT_ENCRYPT_CD ) { EnableWindow( GetDlgItem(hwnd, IDOK), FALSE ); } SetForegroundWindow(hwnd); return 1L; } break; case WM_COMMAND: { switch ( id ) { case ID_SHIFT_TAB : case ID_TAB : { _focus_tab( IDC_BACK, hwnd, sheets[index].hwnd, sheets[index].first_tab_hwnd, id == ID_TAB ); } break; case IDOK : case IDC_BACK : { BOOL set_loader = (BOOL) ( ( sheets[WPAGE_ENC_BOOT].show && SendMessage(GetDlgItem(sheets[WPAGE_ENC_BOOT].hwnd, IDC_COMBO_BOOT_INST), CB_GETCURSEL, 0, 0) ) || ( _is_boot_device(vol) && _update_layout(node, -1, NULL) ) ); if ( node->dlg.act_type == ACT_REENCRYPT ) { k = 0; while ( combo_sel[k] != -1 ) { SendMessage( GetDlgItem(hwnd, combo_sel[k++]), CB_RESETCONTENT, 0, 0 ); } _init_combo( GetDlgItem(hwnd, IDC_COMBO_ALGORT), cipher_names, node->mnt.info.status.crypt.cipher_id, FALSE, -1 ); _init_combo( GetDlgItem(hwnd, IDC_COMBO_PASSES), wipe_modes, node->mnt.info.status.crypt.wp_mode, FALSE, -1 ); } EnableWindow( GetDlgItem(sheets[WPAGE_ENC_PASS].hwnd, IDC_LAYOUTS_LIST), set_loader ); EnableWindow( GetDlgItem(sheets[WPAGE_ENC_PASS].hwnd, IDC_COMBO_KBLAYOUT), set_loader ); if ( _wizard_step(node, pv(&sheets), &index, IDC_BACK, IDOK, id) ) { _run_wizard_action( hwnd, pv(&sheets), node ); } else { if ( sheets[index].id == DLG_WIZ_PROGRESS && node->dlg.act_type == ACT_ENCRYPT_CD ) { _run_wizard_action(hwnd, pv(&sheets), node); } } if ( node->dlg.act_type == ACT_REENCRYPT ) { EnableWindow(GetDlgItem(hwnd, IDOK), TRUE); } SetFocus(GetDlgItem(sheets[index].hwnd, IDE_PASS)); SendMessage( sheets[index].hwnd, WM_COMMAND, MAKELONG(IDE_PASS, EN_CHANGE), (LPARAM)GetDlgItem(sheets[index].hwnd, IDE_PASS) ); } break; case IDCANCEL: { BOOL b_close = TRUE; if ( node->dlg.iso.h_thread != NULL ) { SuspendThread( node->dlg.iso.h_thread ); if ( __msg_w( hwnd, L"Do you really want to interrupt the encryption\nof an iso-file?" ) == 0 ) { b_close = FALSE; } ResumeThread( node->dlg.iso.h_thread ); } if ( b_close ) { node->dlg.rlt = ST_CANCEL; SendMessage( hwnd, WM_CLOSE_DIALOG, 0, 0 ); } return 0L; } break; } } break; case WM_CLOSE_DIALOG : { if ( node->dlg.iso.h_thread != NULL ) { CloseHandle( node->dlg.iso.h_thread ); } EndDialog(hwnd, 0); } break; case WM_DESTROY : { node = NULL; vol = NULL; _wipe_pass_control( sheets[WPAGE_ENC_PASS].hwnd, IDE_PASS ); _wipe_pass_control( sheets[WPAGE_ENC_PASS].hwnd, IDE_CONFIRM ); _keyfiles_wipe(KEYLIST_CURRENT); count = 0; while ( sheets[count].id != -1 ) { sheets[count].show = TRUE; DestroyWindow(sheets[count++].hwnd); } __lists[HENC_WIZARD_BOOT_DEVS] = HWND_NULL; UnhookWindowsHookEx(h_hook); count = index = 0; return 0L; } break; default: { int rlt = _draw_proc(message, lparam); if ( rlt != -1 ) { return rlt; } } } return 0L; }
INT_PTR CALLBACK _password_change_dlg_proc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam ) { WORD code = HIWORD(wparam); WORD id = LOWORD(wparam); wchar_t display[MAX_PATH] = { 0 }; static dlgpass *info; int k; int check_init[ ] = { IDC_CHECK_SHOW_CURRENT, IDC_USE_KEYFILES_CURRENT, IDC_CHECK_SHOW_NEW, IDC_USE_KEYFILES_NEW, -1 }; _ctl_init static_head[ ] = { { L"# Current Password", IDC_HEAD_PASS_CURRENT, 0 }, { L"# New Password", IDC_HEAD_PASS_NEW, 0 }, { L"# Password Rating", IDC_HEAD_RATING, 0 }, { STR_NULL, -1, -1 } }; switch (message) { case WM_CTLCOLOREDIT : return _ctl_color(wparam, _cl(COLOR_BTNFACE, LGHT_CLR)); break; case WM_CTLCOLORSTATIC : { HDC dc = (HDC)wparam; COLORREF bgcolor, fn = 0; SetBkMode(dc, TRANSPARENT); k = 0; while (pass_gr_ctls[k].id != -1) { if (pass_gr_ctls[k].hwnd == (HWND)lparam) fn = pass_gr_ctls[k].color; if (pass_pe_ctls[k].hwnd == (HWND)lparam) fn = pass_pe_ctls[k].color; k++; } SetTextColor(dc, fn); bgcolor = GetSysColor(COLOR_BTNFACE); SetDCBrushColor(dc, bgcolor); return (INT_PTR)GetStockObject(DC_BRUSH); } break; case WM_INITDIALOG : { info = (dlgpass *)lparam; SendMessage(GetDlgItem(hwnd, IDE_PASS_NEW_CONFIRM), EM_LIMITTEXT, MAX_PASSWORD, 0); SendMessage(GetDlgItem(hwnd, IDE_PASS_CURRENT), EM_LIMITTEXT, MAX_PASSWORD, 0); SendMessage(GetDlgItem(hwnd, IDE_PASS_NEW), EM_LIMITTEXT, MAX_PASSWORD, 0); SendMessage(hwnd, WM_COMMAND, MAKELONG(IDE_PASS_NEW, EN_CHANGE), (LPARAM)GetDlgItem(hwnd, IDE_PASS_NEW)); if (info->node) { _snwprintf(display, sizeof_w(display), L"[%s] - %s", info->node->mnt.info.status.mnt_point, info->node->mnt.info.device); } else { wcscpy(display, L"Change password"); } SetWindowText(hwnd, display); SendMessage( GetDlgItem(hwnd, IDP_BREAKABLE), PBM_SETBARCOLOR, 0, _cl(COLOR_BTNSHADOW, DARK_CLR-20) ); SendMessage( GetDlgItem(hwnd, IDP_BREAKABLE), PBM_SETRANGE, 0, MAKELPARAM(0, 193) ); k = 0; while (static_head[k].id != -1) { SetWindowText(GetDlgItem(hwnd, static_head[k].id), static_head[k].display); SendMessage(GetDlgItem(hwnd, static_head[k].id), (UINT)WM_SETFONT, (WPARAM)__font_bold, 0); k++; } k = 0; while (check_init[k] != -1) { _sub_class(GetDlgItem(hwnd, check_init[k]), SUB_STATIC_PROC, HWND_NULL); _set_check(hwnd, check_init[k], FALSE); k++; } SetForegroundWindow(hwnd); return 1L; } break; case WM_USER_CLICK : { if ( (HWND)wparam == GetDlgItem(hwnd, IDC_CHECK_SHOW_CURRENT) ) { SendMessage(GetDlgItem(hwnd, IDE_PASS_CURRENT), EM_SETPASSWORDCHAR, _get_check(hwnd, IDC_CHECK_SHOW_CURRENT) ? 0 : '*', 0 ); InvalidateRect(GetDlgItem(hwnd, IDE_PASS_CURRENT), NULL, TRUE); return 1L; } if ( (HWND)wparam == GetDlgItem(hwnd, IDC_CHECK_SHOW_NEW) ) { int mask = _get_check(hwnd, IDC_CHECK_SHOW_NEW) ? 0 : '*'; SendMessage(GetDlgItem(hwnd, IDE_PASS_NEW), EM_SETPASSWORDCHAR, mask, 0); SendMessage(GetDlgItem(hwnd, IDE_PASS_NEW_CONFIRM), EM_SETPASSWORDCHAR, mask, 0); InvalidateRect(GetDlgItem(hwnd, IDE_PASS_NEW), NULL, TRUE); InvalidateRect(GetDlgItem(hwnd, IDE_PASS_NEW_CONFIRM), NULL, TRUE); return 1L; } if ( (HWND)wparam == GetDlgItem(hwnd, IDC_USE_KEYFILES_CURRENT) ) { SendMessage( hwnd, WM_COMMAND, MAKELONG(IDE_PASS_CURRENT, EN_CHANGE), (LPARAM)GetDlgItem(hwnd, IDE_PASS_CURRENT) ); EnableWindow( GetDlgItem(hwnd, IDB_USE_KEYFILES_CURRENT), _get_check(hwnd, IDC_USE_KEYFILES_CURRENT) ); return 1L; } if ( (HWND)wparam == GetDlgItem(hwnd, IDC_USE_KEYFILES_NEW) ) { SendMessage( hwnd, WM_COMMAND, MAKELONG(IDE_PASS_NEW, EN_CHANGE), (LPARAM)GetDlgItem(hwnd, IDE_PASS_NEW) ); EnableWindow( GetDlgItem(hwnd, IDB_USE_KEYFILES_NEW), _get_check(hwnd, IDC_USE_KEYFILES_NEW )); return 1L; } } break; case WM_COMMAND : if ( id == IDB_USE_KEYFILES_CURRENT ) { _dlg_keyfiles( hwnd, KEYLIST_CURRENT ); SendMessage( hwnd, WM_COMMAND, MAKELONG(IDE_PASS_CURRENT, EN_CHANGE), (LPARAM)GetDlgItem(hwnd, IDE_PASS_CURRENT) ); } if ( id == IDB_USE_KEYFILES_NEW ) { _dlg_keyfiles( hwnd, KEYLIST_CHANGE_PASS ); SendMessage( hwnd, WM_COMMAND, MAKELONG(IDE_PASS_NEW, EN_CHANGE), (LPARAM)GetDlgItem(hwnd, IDE_PASS_NEW) ); } if ( code == EN_CHANGE ) { BOOL correct_current, correct_new; int id_stat_current, id_stat_new; dc_pass *pass; dc_pass *verify; ldr_config conf; int kb_layout = -1; int keylist; if ( info->node && _is_boot_device(&info->node->mnt.info) ) { if (dc_get_mbr_config( -1, NULL, &conf ) == ST_OK) { kb_layout = conf.kbd_layout; } } if ( id == IDE_PASS_NEW ) { int entropy; dc_pass *pass; pass = _get_pass(hwnd, IDE_PASS_NEW); _draw_pass_rating(hwnd, pass, kb_layout, &entropy); secure_free(pass); SendMessage( GetDlgItem(hwnd, IDP_BREAKABLE), PBM_SETPOS, (WPARAM)entropy, 0 ); } pass = _get_pass(hwnd, IDE_PASS_CURRENT); keylist = _get_check(hwnd, IDC_USE_KEYFILES_CURRENT) ? KEYLIST_CURRENT : KEYLIST_NONE; correct_current = _input_verify(pass, NULL, keylist, -1, &id_stat_current ); secure_free(pass); pass = _get_pass(hwnd, IDE_PASS_NEW); verify = _get_pass(hwnd, IDE_PASS_NEW_CONFIRM); keylist = _get_check(hwnd, IDC_USE_KEYFILES_NEW) ? KEYLIST_CHANGE_PASS : KEYLIST_NONE; correct_new = _input_verify(pass, verify, keylist, kb_layout, &id_stat_new ); secure_free(pass); secure_free(verify); SetWindowText(GetDlgItem(hwnd, IDC_PASS_STATUS_CURRENT), _get_text_name(id_stat_current, pass_status)); SetWindowText(GetDlgItem(hwnd, IDC_PASS_STATUS_NEW), _get_text_name(id_stat_new, pass_status)); EnableWindow(GetDlgItem(hwnd, IDOK), correct_current && correct_new); return 1L; } if ( (id == IDCANCEL) || (id == IDOK) ) { if ( id == IDOK ) { info->pass = _get_pass_keyfiles(hwnd, IDE_PASS_CURRENT, IDC_USE_KEYFILES_CURRENT, KEYLIST_CURRENT); info->new_pass = _get_pass_keyfiles(hwnd, IDE_PASS_NEW, IDC_USE_KEYFILES_NEW, KEYLIST_CHANGE_PASS); if ( IsWindowEnabled(GetDlgItem(hwnd, IDC_COMBO_MNPOINT)) && info->mnt_point ) { GetWindowText( GetDlgItem(hwnd, IDC_COMBO_MNPOINT), (wchar_t *)info->mnt_point, MAX_PATH ); } } EndDialog (hwnd, id); return 1L; } break; case WM_DESTROY: { _wipe_pass_control(hwnd, IDE_PASS_NEW_CONFIRM); _wipe_pass_control(hwnd, IDE_PASS_CURRENT); _wipe_pass_control(hwnd, IDE_PASS_NEW); _keyfiles_wipe(KEYLIST_CURRENT); _keyfiles_wipe(KEYLIST_CHANGE_PASS); return 0L; } break; default: { int rlt = _draw_proc(message, lparam); if (rlt != -1) return rlt; } } return 0L; }
INT_PTR CALLBACK _password_dlg_proc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam ) { WORD code = HIWORD(wparam); WORD id = LOWORD(wparam); wchar_t display[MAX_PATH] = { 0 }; static dlgpass *info; static RECT rc_left = { 0, 0, 0, 0 }; static RECT rc_right = { 0, 0, 0, 0 }; static cut; switch ( message ) { case WM_DRAWITEM : { DRAWITEMSTRUCT *draw = pv(lparam); static RECT left; static RECT right; switch ( draw->CtlID ) { case IDC_FRAME_LEFT: { if ( !rc_left.right ) { _relative_rect( draw->hwndItem, &rc_left ); rc_left.bottom -= cut; } MoveWindow( draw->hwndItem, rc_left.left, rc_left.top, rc_left.right, rc_left.bottom, TRUE ); } break; case IDC_FRAME_RIGHT: { if ( !rc_right.right ) { _relative_rect( draw->hwndItem, &rc_right ); rc_right.bottom -= cut; } MoveWindow( draw->hwndItem, rc_right.left, rc_right.top, rc_right.right, rc_right.bottom, TRUE ); } break; } _draw_static( draw ); return 1L; } break; case WM_CTLCOLOREDIT : { return ( _ctl_color( wparam, _cl(COLOR_BTNFACE, LGHT_CLR) ) ); } break; case WM_INITDIALOG : { int ctl_resize[ ] = { IDC_FRAME_LEFT, IDC_FRAME_RIGHT, -1 }; info = (dlgpass *)lparam; _init_mount_points( GetDlgItem(hwnd, IDC_COMBO_MNPOINT) ); SendMessage( GetDlgItem(hwnd, IDC_COMBO_MNPOINT), CB_SETCURSEL, 1, 0 ); SendMessage( GetDlgItem(hwnd, IDE_PASS), EM_LIMITTEXT, MAX_PASSWORD, 0 ); if ( info->node ) { _snwprintf( display, sizeof_w(display), L"[%s] - %s", info->node->mnt.info.status.mnt_point, info->node->mnt.info.device ); } else { wcscpy(display, L"Enter password"); } SetWindowText( hwnd, display ); SetWindowText( GetDlgItem(hwnd, IDC_HEAD_PASS), L"# Current Password" ); SendMessage( GetDlgItem(hwnd, IDC_HEAD_PASS), WM_SETFONT, (WPARAM)__font_bold, 0 ); SetWindowText( GetDlgItem(hwnd, IDC_HEAD_MOUNT_OPTIONS), L"# Mount Options" ); SendMessage( GetDlgItem(hwnd, IDC_HEAD_MOUNT_OPTIONS), WM_SETFONT, (WPARAM)__font_bold, 0 ); _sub_class( GetDlgItem(hwnd, IDC_CHECK_SHOW), SUB_STATIC_PROC, HWND_NULL ); _set_check( hwnd, IDC_CHECK_SHOW, FALSE ); _sub_class( GetDlgItem(hwnd, IDC_USE_KEYFILES), SUB_STATIC_PROC, HWND_NULL ); _set_check( hwnd, IDC_USE_KEYFILES, FALSE ); { HWND mnt_combo = GetDlgItem( hwnd, IDC_COMBO_MNPOINT ); HWND mnt_check = GetDlgItem( hwnd, IDC_CHECK_MNT_SET ); HWND mnt_label = GetDlgItem( hwnd, IDC_MNT_POINT ); BOOL enable; RECT rc_main; GetWindowRect(hwnd, &rc_main); enable = info->node && ( info->node->mnt.info.status.mnt_point[0] == L'\\' ); EnableWindow( mnt_combo, enable ); EnableWindow( mnt_check, enable ); EnableWindow( mnt_label, enable ); _sub_class( GetDlgItem(hwnd, IDC_CHECK_MNT_SET), SUB_STATIC_PROC, HWND_NULL ); _set_check( hwnd, IDC_CHECK_MNT_SET, enable ); } SendMessage( hwnd, WM_COMMAND, MAKELONG(IDE_PASS, EN_CHANGE), (LPARAM)GetDlgItem(hwnd, IDE_PASS) ); SetForegroundWindow(hwnd); return 1L; } break; case WM_USER_CLICK : { if ( (HWND)wparam == GetDlgItem(hwnd, IDC_CHECK_MNT_SET) ) { EnableWindow( GetDlgItem(hwnd, IDC_COMBO_MNPOINT), _get_check(hwnd, IDC_CHECK_MNT_SET) ); EnableWindow( GetDlgItem(hwnd, IDC_MNT_POINT), _get_check(hwnd, IDC_CHECK_MNT_SET) ); return 1L; } if ( (HWND)wparam == GetDlgItem(hwnd, IDC_CHECK_SHOW) ) { int mask = _get_check(hwnd, IDC_CHECK_SHOW) ? 0 : '*'; SendMessage(GetDlgItem(hwnd, IDE_PASS), EM_SETPASSWORDCHAR, mask, 0 ); InvalidateRect(GetDlgItem(hwnd, IDE_PASS), NULL, TRUE); return 1L; } if ( (HWND)wparam == GetDlgItem(hwnd, IDC_USE_KEYFILES) ) { SendMessage( hwnd, WM_COMMAND, MAKELONG(IDE_PASS, EN_CHANGE), (LPARAM)GetDlgItem(hwnd, IDE_PASS) ); EnableWindow(GetDlgItem(hwnd, IDB_USE_KEYFILES), _get_check(hwnd, IDC_USE_KEYFILES)); return 1L; } } break; case WM_COMMAND : if ( id == IDB_USE_KEYFILES ) { _dlg_keyfiles(hwnd, KEYLIST_CURRENT); SendMessage( hwnd, WM_COMMAND, MAKELONG(IDE_PASS, EN_CHANGE), (LPARAM)GetDlgItem(hwnd, IDE_PASS) ); } if ( code == CBN_SELCHANGE && id == IDC_COMBO_MNPOINT ) { if ( SendMessage((HWND)lparam, CB_GETCURSEL, 0, 0) == 0 ) { HWND h_combo = GetDlgItem(hwnd, IDC_COMBO_MNPOINT); int sel_item = 1; wchar_t path[MAX_PATH]; if ( _folder_choice(hwnd, path, L"Choice folder for mount point") ) { sel_item = (int)SendMessage(h_combo, CB_GETCOUNT, 0, 0); SendMessage(h_combo, CB_ADDSTRING, 0, (LPARAM)path); } SendMessage(h_combo, CB_SETCURSEL, sel_item, 0); } } if (code == EN_CHANGE) { BOOL correct; int idx_status; dc_pass *pass = _get_pass(hwnd, IDE_PASS); int keylist = _get_check(hwnd, IDC_USE_KEYFILES) ? KEYLIST_CURRENT : KEYLIST_NONE; correct = _input_verify(pass, NULL, keylist, -1, &idx_status ); secure_free(pass); SetWindowText(GetDlgItem(hwnd, IDC_PASS_STATUS), _get_text_name(idx_status, pass_status)); EnableWindow(GetDlgItem(hwnd, IDOK), correct); return 1L; } if ((id == IDCANCEL) || (id == IDOK)) { if (id == IDOK) { info->pass = _get_pass_keyfiles(hwnd, IDE_PASS, IDC_USE_KEYFILES, KEYLIST_CURRENT); if (IsWindowEnabled(GetDlgItem(hwnd, IDC_COMBO_MNPOINT)) && info->mnt_point) { GetWindowText( GetDlgItem(hwnd, IDC_COMBO_MNPOINT), (wchar_t *)info->mnt_point, MAX_PATH ); } } EndDialog (hwnd, id); return 1L; } break; case WM_DESTROY: { _wipe_pass_control(hwnd, IDE_PASS); _keyfiles_wipe(KEYLIST_CURRENT); memset(&rc_right, 0, sizeof(rc_right)); memset(&rc_left, 0, sizeof(rc_left)); cut = 0; return 0L; } break; case WM_MEASUREITEM: { MEASUREITEMSTRUCT *item = pv(lparam); if (item->CtlType != ODT_LISTVIEW) item->itemHeight -= 3; } break; } 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; }