// simplewall // Copyright (c) 2016-2020 Henry++ #include "global.hpp" UINT WM_FINDMSGSTRING = RegisterWindowMessage (FINDMSGSTRING); THREAD_FN ApplyThread (PVOID lparam) { PITEM_CONTEXT pcontext = (PITEM_CONTEXT)lparam; _r_fastlock_acquireshared (&lock_apply); HANDLE hengine = _wfp_getenginehandle (); if (hengine) { // dropped packets logging (win7+) if (config.is_neteventset) _wfp_logunsubscribe (hengine); if (pcontext->is_install) { if (_wfp_initialize (hengine, TRUE)) _wfp_installfilters (hengine); } else { _wfp_destroyfilters (hengine); _wfp_uninitialize (hengine, TRUE); } // dropped packets logging (win7+) if (config.is_neteventset) _wfp_logsubscribe (hengine); } _app_restoreinterfacestate (pcontext->hwnd, TRUE); _app_setinterfacestate (pcontext->hwnd); _app_profile_save (); SetEvent (config.done_evt); _r_mem_free (pcontext); _r_fastlock_releaseshared (&lock_apply); return _r_sys_endthread (ERROR_SUCCESS); } THREAD_FN NetworkMonitorThread (PVOID lparam) { DWORD network_timeout = _r_config_getulong (L"NetworkTimeout", NETWORK_TIMEOUT); if (network_timeout && network_timeout != INFINITE) { HASHER_MAP checker_map; PITEM_NETWORK ptr_network; PR_STRING localAddressString; PR_STRING localPortString; PR_STRING remoteAddressString; PR_STRING remotePortString; HWND hwnd; INT network_listview_id; INT current_listview_id; INT item_id; BOOLEAN is_highlighting_enabled; BOOLEAN is_refresh; hwnd = (HWND)lparam; network_listview_id = IDC_NETWORK; network_timeout = _r_calc_clamp (DWORD, network_timeout, 500, 60 * 1000); // set allowed range while (TRUE) { _app_generate_connections (&network_map, &checker_map); is_highlighting_enabled = _r_config_getboolean (L"IsEnableHighlighting", TRUE) && _r_config_getboolean (L"IsHighlightConnection", TRUE, L"colors"); current_listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); is_refresh = FALSE; // add new connections into list for (auto it = network_map.begin (); it != network_map.end (); ++it) { if (!it->second) continue; if (checker_map.find (it->first) == checker_map.end () || !checker_map.at (it->first)) continue; ptr_network = (PITEM_NETWORK)_r_obj_reference (it->second); localAddressString = _app_formataddress (ptr_network->af, 0, &ptr_network->local_addr, 0, 0); localPortString = _app_formatport (ptr_network->local_port, TRUE); remoteAddressString = _app_formataddress (ptr_network->af, 0, &ptr_network->remote_addr, 0, 0); remotePortString = _app_formatport (ptr_network->remote_port, TRUE); item_id = _r_listview_getitemcount (hwnd, network_listview_id, FALSE); _r_listview_additemex (hwnd, network_listview_id, item_id, 0, _r_path_getbasename (_r_obj_getstring (ptr_network->path)), ptr_network->icon_id, _app_getnetworkgroup (ptr_network), it->first); _r_listview_setitem (hwnd, network_listview_id, item_id, 1, _r_obj_getstringordefault (localAddressString, SZ_EMPTY)); _r_listview_setitem (hwnd, network_listview_id, item_id, 3, _r_obj_getstringordefault (remoteAddressString, SZ_EMPTY)); _r_listview_setitem (hwnd, network_listview_id, item_id, 5, _app_getprotoname (ptr_network->protocol, ptr_network->af, SZ_EMPTY)); _r_listview_setitem (hwnd, network_listview_id, item_id, 6, _app_getconnectionstatusname (ptr_network->state, NULL)); if (localPortString) _r_listview_setitem (hwnd, network_listview_id, item_id, 2, _r_obj_getstringorempty (localPortString)); if (remotePortString) _r_listview_setitem (hwnd, network_listview_id, item_id, 4, _r_obj_getstringorempty (remotePortString)); SAFE_DELETE_REFERENCE (localAddressString); SAFE_DELETE_REFERENCE (localPortString); SAFE_DELETE_REFERENCE (remoteAddressString); SAFE_DELETE_REFERENCE (remotePortString); // redraw listview item if (is_highlighting_enabled) { INT app_listview_id = (INT)_app_getappinfo (ptr_network->app_hash, InfoListviewId); if (app_listview_id && current_listview_id == app_listview_id) { INT item_pos = _app_getposition (hwnd, app_listview_id, ptr_network->app_hash); if (item_pos != INVALID_INT) _r_listview_redraw (hwnd, app_listview_id, item_pos); } } is_refresh = TRUE; _r_obj_dereference (ptr_network); } // refresh network tab as well if (is_refresh) { if (current_listview_id == network_listview_id) { SendDlgItemMessage (hwnd, network_listview_id, WM_SETREDRAW, FALSE, 0); _app_refreshgroups (hwnd, network_listview_id); _app_listviewsort (hwnd, network_listview_id, INVALID_INT, FALSE); _app_listviewresize (hwnd, network_listview_id, FALSE); SendDlgItemMessage (hwnd, network_listview_id, WM_SETREDRAW, TRUE, 0); } } // remove closed connections from list INT item_count = _r_listview_getitemcount (hwnd, network_listview_id, FALSE); if (item_count) { for (INT i = item_count - 1; i != INVALID_INT; i--) { SIZE_T network_hash = _r_listview_getitemlparam (hwnd, network_listview_id, i); if (checker_map.find (network_hash) != checker_map.end ()) continue; SendDlgItemMessage (hwnd, network_listview_id, LVM_DELETEITEM, (WPARAM)i, 0); ptr_network = _app_getnetworkitem (network_hash); // redraw listview item if (ptr_network) { if (is_highlighting_enabled) { INT app_listview_id = (INT)_app_getappinfo (ptr_network->app_hash, InfoListviewId); if (app_listview_id && current_listview_id == app_listview_id) { INT item_pos = _app_getposition (hwnd, app_listview_id, ptr_network->app_hash); if (item_pos != INVALID_INT) _r_listview_redraw (hwnd, app_listview_id, item_pos); } } } network_map.erase (network_hash); _r_obj_dereferenceex (ptr_network, 2); } } WaitForSingleObjectEx (NtCurrentThread (), network_timeout, FALSE); } } return _r_sys_endthread (ERROR_SUCCESS); } BOOLEAN _app_changefilters (HWND hwnd, BOOLEAN is_install, BOOLEAN is_forced) { if (_wfp_isfiltersapplying ()) return FALSE; INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); _app_listviewsort (hwnd, listview_id, INVALID_INT, FALSE); if (is_forced || _wfp_isfiltersinstalled ()) { _app_initinterfacestate (hwnd, TRUE); _app_freethreadpool (&threads_pool); PITEM_CONTEXT pcontext = (PITEM_CONTEXT)_r_mem_allocatezero (sizeof (ITEM_CONTEXT)); pcontext->hwnd = hwnd; pcontext->is_install = is_install; HANDLE hthread = _r_sys_createthreadex (&ApplyThread, (PVOID)pcontext, TRUE, THREAD_PRIORITY_HIGHEST); if (!hthread) { _r_mem_free (pcontext); return FALSE; } threads_pool.emplace_back (hthread); _r_sys_resumethread (hthread); return TRUE; } _app_profile_save (); _r_listview_redraw (hwnd, listview_id, INVALID_INT); return FALSE; } VOID addcolor (UINT locale_id, LPCWSTR configName, BOOLEAN is_enabled, LPCWSTR configValue, COLORREF default_clr) { PITEM_COLOR ptr_clr = (PITEM_COLOR)_r_mem_allocatezero (sizeof (ITEM_COLOR)); if (!_r_str_isempty (configName)) ptr_clr->configName = _r_obj_createstring (configName); if (!_r_str_isempty (configValue)) { ptr_clr->configValue = _r_obj_createstring (configValue); ptr_clr->hash = _r_str_hash (configValue); ptr_clr->new_clr = _r_config_getulong (configValue, default_clr, L"colors"); } ptr_clr->default_clr = default_clr; ptr_clr->locale_id = locale_id; ptr_clr->is_enabled = is_enabled; colors.emplace_back (ptr_clr); } BOOLEAN _app_installmessage (HWND hwnd, BOOLEAN is_install) { WCHAR radio_text_1[128]; WCHAR radio_text_2[128]; WCHAR str_main[256]; WCHAR str_flag[128]; WCHAR str_button_text_1[64]; WCHAR str_button_text_2[64]; TASKDIALOGCONFIG tdc = {0}; TASKDIALOG_BUTTON td_buttons[2]; TASKDIALOG_BUTTON td_radios[2]; tdc.cbSize = sizeof (tdc); tdc.dwFlags = TDF_ENABLE_HYPERLINKS | TDF_ALLOW_DIALOG_CANCELLATION | TDF_NO_SET_FOREGROUND; tdc.hwndParent = hwnd; tdc.pszWindowTitle = APP_NAME; tdc.pszMainIcon = is_install ? TD_INFORMATION_ICON : TD_WARNING_ICON; //tdc.dwCommonButtons = TDCBF_YES_BUTTON | TDCBF_NO_BUTTON; tdc.pszContent = str_main; tdc.pszVerificationText = str_flag; tdc.pfCallback = &_r_msg_callback; tdc.lpCallbackData = MAKELONG (0, TRUE); // on top tdc.pButtons = td_buttons; tdc.cButtons = RTL_NUMBER_OF (td_buttons); tdc.nDefaultButton = IDYES; td_buttons[0].nButtonID = IDYES; td_buttons[0].pszButtonText = str_button_text_1; td_buttons[1].nButtonID = IDNO; td_buttons[1].pszButtonText = str_button_text_2; _r_str_copy (str_button_text_1, RTL_NUMBER_OF (str_button_text_1), _r_locale_getstring (is_install ? IDS_TRAY_START : IDS_TRAY_STOP)); _r_str_copy (str_button_text_2, RTL_NUMBER_OF (str_button_text_2), _r_locale_getstring (IDS_CLOSE)); if (is_install) { _r_str_copy (str_main, RTL_NUMBER_OF (str_main), _r_locale_getstring (IDS_QUESTION_START)); _r_str_copy (str_flag, RTL_NUMBER_OF (str_flag), _r_locale_getstring (IDS_DISABLEWINDOWSFIREWALL_CHK)); tdc.pRadioButtons = td_radios; tdc.cRadioButtons = RTL_NUMBER_OF (td_radios); tdc.nDefaultRadioButton = IDYES; td_radios[0].nButtonID = IDYES; td_radios[0].pszButtonText = radio_text_1; td_radios[1].nButtonID = IDNO; td_radios[1].pszButtonText = radio_text_2; _r_str_copy (radio_text_1, RTL_NUMBER_OF (radio_text_1), _r_locale_getstring (IDS_INSTALL_PERMANENT)); _r_str_copy (radio_text_2, RTL_NUMBER_OF (radio_text_2), _r_locale_getstring (IDS_INSTALL_TEMPORARY)); if (_r_config_getboolean (L"IsDisableWindowsFirewallChecked", TRUE)) tdc.dwFlags |= TDF_VERIFICATION_FLAG_CHECKED; } else { _r_str_copy (str_main, RTL_NUMBER_OF (str_main), _r_locale_getstring (IDS_QUESTION_STOP)); _r_str_copy (str_flag, RTL_NUMBER_OF (str_flag), _r_locale_getstring (IDS_ENABLEWINDOWSFIREWALL_CHK)); if (_r_config_getboolean (L"IsEnableWindowsFirewallChecked", TRUE)) tdc.dwFlags |= TDF_VERIFICATION_FLAG_CHECKED; } INT command_id; INT radio_id; BOOL is_flagchecked; if (_r_msg_taskdialog (&tdc, &command_id, &radio_id, &is_flagchecked)) { if (command_id == IDYES) { if (is_install) { config.is_filterstemporary = (radio_id == IDNO); _r_config_setboolean (L"IsDisableWindowsFirewallChecked", !!is_flagchecked); if (is_flagchecked) _mps_changeconfig2 (FALSE); } else { _r_config_setboolean (L"IsEnableWindowsFirewallChecked", !!is_flagchecked); if (is_flagchecked) _mps_changeconfig2 (TRUE); } return TRUE; } } return FALSE; } VOID _app_config_apply (HWND hwnd, INT ctrl_id) { BOOLEAN new_val; switch (ctrl_id) { case IDC_RULE_BLOCKOUTBOUND: case IDM_RULE_BLOCKOUTBOUND: { new_val = !_r_config_getboolean (L"BlockOutboundConnections", TRUE); break; } case IDC_RULE_BLOCKINBOUND: case IDM_RULE_BLOCKINBOUND: { new_val = !_r_config_getboolean (L"BlockInboundConnections", TRUE); break; } case IDC_RULE_ALLOWLOOPBACK: case IDM_RULE_ALLOWLOOPBACK: { new_val = !_r_config_getboolean (L"AllowLoopbackConnections", TRUE); break; } case IDC_RULE_ALLOW6TO4: case IDM_RULE_ALLOW6TO4: { new_val = !_r_config_getboolean (L"AllowIPv6", TRUE); break; } case IDC_SECUREFILTERS_CHK: case IDM_SECUREFILTERS_CHK: { new_val = !_r_config_getboolean (L"IsSecureFilters", TRUE); break; } case IDC_USESTEALTHMODE_CHK: case IDM_USESTEALTHMODE_CHK: { new_val = !_r_config_getboolean (L"UseStealthMode", TRUE); break; } case IDC_INSTALLBOOTTIMEFILTERS_CHK: case IDM_INSTALLBOOTTIMEFILTERS_CHK: { new_val = !_r_config_getboolean (L"InstallBoottimeFilters", TRUE); break; } case IDC_USENETWORKRESOLUTION_CHK: case IDM_USENETWORKRESOLUTION_CHK: { new_val = !_r_config_getboolean (L"IsNetworkResolutionsEnabled", FALSE); break; } case IDC_USECERTIFICATES_CHK: case IDM_USECERTIFICATES_CHK: { new_val = !_r_config_getboolean (L"IsCertificatesEnabled", FALSE); break; } case IDC_USEREFRESHDEVICES_CHK: case IDM_USEREFRESHDEVICES_CHK: { new_val = !_r_config_getboolean (L"IsRefreshDevices", TRUE); break; } default: { return; } } HMENU hmenu = GetMenu (hwnd); switch (ctrl_id) { case IDC_RULE_BLOCKOUTBOUND: case IDM_RULE_BLOCKOUTBOUND: { _r_config_setboolean (L"BlockOutboundConnections", new_val); _r_menu_checkitem (hmenu, IDM_RULE_BLOCKOUTBOUND, 0, MF_BYCOMMAND, new_val); break; } case IDC_RULE_BLOCKINBOUND: case IDM_RULE_BLOCKINBOUND: { _r_config_setboolean (L"BlockInboundConnections", new_val); _r_menu_checkitem (hmenu, IDM_RULE_BLOCKINBOUND, 0, MF_BYCOMMAND, new_val); break; } case IDC_RULE_ALLOWLOOPBACK: case IDM_RULE_ALLOWLOOPBACK: { _r_config_setboolean (L"AllowLoopbackConnections", new_val); _r_menu_checkitem (hmenu, IDM_RULE_ALLOWLOOPBACK, 0, MF_BYCOMMAND, new_val); break; } case IDC_RULE_ALLOW6TO4: case IDM_RULE_ALLOW6TO4: { _r_config_setboolean (L"AllowIPv6", new_val); _r_menu_checkitem (hmenu, IDM_RULE_ALLOW6TO4, 0, MF_BYCOMMAND, new_val); break; } case IDC_USESTEALTHMODE_CHK: case IDM_USESTEALTHMODE_CHK: { _r_config_setboolean (L"UseStealthMode", new_val); _r_menu_checkitem (hmenu, IDM_USESTEALTHMODE_CHK, 0, MF_BYCOMMAND, new_val); break; } case IDC_SECUREFILTERS_CHK: case IDM_SECUREFILTERS_CHK: { _r_config_setboolean (L"IsSecureFilters", new_val); _r_menu_checkitem (hmenu, IDM_SECUREFILTERS_CHK, 0, MF_BYCOMMAND, new_val); if (_wfp_isfiltersinstalled ()) { HANDLE hengine = _wfp_getenginehandle (); if (hengine) { GUIDS_VEC filter_all; _app_setsecurityinfoforprovider (hengine, &GUID_WfpProvider, new_val); _app_setsecurityinfoforsublayer (hengine, &GUID_WfpSublayer, new_val); if (_wfp_dumpfilters (hengine, &GUID_WfpProvider, &filter_all)) { for (auto it = filter_all.begin (); it != filter_all.end (); ++it) _app_setsecurityinfoforfilter (hengine, &(*it), new_val, __LINE__); } } } break; } case IDC_INSTALLBOOTTIMEFILTERS_CHK: case IDM_INSTALLBOOTTIMEFILTERS_CHK: { _r_config_setboolean (L"InstallBoottimeFilters", new_val); _r_menu_checkitem (hmenu, IDM_INSTALLBOOTTIMEFILTERS_CHK, 0, MF_BYCOMMAND, new_val); break; } case IDC_USENETWORKRESOLUTION_CHK: case IDM_USENETWORKRESOLUTION_CHK: { _r_config_setboolean (L"IsNetworkResolutionsEnabled", new_val); _r_menu_checkitem (hmenu, IDM_USENETWORKRESOLUTION_CHK, 0, MF_BYCOMMAND, new_val); break; } case IDC_USECERTIFICATES_CHK: case IDM_USECERTIFICATES_CHK: { _r_config_setboolean (L"IsCertificatesEnabled", new_val); _r_menu_checkitem (hmenu, IDM_USECERTIFICATES_CHK, 0, MF_BYCOMMAND, new_val); if (new_val) { PR_STRING signatureString; PITEM_APP ptr_app; SIZE_T app_hash; for (auto it = apps.begin (); it != apps.end (); ++it) { if (!it->second) continue; app_hash = it->first; ptr_app = (PITEM_APP)_r_obj_reference (it->second); signatureString = _app_getsignatureinfo (app_hash, ptr_app); SAFE_DELETE_REFERENCE (signatureString); _r_obj_dereference (ptr_app); } } _r_listview_redraw (_r_app_gethwnd (), (INT)_r_tab_getlparam (_r_app_gethwnd (), IDC_TAB, INVALID_INT), INVALID_INT); break; } case IDC_USEREFRESHDEVICES_CHK: case IDM_USEREFRESHDEVICES_CHK: { _r_config_setboolean (L"IsRefreshDevices", new_val); _r_menu_checkitem (hmenu, IDM_USEREFRESHDEVICES_CHK, 0, MF_BYCOMMAND, new_val); break; } } switch (ctrl_id) { case IDC_SECUREFILTERS_CHK: case IDM_SECUREFILTERS_CHK: case IDC_USENETWORKRESOLUTION_CHK: case IDM_USENETWORKRESOLUTION_CHK: case IDC_USECERTIFICATES_CHK: case IDM_USECERTIFICATES_CHK: case IDC_USEREFRESHDEVICES_CHK: case IDM_USEREFRESHDEVICES_CHK: { return; } } if (_wfp_isfiltersinstalled ()) { HANDLE hengine = _wfp_getenginehandle (); if (hengine) _wfp_create2filters (hengine, __LINE__); } } INT_PTR CALLBACK SettingsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { switch (msg) { case WM_INITDIALOG: { #if defined(_APP_HAVE_DARKTHEME) _r_wnd_setdarktheme (hwnd); #endif // _APP_HAVE_DARKTHEME break; } case RM_INITIALIZE: { INT dialog_id = (INT)wparam; switch (dialog_id) { case IDD_SETTINGS_GENERAL: { CheckDlgButton (hwnd, IDC_ALWAYSONTOP_CHK, _r_config_getboolean (L"AlwaysOnTop", _APP_ALWAYSONTOP) ? BST_CHECKED : BST_UNCHECKED); #if defined(_APP_HAVE_AUTORUN) CheckDlgButton (hwnd, IDC_LOADONSTARTUP_CHK, _r_autorun_isenabled () ? BST_CHECKED : BST_UNCHECKED); #endif // _APP_HAVE_AUTORUN CheckDlgButton (hwnd, IDC_STARTMINIMIZED_CHK, _r_config_getboolean (L"IsStartMinimized", FALSE) ? BST_CHECKED : BST_UNCHECKED); #if defined(_APP_HAVE_SKIPUAC) CheckDlgButton (hwnd, IDC_SKIPUACWARNING_CHK, _r_skipuac_isenabled () ? BST_CHECKED : BST_UNCHECKED); #endif // _APP_HAVE_SKIPUAC CheckDlgButton (hwnd, IDC_CHECKUPDATES_CHK, _r_config_getboolean (L"CheckUpdates", TRUE) ? BST_CHECKED : BST_UNCHECKED); #if defined(_DEBUG) || defined(_APP_BETA) CheckDlgButton (hwnd, IDC_CHECKUPDATESBETA_CHK, BST_CHECKED); _r_ctrl_enable (hwnd, IDC_CHECKUPDATESBETA_CHK, FALSE); #else CheckDlgButton (hwnd, IDC_CHECKUPDATESBETA_CHK, _r_config_getboolean (L"CheckUpdatesBeta", FALSE) ? BST_CHECKED : BST_UNCHECKED); if (!_r_config_getboolean (L"CheckUpdates", TRUE)) _r_ctrl_enable (hwnd, IDC_CHECKUPDATESBETA_CHK, FALSE); #endif // _DEBUG || _APP_BETA _r_locale_enum (hwnd, IDC_LANGUAGE, 0); break; } case IDD_SETTINGS_RULES: { CheckDlgButton (hwnd, IDC_RULE_BLOCKOUTBOUND, _r_config_getboolean (L"BlockOutboundConnections", TRUE) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton (hwnd, IDC_RULE_BLOCKINBOUND, _r_config_getboolean (L"BlockInboundConnections", TRUE) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton (hwnd, IDC_RULE_ALLOWLOOPBACK, _r_config_getboolean (L"AllowLoopbackConnections", TRUE) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton (hwnd, IDC_RULE_ALLOW6TO4, _r_config_getboolean (L"AllowIPv6", TRUE) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton (hwnd, IDC_SECUREFILTERS_CHK, _r_config_getboolean (L"IsSecureFilters", TRUE) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton (hwnd, IDC_USESTEALTHMODE_CHK, _r_config_getboolean (L"UseStealthMode", TRUE) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton (hwnd, IDC_INSTALLBOOTTIMEFILTERS_CHK, _r_config_getboolean (L"InstallBoottimeFilters", TRUE) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton (hwnd, IDC_USECERTIFICATES_CHK, _r_config_getboolean (L"IsCertificatesEnabled", FALSE) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton (hwnd, IDC_USENETWORKRESOLUTION_CHK, _r_config_getboolean (L"IsNetworkResolutionsEnabled", FALSE) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton (hwnd, IDC_USEREFRESHDEVICES_CHK, _r_config_getboolean (L"IsRefreshDevices", TRUE) ? BST_CHECKED : BST_UNCHECKED); HWND htip = _r_ctrl_createtip (hwnd); if (htip) { _r_ctrl_settiptext (htip, hwnd, IDC_RULE_BLOCKOUTBOUND, LPSTR_TEXTCALLBACK); _r_ctrl_settiptext (htip, hwnd, IDC_RULE_BLOCKINBOUND, LPSTR_TEXTCALLBACK); _r_ctrl_settiptext (htip, hwnd, IDC_RULE_ALLOWLOOPBACK, LPSTR_TEXTCALLBACK); _r_ctrl_settiptext (htip, hwnd, IDC_RULE_ALLOW6TO4, LPSTR_TEXTCALLBACK); _r_ctrl_settiptext (htip, hwnd, IDC_USESTEALTHMODE_CHK, LPSTR_TEXTCALLBACK); _r_ctrl_settiptext (htip, hwnd, IDC_INSTALLBOOTTIMEFILTERS_CHK, LPSTR_TEXTCALLBACK); _r_ctrl_settiptext (htip, hwnd, IDC_SECUREFILTERS_CHK, LPSTR_TEXTCALLBACK); } break; } case IDD_SETTINGS_BLOCKLIST: { for (INT i = IDC_BLOCKLIST_SPY_DISABLE; i <= IDC_BLOCKLIST_EXTRA_BLOCK; i++) CheckDlgButton (hwnd, i, BST_UNCHECKED); // HACK!!! reset button checkboxes! CheckDlgButton (hwnd, (IDC_BLOCKLIST_SPY_DISABLE + _r_calc_clamp (INT, _r_config_getinteger (L"BlocklistSpyState", 2), 0, 2)), BST_CHECKED); CheckDlgButton (hwnd, (IDC_BLOCKLIST_UPDATE_DISABLE + _r_calc_clamp (INT, _r_config_getinteger (L"BlocklistUpdateState", 0), 0, 2)), BST_CHECKED); CheckDlgButton (hwnd, (IDC_BLOCKLIST_EXTRA_DISABLE + _r_calc_clamp (INT, _r_config_getinteger (L"BlocklistExtraState", 0), 0, 2)), BST_CHECKED); break; } case IDD_SETTINGS_INTERFACE: { CheckDlgButton (hwnd, IDC_CONFIRMEXIT_CHK, _r_config_getboolean (L"ConfirmExit2", TRUE) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton (hwnd, IDC_CONFIRMEXITTIMER_CHK, _r_config_getboolean (L"ConfirmExitTimer", TRUE) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton (hwnd, IDC_CONFIRMLOGCLEAR_CHK, _r_config_getboolean (L"ConfirmLogClear", TRUE) ? BST_CHECKED : BST_UNCHECKED); break; } case IDD_SETTINGS_HIGHLIGHTING: { // configure listview _r_listview_setstyle (hwnd, IDC_COLORS, LVS_EX_DOUBLEBUFFER | LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP | LVS_EX_LABELTIP | LVS_EX_CHECKBOXES, FALSE); _app_listviewsetview (hwnd, IDC_COLORS); _r_listview_deleteallitems (hwnd, IDC_COLORS); _r_listview_deleteallcolumns (hwnd, IDC_COLORS); _r_listview_addcolumn (hwnd, IDC_COLORS, 0, L"", 0, LVCFMT_LEFT); INT item = 0; PITEM_COLOR ptr_clr; for (auto it = colors.begin (); it != colors.end (); ++it) { ptr_clr = *it; ptr_clr->new_clr = _r_config_getulong (_r_obj_getstring (ptr_clr->configValue), ptr_clr->default_clr, L"colors"); _r_fastlock_acquireshared (&lock_checkbox); _r_listview_additemex (hwnd, IDC_COLORS, item, 0, _r_locale_getstring (ptr_clr->locale_id), config.icon_id, I_GROUPIDNONE, (LPARAM)ptr_clr); _r_listview_setitemcheck (hwnd, IDC_COLORS, item, _r_config_getboolean (_r_obj_getstring (ptr_clr->configName), ptr_clr->is_enabled, L"colors")); _r_fastlock_releaseshared (&lock_checkbox); item += 1; } break; } case IDD_SETTINGS_NOTIFICATIONS: { CheckDlgButton (hwnd, IDC_ENABLENOTIFICATIONS_CHK, _r_config_getboolean (L"IsNotificationsEnabled", TRUE) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton (hwnd, IDC_NOTIFICATIONSOUND_CHK, _r_config_getboolean (L"IsNotificationsSound", TRUE) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton (hwnd, IDC_NOTIFICATIONFULLSCREENSILENTMODE_CHK, _r_config_getboolean (L"IsNotificationsFullscreenSilentMode", TRUE) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton (hwnd, IDC_NOTIFICATIONONTRAY_CHK, _r_config_getboolean (L"IsNotificationsOnTray", FALSE) ? BST_CHECKED : BST_UNCHECKED); SendDlgItemMessage (hwnd, IDC_NOTIFICATIONTIMEOUT, UDM_SETRANGE32, 0, _r_calc_days2seconds (LPARAM, 7)); SendDlgItemMessage (hwnd, IDC_NOTIFICATIONTIMEOUT, UDM_SETPOS32, 0, (LPARAM)_r_config_getulong (L"NotificationsTimeout", NOTIFY_TIMEOUT_DEFAULT)); CheckDlgButton (hwnd, IDC_EXCLUDEBLOCKLIST_CHK, _r_config_getboolean (L"IsExcludeBlocklist", TRUE) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton (hwnd, IDC_EXCLUDECUSTOM_CHK, _r_config_getboolean (L"IsExcludeCustomRules", TRUE) ? BST_CHECKED : BST_UNCHECKED); PostMessage (hwnd, WM_COMMAND, MAKEWPARAM (IDC_ENABLENOTIFICATIONS_CHK, 0), 0); break; } case IDD_SETTINGS_LOGGING: { CheckDlgButton (hwnd, IDC_ENABLELOG_CHK, _r_config_getboolean (L"IsLogEnabled", FALSE) ? BST_CHECKED : BST_UNCHECKED); _r_ctrl_settext (hwnd, IDC_LOGPATH, _r_config_getstring (L"LogPath", LOG_PATH_DEFAULT)); _r_ctrl_settext (hwnd, IDC_LOGVIEWER, _r_config_getstring (L"LogViewer", LOG_VIEWER_DEFAULT)); UDACCEL ud = {0}; ud.nInc = 64; // set step to 64kb SendDlgItemMessage (hwnd, IDC_LOGSIZELIMIT, UDM_SETACCEL, 1, (LPARAM)&ud); SendDlgItemMessage (hwnd, IDC_LOGSIZELIMIT, UDM_SETRANGE32, 64, _r_calc_kilobytes2bytes (LPARAM, 512)); SendDlgItemMessage (hwnd, IDC_LOGSIZELIMIT, UDM_SETPOS32, 0, (LPARAM)_r_config_getulong (L"LogSizeLimitKb", LOG_SIZE_LIMIT_DEFAULT)); CheckDlgButton (hwnd, IDC_ENABLEUILOG_CHK, _r_config_getboolean (L"IsLogUiEnabled", FALSE) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton (hwnd, IDC_EXCLUDESTEALTH_CHK, _r_config_getboolean (L"IsExcludeStealth", TRUE) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton (hwnd, IDC_EXCLUDECLASSIFYALLOW_CHK, _r_config_getboolean (L"IsExcludeClassifyAllow", TRUE) ? BST_CHECKED : BST_UNCHECKED); // win8+ if (!_r_sys_isosversiongreaterorequal (WINDOWS_8)) _r_ctrl_enable (hwnd, IDC_EXCLUDECLASSIFYALLOW_CHK, FALSE); PostMessage (hwnd, WM_COMMAND, MAKEWPARAM (IDC_ENABLELOG_CHK, 0), 0); break; } break; } break; } case RM_LOCALIZE: { INT dialog_id = (INT)wparam; // localize titles _r_ctrl_settextformat (hwnd, IDC_TITLE_GENERAL, L"%s:", _r_locale_getstring (IDS_TITLE_GENERAL)); _r_ctrl_settextformat (hwnd, IDC_TITLE_LANGUAGE, L"%s: (Language)", _r_locale_getstring (IDS_TITLE_LANGUAGE)); _r_ctrl_settextformat (hwnd, IDC_TITLE_BLOCKLIST_SPY, L"%s:", _r_locale_getstring (IDS_BLOCKLIST_SPY)); _r_ctrl_settextformat (hwnd, IDC_TITLE_BLOCKLIST_UPDATE, L"%s:", _r_locale_getstring (IDS_BLOCKLIST_UPDATE)); _r_ctrl_settextformat (hwnd, IDC_TITLE_BLOCKLIST_EXTRA, L"%s: (Skype, Bing, Live, Outlook, etc.)", _r_locale_getstring (IDS_BLOCKLIST_EXTRA)); _r_ctrl_settextformat (hwnd, IDC_TITLE_CONNECTIONS, L"%s:", _r_locale_getstring (IDS_TAB_NETWORK)); _r_ctrl_settextformat (hwnd, IDC_TITLE_SECURITY, L"%s:", _r_locale_getstring (IDS_TITLE_SECURITY)); _r_ctrl_settextformat (hwnd, IDC_TITLE_CONFIRMATIONS, L"%s:", _r_locale_getstring (IDS_TITLE_CONFIRMATIONS)); _r_ctrl_settextformat (hwnd, IDC_TITLE_HIGHLIGHTING, L"%s:", _r_locale_getstring (IDS_TITLE_HIGHLIGHTING)); _r_ctrl_settextformat (hwnd, IDC_TITLE_NOTIFICATIONS, L"%s:", _r_locale_getstring (IDS_TITLE_NOTIFICATIONS)); _r_ctrl_settextformat (hwnd, IDC_TITLE_LOGGING, L"%s:", _r_locale_getstring (IDS_TITLE_LOGGING)); _r_ctrl_settextformat (hwnd, IDC_TITLE_INTERFACE, L"%s:", _r_locale_getstring (IDS_TITLE_INTERFACE)); _r_ctrl_settextformat (hwnd, IDC_TITLE_EXCLUDE, L"%s:", _r_locale_getstring (IDS_TITLE_EXCLUDE)); _r_ctrl_settextformat (hwnd, IDC_TITLE_ADVANCED, L"%s:", _r_locale_getstring (IDS_TITLE_ADVANCED)); switch (dialog_id) { case IDD_SETTINGS_GENERAL: { _r_ctrl_settext (hwnd, IDC_ALWAYSONTOP_CHK, _r_locale_getstring (IDS_ALWAYSONTOP_CHK)); _r_ctrl_settext (hwnd, IDC_LOADONSTARTUP_CHK, _r_locale_getstring (IDS_LOADONSTARTUP_CHK)); _r_ctrl_settext (hwnd, IDC_STARTMINIMIZED_CHK, _r_locale_getstring (IDS_STARTMINIMIZED_CHK)); _r_ctrl_settext (hwnd, IDC_SKIPUACWARNING_CHK, _r_locale_getstring (IDS_SKIPUACWARNING_CHK)); _r_ctrl_settext (hwnd, IDC_CHECKUPDATES_CHK, _r_locale_getstring (IDS_CHECKUPDATES_CHK)); _r_ctrl_settext (hwnd, IDC_CHECKUPDATESBETA_CHK, _r_locale_getstring (IDS_CHECKUPDATESBETA_CHK)); _r_ctrl_settext (hwnd, IDC_LANGUAGE_HINT, _r_locale_getstring (IDS_LANGUAGE_HINT)); break; } case IDD_SETTINGS_RULES: { LPCWSTR recommendedString = _r_locale_getstring (IDS_RECOMMENDED); _r_ctrl_settextformat (hwnd, IDC_RULE_BLOCKOUTBOUND, L"%s (%s)", _r_locale_getstring (IDS_RULE_BLOCKOUTBOUND), recommendedString); _r_ctrl_settextformat (hwnd, IDC_RULE_BLOCKINBOUND, L"%s (%s)", _r_locale_getstring (IDS_RULE_BLOCKINBOUND), recommendedString); _r_ctrl_settextformat (hwnd, IDC_RULE_ALLOWLOOPBACK, L"%s (%s)", _r_locale_getstring (IDS_RULE_ALLOWLOOPBACK), recommendedString); _r_ctrl_settextformat (hwnd, IDC_RULE_ALLOW6TO4, L"%s (%s)", _r_locale_getstring (IDS_RULE_ALLOW6TO4), recommendedString); _r_ctrl_settextformat (hwnd, IDC_SECUREFILTERS_CHK, L"%s (%s)", _r_locale_getstring (IDS_SECUREFILTERS_CHK), recommendedString); _r_ctrl_settextformat (hwnd, IDC_USESTEALTHMODE_CHK, L"%s (%s)", _r_locale_getstring (IDS_USESTEALTHMODE_CHK), recommendedString); _r_ctrl_settextformat (hwnd, IDC_INSTALLBOOTTIMEFILTERS_CHK, L"%s (%s)", _r_locale_getstring (IDS_INSTALLBOOTTIMEFILTERS_CHK), recommendedString); _r_ctrl_settext (hwnd, IDC_USENETWORKRESOLUTION_CHK, _r_locale_getstring (IDS_USENETWORKRESOLUTION_CHK)); _r_ctrl_settext (hwnd, IDC_USECERTIFICATES_CHK, _r_locale_getstring (IDS_USECERTIFICATES_CHK)); _r_ctrl_settextformat (hwnd, IDC_USEREFRESHDEVICES_CHK, L"%s (%s)", _r_locale_getstring (IDS_USEREFRESHDEVICES_CHK), recommendedString); break; } case IDD_SETTINGS_BLOCKLIST: { LPCWSTR recommendedString = _r_locale_getstring (IDS_RECOMMENDED); LPCWSTR disableString = _r_locale_getstring (IDS_DISABLE); LPCWSTR allowString = _r_locale_getstring (IDS_ACTION_ALLOW); LPCWSTR blockString = _r_locale_getstring (IDS_ACTION_BLOCK); _r_ctrl_settext (hwnd, IDC_BLOCKLIST_SPY_DISABLE, disableString); _r_ctrl_settext (hwnd, IDC_BLOCKLIST_SPY_ALLOW, allowString); _r_ctrl_settextformat (hwnd, IDC_BLOCKLIST_SPY_BLOCK, L"%s (%s)", blockString, recommendedString); _r_ctrl_settextformat (hwnd, IDC_BLOCKLIST_UPDATE_DISABLE, L"%s (%s)", disableString, recommendedString); _r_ctrl_settext (hwnd, IDC_BLOCKLIST_UPDATE_ALLOW, allowString); _r_ctrl_settext (hwnd, IDC_BLOCKLIST_UPDATE_BLOCK, blockString); _r_ctrl_settextformat (hwnd, IDC_BLOCKLIST_EXTRA_DISABLE, L"%s (%s)", disableString, recommendedString); _r_ctrl_settext (hwnd, IDC_BLOCKLIST_EXTRA_ALLOW, allowString); _r_ctrl_settext (hwnd, IDC_BLOCKLIST_EXTRA_BLOCK, blockString); _r_ctrl_settextformat (hwnd, IDC_BLOCKLIST_INFO, L"Author: WindowsSpyBlocker - block spying and tracking on Windows systems.", WINDOWSSPYBLOCKER_URL); break; } case IDD_SETTINGS_INTERFACE: { _r_ctrl_settext (hwnd, IDC_CONFIRMEXIT_CHK, _r_locale_getstring (IDS_CONFIRMEXIT_CHK)); _r_ctrl_settext (hwnd, IDC_CONFIRMEXITTIMER_CHK, _r_locale_getstring (IDS_CONFIRMEXITTIMER_CHK)); _r_ctrl_settext (hwnd, IDC_CONFIRMLOGCLEAR_CHK, _r_locale_getstring (IDS_CONFIRMLOGCLEAR_CHK)); break; } case IDD_SETTINGS_HIGHLIGHTING: { _r_listview_setcolumn (hwnd, IDC_COLORS, 0, NULL, -100); for (INT i = 0; i < _r_listview_getitemcount (hwnd, IDC_COLORS, FALSE); i++) { PITEM_COLOR ptr_clr = (PITEM_COLOR)_r_listview_getitemlparam (hwnd, IDC_COLORS, i); if (ptr_clr) { _r_fastlock_acquireshared (&lock_checkbox); _r_listview_setitem (hwnd, IDC_COLORS, i, 0, _r_locale_getstring (ptr_clr->locale_id)); _r_fastlock_releaseshared (&lock_checkbox); } } _r_ctrl_settext (hwnd, IDC_COLORS_HINT, _r_locale_getstring (IDS_COLORS_HINT)); break; } case IDD_SETTINGS_NOTIFICATIONS: { _r_ctrl_settext (hwnd, IDC_ENABLENOTIFICATIONS_CHK, _r_locale_getstring (IDS_ENABLENOTIFICATIONS_CHK)); _r_ctrl_settext (hwnd, IDC_NOTIFICATIONSOUND_CHK, _r_locale_getstring (IDS_NOTIFICATIONSOUND_CHK)); _r_ctrl_settext (hwnd, IDC_NOTIFICATIONFULLSCREENSILENTMODE_CHK, _r_locale_getstring (IDS_NOTIFICATIONFULLSCREENSILENTMODE_CHK)); _r_ctrl_settext (hwnd, IDC_NOTIFICATIONONTRAY_CHK, _r_locale_getstring (IDS_NOTIFICATIONONTRAY_CHK)); _r_ctrl_settext (hwnd, IDC_NOTIFICATIONTIMEOUT_HINT, _r_locale_getstring (IDS_NOTIFICATIONTIMEOUT_HINT)); _r_ctrl_settextformat (hwnd, IDC_EXCLUDEBLOCKLIST_CHK, L"%s %s", _r_locale_getstring (IDS_TITLE_EXCLUDE), _r_locale_getstring (IDS_EXCLUDEBLOCKLIST_CHK)); _r_ctrl_settextformat (hwnd, IDC_EXCLUDECUSTOM_CHK, L"%s %s", _r_locale_getstring (IDS_TITLE_EXCLUDE), _r_locale_getstring (IDS_EXCLUDECUSTOM_CHK)); break; } case IDD_SETTINGS_LOGGING: { _r_ctrl_settext (hwnd, IDC_ENABLELOG_CHK, _r_locale_getstring (IDS_ENABLELOG_CHK)); _r_ctrl_settextformat (hwnd, IDC_LOGVIEWER_HINT, L"%s:", _r_locale_getstring (IDS_LOGVIEWER_HINT)); _r_ctrl_settext (hwnd, IDC_LOGSIZELIMIT_HINT, _r_locale_getstring (IDS_LOGSIZELIMIT_HINT)); _r_ctrl_settextformat (hwnd, IDC_ENABLEUILOG_CHK, L"%s (session only)", _r_locale_getstring (IDS_ENABLEUILOG_CHK)); _r_ctrl_settextformat (hwnd, IDC_EXCLUDESTEALTH_CHK, L"%s %s", _r_locale_getstring (IDS_TITLE_EXCLUDE), _r_locale_getstring (IDS_EXCLUDESTEALTH_CHK)); _r_ctrl_settextformat (hwnd, IDC_EXCLUDECLASSIFYALLOW_CHK, L"%s %s [win8+]", _r_locale_getstring (IDS_TITLE_EXCLUDE), _r_locale_getstring (IDS_EXCLUDECLASSIFYALLOW_CHK)); BOOLEAN is_classic = _r_app_isclassicui (); _r_wnd_addstyle (hwnd, IDC_LOGPATH_BTN, is_classic ? WS_EX_STATICEDGE : 0, WS_EX_STATICEDGE, GWL_EXSTYLE); _r_wnd_addstyle (hwnd, IDC_LOGVIEWER_BTN, is_classic ? WS_EX_STATICEDGE : 0, WS_EX_STATICEDGE, GWL_EXSTYLE); break; } } break; } case WM_VSCROLL: case WM_HSCROLL: { INT ctrl_id = GetDlgCtrlID ((HWND)lparam); if (ctrl_id == IDC_LOGSIZELIMIT) _r_config_setulong (L"LogSizeLimitKb", (DWORD)SendDlgItemMessage (hwnd, ctrl_id, UDM_GETPOS32, 0, 0)); else if (ctrl_id == IDC_NOTIFICATIONTIMEOUT) _r_config_setulong (L"NotificationsTimeout", (DWORD)SendDlgItemMessage (hwnd, ctrl_id, UDM_GETPOS32, 0, 0)); break; } case WM_NOTIFY: { LPNMHDR nmlp = (LPNMHDR)lparam; switch (nmlp->code) { case TTN_GETDISPINFO: { LPNMTTDISPINFO lpnmdi = (LPNMTTDISPINFO)lparam; if ((lpnmdi->uFlags & TTF_IDISHWND) == TTF_IDISHWND) { WCHAR buffer[1024] = {0}; INT ctrl_id = GetDlgCtrlID ((HWND)(lpnmdi->hdr.idFrom)); if (ctrl_id == IDC_RULE_BLOCKOUTBOUND) _r_str_copy (buffer, RTL_NUMBER_OF (buffer), _r_locale_getstring (IDS_RULE_BLOCKOUTBOUND)); else if (ctrl_id == IDC_RULE_BLOCKINBOUND) _r_str_copy (buffer, RTL_NUMBER_OF (buffer), _r_locale_getstring (IDS_RULE_BLOCKINBOUND)); else if (ctrl_id == IDC_RULE_ALLOWLOOPBACK) _r_str_copy (buffer, RTL_NUMBER_OF (buffer), _r_locale_getstring (IDS_RULE_ALLOWLOOPBACK_HINT)); else if (ctrl_id == IDC_USESTEALTHMODE_CHK) _r_str_copy (buffer, RTL_NUMBER_OF (buffer), _r_locale_getstring (IDS_USESTEALTHMODE_HINT)); else if (ctrl_id == IDC_INSTALLBOOTTIMEFILTERS_CHK) _r_str_copy (buffer, RTL_NUMBER_OF (buffer), _r_locale_getstring (IDS_INSTALLBOOTTIMEFILTERS_HINT)); else if (ctrl_id == IDC_SECUREFILTERS_CHK) _r_str_copy (buffer, RTL_NUMBER_OF (buffer), _r_locale_getstring (IDS_SECUREFILTERS_HINT)); if (!_r_str_isempty (buffer)) lpnmdi->lpszText = buffer; } break; } case LVN_ITEMCHANGED: { LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)lparam; INT listview_id = PtrToInt ((PVOID)lpnmlv->hdr.idFrom); if ((lpnmlv->uChanged & LVIF_STATE) != 0) { if (listview_id == IDC_COLORS) { if ((lpnmlv->uNewState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK (1) || ((lpnmlv->uNewState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK (2))) { if (_r_fastlock_islocked (&lock_checkbox)) break; BOOLEAN is_enabled = (lpnmlv->uNewState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK (2); PITEM_COLOR ptr_clr = (PITEM_COLOR)lpnmlv->lParam; if (ptr_clr) { _r_config_setboolean (_r_obj_getstring (ptr_clr->configName), is_enabled, L"colors"); _r_listview_redraw (_r_app_gethwnd (), (INT)_r_tab_getlparam (_r_app_gethwnd (), IDC_TAB, INVALID_INT), INVALID_INT); } } } } break; } case NM_CUSTOMDRAW: { LONG_PTR result = _app_nmcustdraw_listview ((LPNMLVCUSTOMDRAW)lparam); SetWindowLongPtr (hwnd, DWLP_MSGRESULT, result); return result; } case NM_DBLCLK: { LPNMITEMACTIVATE lpnmlv = (LPNMITEMACTIVATE)lparam; INT listview_id = PtrToInt ((PVOID)lpnmlv->hdr.idFrom); if (lpnmlv->iItem == INVALID_INT) break; if (listview_id == IDC_COLORS) { PITEM_COLOR ptr_clr_current = (PITEM_COLOR)_r_listview_getitemlparam (hwnd, listview_id, lpnmlv->iItem); if (ptr_clr_current) { CHOOSECOLOR cc = {0}; COLORREF cust[16] = {0}; SIZE_T index = 0; PITEM_COLOR ptr_clr; for (auto it = colors.begin (); it != colors.end (); ++it) { ptr_clr = *it; cust[index++] = ptr_clr->default_clr; } cc.lStructSize = sizeof (cc); cc.Flags = CC_RGBINIT | CC_FULLOPEN; cc.hwndOwner = hwnd; cc.lpCustColors = cust; cc.rgbResult = ptr_clr_current->new_clr; if (ChooseColor (&cc)) { ptr_clr_current->new_clr = cc.rgbResult; _r_config_setulong (_r_obj_getstring (ptr_clr_current->configValue), cc.rgbResult, L"colors"); _r_listview_redraw (hwnd, IDC_COLORS, INVALID_INT); _r_listview_redraw (_r_app_gethwnd (), (INT)_r_tab_getlparam (_r_app_gethwnd (), IDC_TAB, INVALID_INT), INVALID_INT); } } } break; } case NM_CLICK: case NM_RETURN: { PNMLINK pnmlink = (PNMLINK)lparam; if (!_r_str_isempty (pnmlink->item.szUrl)) ShellExecute (NULL, NULL, pnmlink->item.szUrl, NULL, NULL, SW_SHOWNORMAL); break; } } break; } case WM_COMMAND: { INT ctrl_id = LOWORD (wparam); INT notify_code = HIWORD (wparam); switch (ctrl_id) { case IDC_ALWAYSONTOP_CHK: { BOOLEAN is_enabled = (IsDlgButtonChecked (hwnd, ctrl_id) == BST_CHECKED); _r_config_setboolean (L"AlwaysOnTop", is_enabled); _r_menu_checkitem (GetMenu (_r_app_gethwnd ()), IDM_ALWAYSONTOP_CHK, 0, MF_BYCOMMAND, is_enabled); break; } #if defined(_APP_HAVE_AUTORUN) case IDC_LOADONSTARTUP_CHK: { _r_autorun_enable (hwnd, (IsDlgButtonChecked (hwnd, ctrl_id) == BST_CHECKED)); CheckDlgButton (hwnd, ctrl_id, _r_autorun_isenabled () ? BST_CHECKED : BST_UNCHECKED); break; } #endif // _APP_HAVE_AUTORUN case IDC_STARTMINIMIZED_CHK: { _r_config_setboolean (L"IsStartMinimized", (IsDlgButtonChecked (hwnd, ctrl_id) == BST_CHECKED)); break; } #if defined(_APP_HAVE_SKIPUAC) case IDC_SKIPUACWARNING_CHK: { _r_skipuac_enable (hwnd, (IsDlgButtonChecked (hwnd, ctrl_id) == BST_CHECKED)); CheckDlgButton (hwnd, ctrl_id, _r_skipuac_isenabled () ? BST_CHECKED : BST_UNCHECKED); break; } #endif // _APP_HAVE_SKIPUAC case IDC_CHECKUPDATES_CHK: { BOOLEAN is_enabled = (IsDlgButtonChecked (hwnd, ctrl_id) == BST_CHECKED); _r_config_setboolean (L"CheckUpdates", is_enabled); #if !defined(_DEBUG) && !defined(_APP_BETA) _r_ctrl_enable (hwnd, IDC_CHECKUPDATESBETA_CHK, is_enabled); #endif // !_DEBUG && !_APP_BETA break; } #if !defined(_DEBUG) && !defined(_APP_BETA) case IDC_CHECKUPDATESBETA_CHK: { _r_config_setboolean (L"CheckUpdatesBeta", (IsDlgButtonChecked (hwnd, ctrl_id) == BST_CHECKED)); break; } #endif // !_DEBUG && !_APP_BETA case IDC_LANGUAGE: { if (notify_code == CBN_SELCHANGE) _r_locale_applyfromcontrol (hwnd, ctrl_id); break; } case IDC_CONFIRMEXIT_CHK: { _r_config_setboolean (L"ConfirmExit2", (IsDlgButtonChecked (hwnd, ctrl_id) == BST_CHECKED)); break; } case IDC_CONFIRMEXITTIMER_CHK: { _r_config_setboolean (L"ConfirmExitTimer", (IsDlgButtonChecked (hwnd, ctrl_id) == BST_CHECKED)); break; } case IDC_CONFIRMLOGCLEAR_CHK: { _r_config_setboolean (L"ConfirmLogClear", (IsDlgButtonChecked (hwnd, ctrl_id) == BST_CHECKED)); break; } case IDC_RULE_BLOCKOUTBOUND: case IDC_RULE_BLOCKINBOUND: case IDC_RULE_ALLOWLOOPBACK: case IDC_RULE_ALLOW6TO4: case IDC_USESTEALTHMODE_CHK: case IDC_INSTALLBOOTTIMEFILTERS_CHK: case IDC_SECUREFILTERS_CHK: case IDC_USECERTIFICATES_CHK: case IDC_USENETWORKRESOLUTION_CHK: case IDC_USEREFRESHDEVICES_CHK: { _app_config_apply (_r_app_gethwnd (), ctrl_id); break; } case IDC_BLOCKLIST_SPY_DISABLE: case IDC_BLOCKLIST_SPY_ALLOW: case IDC_BLOCKLIST_SPY_BLOCK: case IDC_BLOCKLIST_UPDATE_DISABLE: case IDC_BLOCKLIST_UPDATE_ALLOW: case IDC_BLOCKLIST_UPDATE_BLOCK: case IDC_BLOCKLIST_EXTRA_DISABLE: case IDC_BLOCKLIST_EXTRA_ALLOW: case IDC_BLOCKLIST_EXTRA_BLOCK: { HMENU hmenu = GetMenu (_r_app_gethwnd ()); if (ctrl_id >= IDC_BLOCKLIST_SPY_DISABLE && ctrl_id <= IDC_BLOCKLIST_SPY_BLOCK) { INT new_state = _r_calc_clamp (INT, _r_ctrl_isradiobuttonchecked (hwnd, IDC_BLOCKLIST_SPY_DISABLE, IDC_BLOCKLIST_SPY_BLOCK) - IDC_BLOCKLIST_SPY_DISABLE, 0, 2); _r_menu_checkitem (hmenu, IDM_BLOCKLIST_SPY_DISABLE, IDM_BLOCKLIST_SPY_BLOCK, MF_BYCOMMAND, IDM_BLOCKLIST_SPY_DISABLE + new_state); _r_config_setinteger (L"BlocklistSpyState", new_state); _app_ruleblocklistset (_r_app_gethwnd (), new_state, INVALID_INT, INVALID_INT, TRUE); } else if (ctrl_id >= IDC_BLOCKLIST_UPDATE_DISABLE && ctrl_id <= IDC_BLOCKLIST_UPDATE_BLOCK) { INT new_state = _r_calc_clamp (INT, _r_ctrl_isradiobuttonchecked (hwnd, IDC_BLOCKLIST_UPDATE_DISABLE, IDC_BLOCKLIST_UPDATE_BLOCK) - IDC_BLOCKLIST_UPDATE_DISABLE, 0, 2); _r_menu_checkitem (hmenu, IDM_BLOCKLIST_UPDATE_DISABLE, IDM_BLOCKLIST_UPDATE_BLOCK, MF_BYCOMMAND, IDM_BLOCKLIST_UPDATE_DISABLE + new_state); _r_config_setinteger (L"BlocklistUpdateState", new_state); _app_ruleblocklistset (_r_app_gethwnd (), INVALID_INT, new_state, INVALID_INT, TRUE); } else if (ctrl_id >= IDC_BLOCKLIST_EXTRA_DISABLE && ctrl_id <= IDC_BLOCKLIST_EXTRA_BLOCK) { INT new_state = _r_calc_clamp (INT, _r_ctrl_isradiobuttonchecked (hwnd, IDC_BLOCKLIST_EXTRA_DISABLE, IDC_BLOCKLIST_EXTRA_BLOCK) - IDC_BLOCKLIST_EXTRA_DISABLE, 0, 2); _r_menu_checkitem (hmenu, IDM_BLOCKLIST_EXTRA_DISABLE, IDM_BLOCKLIST_EXTRA_BLOCK, MF_BYCOMMAND, IDM_BLOCKLIST_EXTRA_DISABLE + new_state); _r_config_setinteger (L"BlocklistExtraState", new_state); _app_ruleblocklistset (_r_app_gethwnd (), INVALID_INT, INVALID_INT, new_state, TRUE); } break; } case IDC_ENABLELOG_CHK: { BOOLEAN is_checked = (IsDlgButtonChecked (hwnd, ctrl_id) == BST_CHECKED); BOOLEAN is_enabled = is_checked || (IsDlgButtonChecked (hwnd, IDC_ENABLEUILOG_CHK) == BST_CHECKED); _r_config_setboolean (L"IsLogEnabled", is_checked); SendDlgItemMessage (config.hrebar, IDC_TOOLBAR, TB_PRESSBUTTON, IDM_TRAY_ENABLELOG_CHK, MAKELPARAM (is_checked, 0)); _r_ctrl_enable (hwnd, IDC_LOGPATH, is_checked); // input _r_ctrl_enable (hwnd, IDC_LOGPATH_BTN, is_checked); // button _r_ctrl_enable (hwnd, IDC_LOGVIEWER, is_checked); // input _r_ctrl_enable (hwnd, IDC_LOGVIEWER_BTN, is_checked); // button EnableWindow ((HWND)SendDlgItemMessage (hwnd, IDC_LOGSIZELIMIT, UDM_GETBUDDY, 0, 0), is_checked); _r_ctrl_enable (hwnd, IDC_EXCLUDESTEALTH_CHK, is_enabled); // win8+ if (_r_sys_isosversiongreaterorequal (WINDOWS_8)) _r_ctrl_enable (hwnd, IDC_EXCLUDECLASSIFYALLOW_CHK, is_enabled); _app_loginit (is_enabled); break; } case IDC_ENABLEUILOG_CHK: { BOOLEAN is_checked = (IsDlgButtonChecked (hwnd, ctrl_id) == BST_CHECKED); BOOLEAN is_enabled = is_checked || (IsDlgButtonChecked (hwnd, IDC_ENABLELOG_CHK) == BST_CHECKED); _r_config_setboolean (L"IsLogUiEnabled", is_checked); SendDlgItemMessage (config.hrebar, IDC_TOOLBAR, TB_PRESSBUTTON, IDM_TRAY_ENABLEUILOG_CHK, MAKELPARAM (is_checked, 0)); _r_ctrl_enable (hwnd, IDC_EXCLUDESTEALTH_CHK, is_enabled); // win8+ if (_r_sys_isosversiongreaterorequal (WINDOWS_8)) _r_ctrl_enable (hwnd, IDC_EXCLUDECLASSIFYALLOW_CHK, is_enabled); break; } case IDC_LOGPATH: { if (notify_code == EN_KILLFOCUS) { PR_STRING logpath = _r_ctrl_gettext (hwnd, ctrl_id); if (logpath) { _r_obj_movereference (&logpath, _r_path_unexpand (_r_obj_getstring (logpath))); _r_config_setstring (L"LogPath", _r_obj_getstring (logpath)); _app_loginit (_r_config_getboolean (L"IsLogEnabled", FALSE)); _r_obj_dereference (logpath); } } break; } case IDC_LOGPATH_BTN: { OPENFILENAME ofn = {0}; WCHAR path[512]; PR_STRING expandedPath; expandedPath = _r_ctrl_gettext (hwnd, IDC_LOGPATH); _r_obj_movereference (&expandedPath, _r_path_expand (_r_obj_getstring (expandedPath))); _r_str_copy (path, RTL_NUMBER_OF (path), _r_obj_getstring (expandedPath)); ofn.lStructSize = sizeof (ofn); ofn.hwndOwner = hwnd; ofn.lpstrFile = path; ofn.nMaxFile = RTL_NUMBER_OF (path); ofn.lpstrFileTitle = APP_NAME_SHORT; ofn.lpstrFilter = L"*." LOG_PATH_EXT L"\0*." LOG_PATH_EXT L"\0\0"; ofn.lpstrDefExt = LOG_PATH_EXT; ofn.Flags = OFN_EXPLORER | OFN_ENABLESIZING | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; if (GetSaveFileName (&ofn)) { _r_obj_movereference (&expandedPath, _r_path_unexpand (path)); _r_config_setstring (L"LogPath", _r_obj_getstring (expandedPath)); _r_ctrl_settext (hwnd, IDC_LOGPATH, _r_obj_getstringorempty (expandedPath)); _app_loginit (_r_config_getboolean (L"IsLogEnabled", FALSE)); } if (expandedPath) _r_obj_dereference (expandedPath); break; } case IDC_LOGVIEWER: { if (notify_code == EN_KILLFOCUS) { PR_STRING logviewer = _r_ctrl_gettext (hwnd, ctrl_id); if (logviewer) { _r_obj_movereference (&logviewer, _r_path_unexpand (_r_obj_getstring (logviewer))); _r_config_setstring (L"LogViewer", _r_obj_getstring (logviewer)); _r_obj_dereference (logviewer); } } break; } case IDC_LOGVIEWER_BTN: { OPENFILENAME ofn = {0}; WCHAR path[512]; PR_STRING expandedPath; expandedPath = _r_ctrl_gettext (hwnd, IDC_LOGVIEWER); _r_obj_movereference (&expandedPath, _r_path_expand (_r_obj_getstring (expandedPath))); _r_str_copy (path, RTL_NUMBER_OF (path), _r_obj_getstring (expandedPath)); ofn.lStructSize = sizeof (ofn); ofn.hwndOwner = hwnd; ofn.lpstrFile = path; ofn.nMaxFile = RTL_NUMBER_OF (path); ofn.lpstrFileTitle = APP_NAME_SHORT; ofn.lpstrFilter = L"*.exe\0*.exe\0\0"; ofn.lpstrDefExt = L"exe"; ofn.Flags = OFN_EXPLORER | OFN_ENABLESIZING | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if (GetOpenFileName (&ofn)) { _r_obj_movereference (&expandedPath, _r_path_unexpand (path)); _r_config_setstring (L"LogViewer", _r_obj_getstringorempty (expandedPath)); _r_ctrl_settext (hwnd, IDC_LOGVIEWER, _r_obj_getstringorempty (expandedPath)); } if (expandedPath) _r_obj_dereference (expandedPath); break; } case IDC_LOGSIZELIMIT_CTRL: { if (notify_code == EN_KILLFOCUS) _r_config_setulong (L"LogSizeLimitKb", (DWORD)SendDlgItemMessage (hwnd, IDC_LOGSIZELIMIT, UDM_GETPOS32, 0, 0)); break; } case IDC_ENABLENOTIFICATIONS_CHK: { BOOLEAN is_enabled = (IsDlgButtonChecked (hwnd, ctrl_id) == BST_CHECKED); _r_config_setboolean (L"IsNotificationsEnabled", is_enabled); SendDlgItemMessage (config.hrebar, IDC_TOOLBAR, TB_PRESSBUTTON, IDM_TRAY_ENABLENOTIFICATIONS_CHK, MAKELPARAM (is_enabled, 0)); _r_ctrl_enable (hwnd, IDC_NOTIFICATIONSOUND_CHK, is_enabled); _r_ctrl_enable (hwnd, IDC_NOTIFICATIONONTRAY_CHK, is_enabled); HWND hbuddy = (HWND)SendDlgItemMessage (hwnd, IDC_NOTIFICATIONTIMEOUT, UDM_GETBUDDY, 0, 0); if (hbuddy) EnableWindow (hbuddy, is_enabled); _r_ctrl_enable (hwnd, IDC_EXCLUDEBLOCKLIST_CHK, is_enabled); _r_ctrl_enable (hwnd, IDC_EXCLUDECUSTOM_CHK, is_enabled); PostMessage (hwnd, WM_COMMAND, MAKEWPARAM (IDC_NOTIFICATIONSOUND_CHK, 0), 0); _app_notifyrefresh (config.hnotification, FALSE); break; } case IDC_NOTIFICATIONSOUND_CHK: { BOOLEAN is_checked = (IsDlgButtonChecked (hwnd, ctrl_id) == BST_CHECKED); CheckDlgButton (hwnd, IDC_NOTIFICATIONFULLSCREENSILENTMODE_CHK, _r_config_getboolean (L"IsNotificationsFullscreenSilentMode", TRUE) ? BST_CHECKED : BST_UNCHECKED); _r_config_setboolean (L"IsNotificationsSound", is_checked); _r_ctrl_enable (hwnd, IDC_NOTIFICATIONFULLSCREENSILENTMODE_CHK, _r_ctrl_isenabled (hwnd, ctrl_id) && is_checked); break; } case IDC_NOTIFICATIONFULLSCREENSILENTMODE_CHK: { _r_config_setboolean (L"IsNotificationsFullscreenSilentMode", (IsDlgButtonChecked (hwnd, ctrl_id) == BST_CHECKED)); break; } case IDC_NOTIFICATIONONTRAY_CHK: { _r_config_setboolean (L"IsNotificationsOnTray", (IsDlgButtonChecked (hwnd, ctrl_id) == BST_CHECKED)); if (IsWindowVisible (config.hnotification)) _app_notifysetpos (config.hnotification, TRUE); break; } case IDC_NOTIFICATIONTIMEOUT_CTRL: { if (notify_code == EN_KILLFOCUS) _r_config_setulong (L"NotificationsTimeout", (DWORD)SendDlgItemMessage (hwnd, IDC_NOTIFICATIONTIMEOUT, UDM_GETPOS32, 0, 0)); break; } case IDC_EXCLUDESTEALTH_CHK: { _r_config_setboolean (L"IsExcludeStealth", (IsDlgButtonChecked (hwnd, ctrl_id) == BST_CHECKED)); break; } case IDC_EXCLUDECLASSIFYALLOW_CHK: { _r_config_setboolean (L"IsExcludeClassifyAllow", (IsDlgButtonChecked (hwnd, ctrl_id) == BST_CHECKED)); break; } case IDC_EXCLUDEBLOCKLIST_CHK: { _r_config_setboolean (L"IsExcludeBlocklist", (IsDlgButtonChecked (hwnd, ctrl_id) == BST_CHECKED)); break; } case IDC_EXCLUDECUSTOM_CHK: { _r_config_setboolean (L"IsExcludeCustomRules", (IsDlgButtonChecked (hwnd, ctrl_id) == BST_CHECKED)); break; } } break; } } return FALSE; } VOID _app_resizewindow (HWND hwnd, LPARAM lparam) { SendDlgItemMessage (config.hrebar, IDC_TOOLBAR, TB_AUTOSIZE, 0, 0); SendDlgItemMessage (hwnd, IDC_STATUSBAR, WM_SIZE, 0, 0); RECT rc = {0}; GetClientRect (GetDlgItem (hwnd, IDC_STATUSBAR), &rc); INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); INT statusbar_height = _r_calc_rectheight (INT, &rc); INT rebar_height = (INT)SendDlgItemMessage (hwnd, IDC_REBAR, RB_GETBARHEIGHT, 0, 0); HDWP hdefer = BeginDeferWindowPos (2); hdefer = DeferWindowPos (hdefer, config.hrebar, NULL, 0, 0, LOWORD (lparam), rebar_height, SWP_NOZORDER | SWP_NOOWNERZORDER); hdefer = DeferWindowPos (hdefer, GetDlgItem (hwnd, IDC_TAB), NULL, 0, rebar_height, LOWORD (lparam), HIWORD (lparam) - rebar_height - statusbar_height, SWP_NOZORDER | SWP_NOOWNERZORDER); EndDeferWindowPos (hdefer); if (listview_id) { _r_tab_adjustchild (hwnd, IDC_TAB, GetDlgItem (hwnd, listview_id)); _app_listviewresize (hwnd, listview_id, FALSE); } _app_refreshstatus (hwnd, 0); } VOID _app_imagelist_init (HWND hwnd) { INT icon_size_small = _r_dc_getsystemmetrics (hwnd, SM_CXSMICON); INT icon_size_large = _r_dc_getsystemmetrics (hwnd, SM_CXICON); INT icon_size_toolbar = _r_calc_clamp (INT, _r_dc_getdpi (hwnd, _r_config_getinteger (L"ToolbarSize", _R_SIZE_ITEMHEIGHT)), icon_size_small, icon_size_large); SAFE_DELETE_OBJECT (config.hbmp_enable); SAFE_DELETE_OBJECT (config.hbmp_disable); SAFE_DELETE_OBJECT (config.hbmp_allow); SAFE_DELETE_OBJECT (config.hbmp_block); SAFE_DELETE_OBJECT (config.hbmp_cross); SAFE_DELETE_OBJECT (config.hbmp_rules); SAFE_DELETE_OBJECT (config.hbmp_checked); SAFE_DELETE_OBJECT (config.hbmp_unchecked); SAFE_DELETE_ICON (config.hicon_large); SAFE_DELETE_ICON (config.hicon_small); SAFE_DELETE_ICON (config.hicon_uwp); // get default icon for executable _app_getfileicon (_r_obj_getstring (config.ntoskrnl_path), FALSE, &config.icon_id, &config.hicon_large); _app_getfileicon (_r_obj_getstring (config.ntoskrnl_path), TRUE, NULL, &config.hicon_small); _app_getfileicon (_r_obj_getstring (config.shell32_path), FALSE, &config.icon_service_id, NULL); // get default icon for windows store package (win8+) if (_r_sys_isosversiongreaterorequal (WINDOWS_8)) { if (!_app_getfileicon (_r_obj_getstring (config.winstore_path), TRUE, &config.icon_uwp_id, &config.hicon_uwp)) { config.icon_uwp_id = config.icon_id; config.hicon_uwp = CopyIcon (config.hicon_small); } } config.hbmp_enable = _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_SHIELD_ENABLE), icon_size_small); config.hbmp_disable = _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_SHIELD_DISABLE), icon_size_small); config.hbmp_allow = _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_ALLOW), icon_size_small); config.hbmp_block = _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_BLOCK), icon_size_small); config.hbmp_cross = _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_CROSS), icon_size_small); config.hbmp_rules = _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_SETTINGS), icon_size_small); config.hbmp_checked = _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_CHECKED), icon_size_small); config.hbmp_unchecked = _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_UNCHECKED), icon_size_small); // toolbar imagelist if (config.himg_toolbar) ImageList_SetIconSize (config.himg_toolbar, icon_size_toolbar, icon_size_toolbar); else config.himg_toolbar = ImageList_Create (icon_size_toolbar, icon_size_toolbar, ILC_COLOR32 | ILC_HIGHQUALITYSCALE, 0, 0); if (config.himg_toolbar) { ImageList_Add (config.himg_toolbar, _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_SHIELD_ENABLE), icon_size_toolbar), NULL); ImageList_Add (config.himg_toolbar, _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_SHIELD_DISABLE), icon_size_toolbar), NULL); ImageList_Add (config.himg_toolbar, _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_REFRESH), icon_size_toolbar), NULL); ImageList_Add (config.himg_toolbar, _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_SETTINGS), icon_size_toolbar), NULL); ImageList_Add (config.himg_toolbar, _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_NOTIFICATIONS), icon_size_toolbar), NULL); ImageList_Add (config.himg_toolbar, _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_LOG), icon_size_toolbar), NULL); ImageList_Add (config.himg_toolbar, _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_LOGOPEN), icon_size_toolbar), NULL); ImageList_Add (config.himg_toolbar, _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_LOGCLEAR), icon_size_toolbar), NULL); ImageList_Add (config.himg_toolbar, _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_ADD), icon_size_toolbar), NULL); ImageList_Add (config.himg_toolbar, _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_DONATE), icon_size_toolbar), NULL); ImageList_Add (config.himg_toolbar, _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_LOGUI), icon_size_toolbar), NULL); } // rules imagelist (small) if (config.himg_rules_small) { ImageList_SetIconSize (config.himg_rules_small, icon_size_small, icon_size_small); } else { config.himg_rules_small = ImageList_Create (icon_size_small, icon_size_small, ILC_COLOR32 | ILC_HIGHQUALITYSCALE, 2, 2); } if (config.himg_rules_small) { ImageList_Add (config.himg_rules_small, _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_ALLOW), icon_size_small), NULL); ImageList_Add (config.himg_rules_small, _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_BLOCK), icon_size_small), NULL); } // rules imagelist (large) if (config.himg_rules_large) { ImageList_SetIconSize (config.himg_rules_large, icon_size_large, icon_size_large); } else { config.himg_rules_large = ImageList_Create (icon_size_large, icon_size_large, ILC_COLOR32 | ILC_HIGHQUALITYSCALE, 2, 2); } if (config.himg_rules_large) { ImageList_Add (config.himg_rules_large, _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_ALLOW), icon_size_large), NULL); ImageList_Add (config.himg_rules_large, _app_bitmapfrompng (NULL, MAKEINTRESOURCE (IDP_BLOCK), icon_size_large), NULL); } } VOID _app_toolbar_init (HWND hwnd) { config.hrebar = GetDlgItem (hwnd, IDC_REBAR); _r_toolbar_setstyle (hwnd, IDC_TOOLBAR, TBSTYLE_EX_DOUBLEBUFFER | TBSTYLE_EX_MIXEDBUTTONS | TBSTYLE_EX_HIDECLIPPEDBUTTONS); SendDlgItemMessage (hwnd, IDC_TOOLBAR, TB_SETIMAGELIST, 0, (LPARAM)config.himg_toolbar); _r_toolbar_addbutton (hwnd, IDC_TOOLBAR, IDM_TRAY_START, 0, BTNS_BUTTON | BTNS_AUTOSIZE, TBSTATE_ENABLED, I_IMAGENONE); _r_toolbar_addbutton (hwnd, IDC_TOOLBAR, 0, BTNS_SEP, NULL, 0, I_IMAGENONE); _r_toolbar_addbutton (hwnd, IDC_TOOLBAR, IDM_OPENRULESEDITOR, 0, BTNS_BUTTON | BTNS_AUTOSIZE, TBSTATE_ENABLED, 8); _r_toolbar_addbutton (hwnd, IDC_TOOLBAR, 0, BTNS_SEP, NULL, 0, I_IMAGENONE); _r_toolbar_addbutton (hwnd, IDC_TOOLBAR, IDM_TRAY_ENABLENOTIFICATIONS_CHK, 0, BTNS_BUTTON | BTNS_AUTOSIZE, TBSTATE_ENABLED, 4); _r_toolbar_addbutton (hwnd, IDC_TOOLBAR, IDM_TRAY_ENABLELOG_CHK, 0, BTNS_BUTTON | BTNS_AUTOSIZE, TBSTATE_ENABLED, 5); _r_toolbar_addbutton (hwnd, IDC_TOOLBAR, IDM_TRAY_ENABLEUILOG_CHK, 0, BTNS_BUTTON | BTNS_AUTOSIZE, TBSTATE_ENABLED, 10); _r_toolbar_addbutton (hwnd, IDC_TOOLBAR, 0, BTNS_SEP, NULL, 0, I_IMAGENONE); _r_toolbar_addbutton (hwnd, IDC_TOOLBAR, IDM_REFRESH, 0, BTNS_BUTTON | BTNS_AUTOSIZE, TBSTATE_ENABLED, 2); _r_toolbar_addbutton (hwnd, IDC_TOOLBAR, IDM_SETTINGS, 0, BTNS_BUTTON | BTNS_AUTOSIZE, TBSTATE_ENABLED, 3); _r_toolbar_addbutton (hwnd, IDC_TOOLBAR, 0, BTNS_SEP, NULL, 0, I_IMAGENONE); _r_toolbar_addbutton (hwnd, IDC_TOOLBAR, IDM_TRAY_LOGSHOW, 0, BTNS_BUTTON | BTNS_AUTOSIZE, TBSTATE_ENABLED, 6); _r_toolbar_addbutton (hwnd, IDC_TOOLBAR, IDM_TRAY_LOGCLEAR, 0, BTNS_BUTTON | BTNS_AUTOSIZE, TBSTATE_ENABLED, 7); _r_toolbar_addbutton (hwnd, IDC_TOOLBAR, 0, BTNS_SEP, NULL, 0, I_IMAGENONE); _r_toolbar_addbutton (hwnd, IDC_TOOLBAR, IDM_DONATE, 0, BTNS_BUTTON | BTNS_AUTOSIZE, TBSTATE_ENABLED, 9); REBARBANDINFO rbi = {0}; rbi.cbSize = sizeof (rbi); rbi.fMask = RBBIM_STYLE | RBBIM_CHILD; rbi.fStyle = RBBS_CHILDEDGE | RBBS_USECHEVRON | RBBS_VARIABLEHEIGHT | RBBS_NOGRIPPER; rbi.hwndChild = GetDlgItem (hwnd, IDC_TOOLBAR); SendMessage (config.hrebar, RB_INSERTBAND, 0, (LPARAM)&rbi); } VOID _app_toolbar_resize () { REBARBANDINFO rbi = {0}; rbi.cbSize = sizeof (rbi); SendDlgItemMessage (config.hrebar, IDC_TOOLBAR, TB_AUTOSIZE, 0, 0); DWORD button_size = (DWORD)SendDlgItemMessage (config.hrebar, IDC_TOOLBAR, TB_GETBUTTONSIZE, 0, 0); if (button_size) { rbi.fMask |= RBBIM_CHILDSIZE; rbi.cxMinChild = LOWORD (button_size); rbi.cyMinChild = HIWORD (button_size); } SIZE idealWidth = {0}; if (SendDlgItemMessage (config.hrebar, IDC_TOOLBAR, TB_GETIDEALSIZE, FALSE, (LPARAM)&idealWidth)) { rbi.fMask |= RBBIM_SIZE | RBBIM_IDEALSIZE; rbi.cx = (UINT)idealWidth.cx; rbi.cxIdeal = (UINT)idealWidth.cx; } SendMessage (config.hrebar, RB_SETBANDINFO, 0, (LPARAM)&rbi); } VOID _app_tabs_init (HWND hwnd) { RECT rc = {0}; GetClientRect (hwnd, &rc); SetWindowPos (GetDlgItem (hwnd, IDC_TAB), NULL, 0, 0, _r_calc_rectwidth (INT, &rc), _r_calc_rectheight (INT, &rc), SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED | SWP_NOOWNERZORDER); PR_STRING localizedString = NULL; HINSTANCE hinst = _r_sys_getimagebase (); DWORD listview_ex_style = LVS_EX_DOUBLEBUFFER | LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP | LVS_EX_LABELTIP | LVS_EX_CHECKBOXES | LVS_EX_HEADERINALLVIEWS; DWORD listview_style = WS_CHILD | WS_TABSTOP | LVS_SHOWSELALWAYS | LVS_REPORT | LVS_SHAREIMAGELISTS | LVS_AUTOARRANGE; INT tabs_count = 0; CreateWindowEx (0, WC_LISTVIEW, NULL, listview_style, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, (HMENU)IDC_APPS_PROFILE, hinst, NULL); _r_tab_additem (hwnd, IDC_TAB, tabs_count++, _r_locale_getstring (IDS_TAB_APPS), I_IMAGENONE, IDC_APPS_PROFILE); CreateWindowEx (0, WC_LISTVIEW, NULL, listview_style, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, (HMENU)IDC_APPS_SERVICE, hinst, NULL); _r_tab_additem (hwnd, IDC_TAB, tabs_count++, _r_locale_getstring (IDS_TAB_SERVICES), I_IMAGENONE, IDC_APPS_SERVICE); // uwp apps (win8+) if (_r_sys_isosversiongreaterorequal (WINDOWS_8)) { CreateWindowEx (0, WC_LISTVIEW, NULL, listview_style, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, (HMENU)IDC_APPS_UWP, hinst, NULL); _r_tab_additem (hwnd, IDC_TAB, tabs_count++, _r_locale_getstring (IDS_TAB_PACKAGES), I_IMAGENONE, IDC_APPS_UWP); } if (!_r_config_getboolean (L"IsInternalRulesDisabled", FALSE)) { CreateWindowEx (0, WC_LISTVIEW, NULL, listview_style, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, (HMENU)IDC_RULES_BLOCKLIST, hinst, NULL); _r_tab_additem (hwnd, IDC_TAB, tabs_count++, _r_locale_getstring (IDS_TRAY_BLOCKLIST_RULES), I_IMAGENONE, IDC_RULES_BLOCKLIST); CreateWindowEx (0, WC_LISTVIEW, NULL, listview_style, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, (HMENU)IDC_RULES_SYSTEM, hinst, NULL); _r_tab_additem (hwnd, IDC_TAB, tabs_count++, _r_locale_getstring (IDS_TRAY_SYSTEM_RULES), I_IMAGENONE, IDC_RULES_SYSTEM); } CreateWindowEx (0, WC_LISTVIEW, NULL, listview_style, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, (HMENU)IDC_RULES_CUSTOM, hinst, NULL); _r_tab_additem (hwnd, IDC_TAB, tabs_count++, _r_locale_getstring (IDS_TRAY_USER_RULES), I_IMAGENONE, IDC_RULES_CUSTOM); CreateWindowEx (0, WC_LISTVIEW, NULL, listview_style, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, (HMENU)IDC_NETWORK, hinst, NULL); _r_tab_additem (hwnd, IDC_TAB, tabs_count++, _r_locale_getstring (IDS_TAB_NETWORK), I_IMAGENONE, IDC_NETWORK); CreateWindowEx (0, WC_LISTVIEW, NULL, listview_style | LVS_NOSORTHEADER, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, (HMENU)IDC_LOG, hinst, NULL); _r_tab_additem (hwnd, IDC_TAB, tabs_count++, _r_locale_getstring (IDS_TITLE_LOGGING), I_IMAGENONE, IDC_LOG); for (INT i = 0; i < tabs_count; i++) { INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, i); if (!listview_id) continue; HWND hlistview = GetDlgItem (hwnd, listview_id); if (!hlistview) continue; SetWindowPos (hlistview, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_FRAMECHANGED); _app_listviewsetfont (hwnd, listview_id, FALSE); if (listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_RULES_CUSTOM) { _r_listview_setstyle (hwnd, listview_id, listview_ex_style, TRUE); if (listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_APPS_UWP) { _r_listview_addcolumn (hwnd, listview_id, 0, _r_locale_getstring (IDS_NAME), 0, LVCFMT_LEFT); _r_listview_addcolumn (hwnd, listview_id, 1, _r_locale_getstring (IDS_ADDED), 0, LVCFMT_RIGHT); } else { _r_listview_addcolumn (hwnd, listview_id, 0, _r_locale_getstring (IDS_NAME), 0, LVCFMT_LEFT); _r_listview_addcolumn (hwnd, listview_id, 1, _r_locale_getstring (IDS_PROTOCOL), 0, LVCFMT_RIGHT); _r_listview_addcolumn (hwnd, listview_id, 2, _r_locale_getstring (IDS_DIRECTION), 0, LVCFMT_RIGHT); } _r_listview_addgroup (hwnd, listview_id, 0, L"", 0, LVGS_COLLAPSIBLE, LVGS_COLLAPSIBLE); _r_listview_addgroup (hwnd, listview_id, 1, L"", 0, LVGS_COLLAPSIBLE, LVGS_COLLAPSIBLE); _r_listview_addgroup (hwnd, listview_id, 2, L"", 0, LVGS_COLLAPSIBLE, LVGS_COLLAPSIBLE); } else if (listview_id == IDC_NETWORK || listview_id == IDC_LOG) { _r_listview_setstyle (hwnd, listview_id, listview_ex_style & ~LVS_EX_CHECKBOXES, (listview_id == IDC_NETWORK)); // no checkboxes _r_listview_addcolumn (hwnd, listview_id, 0, _r_locale_getstring (IDS_NAME), 0, LVCFMT_LEFT); _r_obj_movereference (&localizedString, _r_format_string (L"%s (" SZ_DIRECTION_LOCAL L")", _r_locale_getstring (IDS_ADDRESS))); _r_listview_addcolumn (hwnd, listview_id, 1, _r_obj_getstringorempty (localizedString), 0, LVCFMT_LEFT); _r_obj_movereference (&localizedString, _r_format_string (L"%s (" SZ_DIRECTION_LOCAL L")", _r_locale_getstring (IDS_PORT))); _r_listview_addcolumn (hwnd, listview_id, 2, _r_obj_getstringorempty (localizedString), 0, LVCFMT_RIGHT); _r_obj_movereference (&localizedString, _r_format_string (L"%s (" SZ_DIRECTION_REMOTE L")", _r_locale_getstring (IDS_ADDRESS))); _r_listview_addcolumn (hwnd, listview_id, 3, _r_obj_getstringorempty (localizedString), 0, LVCFMT_LEFT); _r_obj_movereference (&localizedString, _r_format_string (L"%s (" SZ_DIRECTION_REMOTE L")", _r_locale_getstring (IDS_PORT))); _r_listview_addcolumn (hwnd, listview_id, 4, _r_obj_getstringorempty (localizedString), 0, LVCFMT_RIGHT); _r_listview_addcolumn (hwnd, listview_id, 5, _r_locale_getstring (IDS_PROTOCOL), 0, LVCFMT_RIGHT); if (listview_id == IDC_NETWORK) { _r_listview_addcolumn (hwnd, listview_id, 6, _r_locale_getstring (IDS_STATE), 0, LVCFMT_RIGHT); _r_listview_addgroup (hwnd, listview_id, 0, L"", 0, LVGS_COLLAPSIBLE, LVGS_COLLAPSIBLE); _r_listview_addgroup (hwnd, listview_id, 1, L"", 0, LVGS_COLLAPSIBLE, LVGS_COLLAPSIBLE); _r_listview_addgroup (hwnd, listview_id, 2, L"", 0, LVGS_COLLAPSIBLE, LVGS_COLLAPSIBLE); } else if (listview_id == IDC_LOG) { _r_listview_addcolumn (hwnd, listview_id, 6, _r_locale_getstring (IDS_FILTER), 0, LVCFMT_LEFT); _r_listview_addcolumn (hwnd, listview_id, 7, _r_locale_getstring (IDS_DIRECTION), 0, LVCFMT_RIGHT); _r_listview_addcolumn (hwnd, listview_id, 8, _r_locale_getstring (IDS_STATE), 0, LVCFMT_RIGHT); } } _r_tab_adjustchild (hwnd, IDC_TAB, hlistview); } if (localizedString) _r_obj_dereference (localizedString); } VOID _app_initialize () { pugi::set_memory_management_functions ((pugi::allocation_function)_r_mem_allocatezero, _r_mem_free); // set allocation routine // initialize spinlocks _r_fastlock_initialize (&lock_apply); _r_fastlock_initialize (&lock_checkbox); _r_fastlock_initialize (&lock_logbusy); _r_fastlock_initialize (&lock_logthread); _r_fastlock_initialize (&lock_transaction); // set privileges { ULONG privileges[] = { SE_SECURITY_PRIVILEGE, SE_TAKE_OWNERSHIP_PRIVILEGE, SE_BACKUP_PRIVILEGE, SE_RESTORE_PRIVILEGE, SE_DEBUG_PRIVILEGE, }; _r_sys_setprivilege (privileges, RTL_NUMBER_OF (privileges), TRUE); } // set process priority SetPriorityClass (NtCurrentProcess (), ABOVE_NORMAL_PRIORITY_CLASS); // static initializer config.wd_length = GetWindowsDirectory (config.windows_dir, RTL_NUMBER_OF (config.windows_dir)); _r_str_printf (config.profile_path, RTL_NUMBER_OF (config.profile_path), L"%s\\" XML_PROFILE, _r_app_getprofiledirectory ()); _r_str_printf (config.profile_path_backup, RTL_NUMBER_OF (config.profile_path_backup), L"%s\\" XML_PROFILE L".bak", _r_app_getprofiledirectory ()); _r_str_printf (config.profile_internal_path, RTL_NUMBER_OF (config.profile_internal_path), L"%s\\" XML_PROFILE_INTERNAL, _r_app_getprofiledirectory ()); config.svchost_path = _r_path_expand (PATH_SVCHOST); config.ntoskrnl_path = _r_path_expand (PATH_NTOSKRNL); config.shell32_path = _r_path_expand (PATH_SHELL32); config.winstore_path = _r_path_expand (PATH_WINSTORE); config.my_hash = _r_str_hash (_r_sys_getimagepathname ()); config.ntoskrnl_hash = _r_str_hash (PROC_SYSTEM_NAME); config.svchost_hash = _r_str_hash (config.svchost_path); // initialize timers { if (config.htimer) DeleteTimerQueue (config.htimer); config.htimer = CreateTimerQueue (); timers.clear (); timers.emplace_back (_r_calc_minutes2seconds (time_t, 2)); timers.emplace_back (_r_calc_minutes2seconds (time_t, 5)); timers.emplace_back (_r_calc_minutes2seconds (time_t, 10)); timers.emplace_back (_r_calc_hours2seconds (time_t, 1)); timers.emplace_back (_r_calc_hours2seconds (time_t, 2)); timers.emplace_back (_r_calc_hours2seconds (time_t, 4)); timers.emplace_back (_r_calc_hours2seconds (time_t, 6)); } // initialize thread objects if (!config.done_evt) config.done_evt = CreateEventEx (NULL, NULL, 0, EVENT_ALL_ACCESS); _app_generate_credentials (); } INT FirstDriveFromMask (DWORD unitmask) { INT i; for (i = 0; i < _R_DEVICE_COUNT; ++i) { if (unitmask & 0x1) break; unitmask = unitmask >> 1; } return i; } INT_PTR CALLBACK DlgProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { if (msg == WM_FINDMSGSTRING) { LPFINDREPLACE lpfr = (LPFINDREPLACE)lparam; if ((lpfr->Flags & FR_DIALOGTERM) != 0) { config.hfind = NULL; } else if ((lpfr->Flags & FR_FINDNEXT) != 0) { INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); if (!listview_id) return FALSE; INT total_count = _r_listview_getitemcount (hwnd, listview_id, FALSE); if (!total_count) return FALSE; BOOLEAN is_wrap = TRUE; INT selected_item = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETNEXTITEM, (WPARAM)INVALID_INT, LVNI_SELECTED); INT current_item = selected_item + 1; INT last_item = total_count; find_wrap: for (; current_item < last_item; current_item++) { PR_STRING item_text = _r_listview_getitemtext (hwnd, listview_id, current_item, 0); if (item_text) { if (StrStrNIW (_r_obj_getstring (item_text), lpfr->lpstrFindWhat, (UINT)_r_obj_getstringlength (item_text)) != NULL) { _app_showitem (hwnd, listview_id, current_item, INVALID_INT); _r_obj_dereference (item_text); return FALSE; } _r_obj_dereference (item_text); } } if (is_wrap) { is_wrap = FALSE; current_item = 0; last_item = min (selected_item + 1, total_count); goto find_wrap; } } return FALSE; } switch (msg) { case WM_INITDIALOG: { SetWindowText (hwnd, APP_NAME); _app_initialize (); _r_wnd_center (hwnd, NULL); // init buffered paint BufferedPaintInit (); // allow drag&drop support DragAcceptFiles (hwnd, TRUE); // initialize settings _r_settings_addpage (IDD_SETTINGS_GENERAL, IDS_SETTINGS_GENERAL); _r_settings_addpage (IDD_SETTINGS_INTERFACE, IDS_TITLE_INTERFACE); _r_settings_addpage (IDD_SETTINGS_HIGHLIGHTING, IDS_TITLE_HIGHLIGHTING); _r_settings_addpage (IDD_SETTINGS_RULES, IDS_TRAY_RULES); if (!_r_config_getboolean (L"IsInternalRulesDisabled", FALSE)) _r_settings_addpage (IDD_SETTINGS_BLOCKLIST, IDS_TRAY_BLOCKLIST_RULES); // dropped packets logging (win7+) _r_settings_addpage (IDD_SETTINGS_NOTIFICATIONS, IDS_TITLE_NOTIFICATIONS); _r_settings_addpage (IDD_SETTINGS_LOGGING, IDS_TITLE_LOGGING); // initialize colors addcolor (IDS_HIGHLIGHT_TIMER, L"IsHighlightTimer", TRUE, L"ColorTimer", LISTVIEW_COLOR_TIMER); addcolor (IDS_HIGHLIGHT_INVALID, L"IsHighlightInvalid", TRUE, L"ColorInvalid", LISTVIEW_COLOR_INVALID); addcolor (IDS_HIGHLIGHT_SPECIAL, L"IsHighlightSpecial", TRUE, L"ColorSpecial", LISTVIEW_COLOR_SPECIAL); addcolor (IDS_HIGHLIGHT_SILENT, L"IsHighlightSilent", TRUE, L"ColorSilent", LISTVIEW_COLOR_SILENT); addcolor (IDS_HIGHLIGHT_SIGNED, L"IsHighlightSigned", TRUE, L"ColorSigned", LISTVIEW_COLOR_SIGNED); addcolor (IDS_HIGHLIGHT_PICO, L"IsHighlightPico", TRUE, L"ColorPico", LISTVIEW_COLOR_PICO); addcolor (IDS_HIGHLIGHT_SYSTEM, L"IsHighlightSystem", TRUE, L"ColorSystem", LISTVIEW_COLOR_SYSTEM); addcolor (IDS_HIGHLIGHT_CONNECTION, L"IsHighlightConnection", TRUE, L"ColorConnection", LISTVIEW_COLOR_CONNECTION); // restore window size and position (required!) _r_window_restoreposition (hwnd, L"window"); // initialize imagelist _app_imagelist_init (hwnd); // initialize toolbar _app_toolbar_init (hwnd); _app_toolbar_resize (); // initialize tabs _app_tabs_init (hwnd); #if defined(_APP_HAVE_DARKTHEME) _r_wnd_setdarktheme (hwnd); #endif // _APP_HAVE_DARKTHEME // load profile _app_profile_load (hwnd, NULL); // add blocklist to update if (!_r_config_getboolean (L"IsInternalRulesDisabled", FALSE)) { WCHAR internalProfileVersion[128]; _r_str_printf (internalProfileVersion, RTL_NUMBER_OF (internalProfileVersion), L"%" TEXT (PR_LONG64), config.profile_internal_timestamp); _r_update_addcomponent (L"Internal rules", L"profile_internal", internalProfileVersion, config.profile_internal_path, FALSE); } // initialize tab _app_settab_id (hwnd, _r_config_getinteger (L"CurrentTab", IDC_APPS_PROFILE)); // initialize dropped packets log callback thread (win7+) RtlSecureZeroMemory (&log_stack, sizeof (log_stack)); RtlInitializeSListHead (&log_stack.ListHead); // create notification window _app_notifycreatewindow (); // create network monitor thread _r_sys_createthreadex (&NetworkMonitorThread, (PVOID)hwnd, FALSE, THREAD_PRIORITY_LOWEST); // install filters { ENUM_INSTALL_TYPE install_type = _wfp_isfiltersinstalled (); if (install_type != InstallDisabled) { if (install_type == InstallEnabledTemporary) config.is_filterstemporary = TRUE; //if (_r_config_getboolean (L"IsDisableWindowsFirewallChecked", TRUE)) // _mps_changeconfig2 (FALSE); _app_changefilters (hwnd, TRUE, TRUE); } else { _r_status_settext (hwnd, IDC_STATUSBAR, 0, _r_locale_getstring (_app_getinterfacestatelocale (install_type))); } } // set column size when "auto-size" option are disabled if (!_r_config_getboolean (L"AutoSizeColumns", TRUE)) { for (INT i = 0; i < (INT)SendDlgItemMessage (hwnd, IDC_TAB, TCM_GETITEMCOUNT, 0, 0); i++) { INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, i); if (listview_id) _app_listviewresize (hwnd, listview_id, TRUE); } } break; } case WM_NCCREATE: { _r_wnd_enablenonclientscaling (hwnd); break; } case RM_INITIALIZE: { _r_tray_create (hwnd, UID, WM_TRAYICON, _r_app_getsharedimage (_r_sys_getimagebase (), (_wfp_isfiltersinstalled () != InstallDisabled) ? IDI_ACTIVE : IDI_INACTIVE, _r_dc_getsystemmetrics (hwnd, SM_CXSMICON)), APP_NAME, FALSE); HMENU hmenu = GetMenu (hwnd); if (hmenu) { if (_r_config_getboolean (L"IsInternalRulesDisabled", FALSE)) _r_menu_enableitem (hmenu, 4, MF_BYPOSITION, FALSE); _r_menu_checkitem (hmenu, IDM_ALWAYSONTOP_CHK, 0, MF_BYCOMMAND, _r_config_getboolean (L"AlwaysOnTop", _APP_ALWAYSONTOP)); _r_menu_checkitem (hmenu, IDM_SHOWFILENAMESONLY_CHK, 0, MF_BYCOMMAND, _r_config_getboolean (L"ShowFilenames", TRUE)); _r_menu_checkitem (hmenu, IDM_AUTOSIZECOLUMNS_CHK, 0, MF_BYCOMMAND, _r_config_getboolean (L"AutoSizeColumns", TRUE)); { UINT menu_id; INT view_type = _r_calc_clamp (INT, _r_config_getinteger (L"ViewType", LV_VIEW_DETAILS), LV_VIEW_ICON, LV_VIEW_MAX); if (view_type == LV_VIEW_ICON) menu_id = IDM_VIEW_ICON; else if (view_type == LV_VIEW_TILE) menu_id = IDM_VIEW_TILE; else menu_id = IDM_VIEW_DETAILS; _r_menu_checkitem (hmenu, IDM_VIEW_ICON, IDM_VIEW_TILE, MF_BYCOMMAND, menu_id); } { UINT menu_id; INT icon_size = _r_calc_clamp (INT, _r_config_getinteger (L"IconSize", SHIL_SYSSMALL), SHIL_LARGE, SHIL_LAST); if (icon_size == SHIL_EXTRALARGE) menu_id = IDM_SIZE_EXTRALARGE; else if (icon_size == SHIL_LARGE) menu_id = IDM_SIZE_LARGE; else menu_id = IDM_SIZE_SMALL; _r_menu_checkitem (hmenu, IDM_SIZE_SMALL, IDM_SIZE_EXTRALARGE, MF_BYCOMMAND, menu_id); } _r_menu_checkitem (hmenu, IDM_ICONSISHIDDEN, 0, MF_BYCOMMAND, _r_config_getboolean (L"IsIconsHidden", FALSE)); _r_menu_checkitem (hmenu, IDM_RULE_BLOCKOUTBOUND, 0, MF_BYCOMMAND, _r_config_getboolean (L"BlockOutboundConnections", TRUE)); _r_menu_checkitem (hmenu, IDM_RULE_BLOCKINBOUND, 0, MF_BYCOMMAND, _r_config_getboolean (L"BlockInboundConnections", TRUE)); _r_menu_checkitem (hmenu, IDM_RULE_ALLOWLOOPBACK, 0, MF_BYCOMMAND, _r_config_getboolean (L"AllowLoopbackConnections", TRUE)); _r_menu_checkitem (hmenu, IDM_RULE_ALLOW6TO4, 0, MF_BYCOMMAND, _r_config_getboolean (L"AllowIPv6", TRUE)); _r_menu_checkitem (hmenu, IDM_SECUREFILTERS_CHK, 0, MF_BYCOMMAND, _r_config_getboolean (L"IsSecureFilters", TRUE)); _r_menu_checkitem (hmenu, IDM_USESTEALTHMODE_CHK, 0, MF_BYCOMMAND, _r_config_getboolean (L"UseStealthMode", TRUE)); _r_menu_checkitem (hmenu, IDM_INSTALLBOOTTIMEFILTERS_CHK, 0, MF_BYCOMMAND, _r_config_getboolean (L"InstallBoottimeFilters", TRUE)); _r_menu_checkitem (hmenu, IDM_USECERTIFICATES_CHK, 0, MF_BYCOMMAND, _r_config_getboolean (L"IsCertificatesEnabled", FALSE)); _r_menu_checkitem (hmenu, IDM_USENETWORKRESOLUTION_CHK, 0, MF_BYCOMMAND, _r_config_getboolean (L"IsNetworkResolutionsEnabled", FALSE)); _r_menu_checkitem (hmenu, IDM_USEREFRESHDEVICES_CHK, 0, MF_BYCOMMAND, _r_config_getboolean (L"IsRefreshDevices", TRUE)); _r_menu_checkitem (hmenu, IDM_BLOCKLIST_SPY_DISABLE, IDM_BLOCKLIST_SPY_BLOCK, MF_BYCOMMAND, IDM_BLOCKLIST_SPY_DISABLE + _r_calc_clamp (INT, _r_config_getinteger (L"BlocklistSpyState", 2), 0, 2)); _r_menu_checkitem (hmenu, IDM_BLOCKLIST_UPDATE_DISABLE, IDM_BLOCKLIST_UPDATE_BLOCK, MF_BYCOMMAND, IDM_BLOCKLIST_UPDATE_DISABLE + _r_calc_clamp (INT, _r_config_getinteger (L"BlocklistUpdateState", 0), 0, 2)); _r_menu_checkitem (hmenu, IDM_BLOCKLIST_EXTRA_DISABLE, IDM_BLOCKLIST_EXTRA_BLOCK, MF_BYCOMMAND, IDM_BLOCKLIST_EXTRA_DISABLE + _r_calc_clamp (INT, _r_config_getinteger (L"BlocklistExtraState", 0), 0, 2)); } _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_ENABLENOTIFICATIONS_CHK, NULL, 0, _r_config_getboolean (L"IsNotificationsEnabled", TRUE) ? TBSTATE_PRESSED | TBSTATE_ENABLED : TBSTATE_ENABLED, I_IMAGENONE); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_ENABLELOG_CHK, NULL, 0, _r_config_getboolean (L"IsLogEnabled", FALSE) ? TBSTATE_PRESSED | TBSTATE_ENABLED : TBSTATE_ENABLED, I_IMAGENONE); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_ENABLEUILOG_CHK, NULL, 0, _r_config_getboolean (L"IsLogUiEnabled", FALSE) ? TBSTATE_PRESSED | TBSTATE_ENABLED : TBSTATE_ENABLED, I_IMAGENONE); break; } case RM_UNINITIALIZE: { _r_tray_destroy (hwnd, UID); break; } case RM_LOCALIZE: { HMENU hmenu = GetMenu (hwnd); if (hmenu) { _r_menu_setitemtext (hmenu, 0, TRUE, _r_locale_getstring (IDS_FILE)); _r_menu_setitemtext (hmenu, 1, TRUE, _r_locale_getstring (IDS_EDIT)); _r_menu_setitemtext (hmenu, 2, TRUE, _r_locale_getstring (IDS_VIEW)); _r_menu_setitemtext (hmenu, 3, TRUE, _r_locale_getstring (IDS_TRAY_RULES)); _r_menu_setitemtext (hmenu, 4, TRUE, _r_locale_getstring (IDS_TRAY_BLOCKLIST_RULES)); _r_menu_setitemtext (hmenu, 5, TRUE, _r_locale_getstring (IDS_HELP)); _r_menu_setitemtextformat (hmenu, IDM_SETTINGS, FALSE, L"%s...\tF2", _r_locale_getstring (IDS_SETTINGS)); _r_menu_setitemtextformat (hmenu, IDM_ADD_FILE, FALSE, L"%s...", _r_locale_getstring (IDS_ADD_FILE)); _r_menu_setitemtextformat (hmenu, IDM_IMPORT, FALSE, L"%s...\tCtrl+O", _r_locale_getstring (IDS_IMPORT)); _r_menu_setitemtextformat (hmenu, IDM_EXPORT, FALSE, L"%s...\tCtrl+S", _r_locale_getstring (IDS_EXPORT)); _r_menu_setitemtextformat (hmenu, IDM_EXIT, FALSE, _r_locale_getstring (IDS_EXIT)); _r_menu_setitemtextformat (hmenu, IDM_PURGE_UNUSED, FALSE, L"%s\tCtrl+Shift+X", _r_locale_getstring (IDS_PURGE_UNUSED)); _r_menu_setitemtextformat (hmenu, IDM_PURGE_TIMERS, FALSE, L"%s\tCtrl+Shift+T", _r_locale_getstring (IDS_PURGE_TIMERS)); _r_menu_setitemtextformat (hmenu, IDM_FIND, FALSE, L"%s\tCtrl+F", _r_locale_getstring (IDS_FIND)); _r_menu_setitemtextformat (hmenu, IDM_FINDNEXT, FALSE, L"%s\tF3", _r_locale_getstring (IDS_FINDNEXT)); _r_menu_setitemtextformat (hmenu, IDM_REFRESH, FALSE, L"%s\tF5", _r_locale_getstring (IDS_REFRESH)); _r_menu_setitemtext (hmenu, IDM_ALWAYSONTOP_CHK, FALSE, _r_locale_getstring (IDS_ALWAYSONTOP_CHK)); _r_menu_setitemtext (hmenu, IDM_SHOWFILENAMESONLY_CHK, FALSE, _r_locale_getstring (IDS_SHOWFILENAMESONLY_CHK)); _r_menu_setitemtext (hmenu, IDM_AUTOSIZECOLUMNS_CHK, FALSE, _r_locale_getstring (IDS_AUTOSIZECOLUMNS_CHK)); _r_menu_setitemtext (GetSubMenu (hmenu, 2), 4, TRUE, _r_locale_getstring (IDS_ICONS)); _r_menu_setitemtext (hmenu, IDM_SIZE_SMALL, FALSE, _r_locale_getstring (IDS_ICONSSMALL)); _r_menu_setitemtext (hmenu, IDM_SIZE_LARGE, FALSE, _r_locale_getstring (IDS_ICONSLARGE)); _r_menu_setitemtext (hmenu, IDM_SIZE_EXTRALARGE, FALSE, _r_locale_getstring (IDS_ICONSEXTRALARGE)); _r_menu_setitemtext (hmenu, IDM_VIEW_ICON, FALSE, _r_locale_getstring (IDS_VIEW_ICON)); _r_menu_setitemtext (hmenu, IDM_VIEW_DETAILS, FALSE, _r_locale_getstring (IDS_VIEW_DETAILS)); _r_menu_setitemtext (hmenu, IDM_VIEW_TILE, FALSE, _r_locale_getstring (IDS_VIEW_TILE)); _r_menu_setitemtext (hmenu, IDM_ICONSISHIDDEN, FALSE, _r_locale_getstring (IDS_ICONSISHIDDEN)); _r_menu_setitemtextformat (GetSubMenu (hmenu, 2), LANG_MENU, TRUE, L"%s (Language)", _r_locale_getstring (IDS_LANGUAGE)); _r_menu_setitemtextformat (hmenu, IDM_FONT, FALSE, L"%s...", _r_locale_getstring (IDS_FONT)); LPCWSTR recommendedString = _r_locale_getstring (IDS_RECOMMENDED); _r_menu_setitemtext (hmenu, IDM_CONNECTIONS_TITLE, FALSE, _r_locale_getstring (IDS_TAB_NETWORK)); _r_menu_setitemtext (hmenu, IDM_SECURITY_TITLE, FALSE, _r_locale_getstring (IDS_TITLE_SECURITY)); _r_menu_setitemtext (hmenu, IDM_ADVANCED_TITLE, FALSE, _r_locale_getstring (IDS_TITLE_ADVANCED)); _r_menu_enableitem (hmenu, IDM_CONNECTIONS_TITLE, MF_BYCOMMAND, FALSE); _r_menu_enableitem (hmenu, IDM_SECURITY_TITLE, MF_BYCOMMAND, FALSE); _r_menu_enableitem (hmenu, IDM_ADVANCED_TITLE, MF_BYCOMMAND, FALSE); _r_menu_setitemtextformat (hmenu, IDM_RULE_BLOCKOUTBOUND, FALSE, L"%s (%s)", _r_locale_getstring (IDS_RULE_BLOCKOUTBOUND), recommendedString); _r_menu_setitemtextformat (hmenu, IDM_RULE_BLOCKINBOUND, FALSE, L"%s (%s)", _r_locale_getstring (IDS_RULE_BLOCKINBOUND), recommendedString); _r_menu_setitemtextformat (hmenu, IDM_RULE_ALLOWLOOPBACK, FALSE, L"%s (%s)", _r_locale_getstring (IDS_RULE_ALLOWLOOPBACK), recommendedString); _r_menu_setitemtextformat (hmenu, IDM_RULE_ALLOW6TO4, FALSE, L"%s (%s)", _r_locale_getstring (IDS_RULE_ALLOW6TO4), recommendedString); _r_menu_setitemtextformat (hmenu, IDM_SECUREFILTERS_CHK, FALSE, L"%s (%s)", _r_locale_getstring (IDS_SECUREFILTERS_CHK), recommendedString); _r_menu_setitemtextformat (hmenu, IDM_USESTEALTHMODE_CHK, FALSE, L"%s (%s)", _r_locale_getstring (IDS_USESTEALTHMODE_CHK), recommendedString); _r_menu_setitemtextformat (hmenu, IDM_INSTALLBOOTTIMEFILTERS_CHK, FALSE, L"%s (%s)", _r_locale_getstring (IDS_INSTALLBOOTTIMEFILTERS_CHK), recommendedString); _r_menu_setitemtext (hmenu, IDM_USENETWORKRESOLUTION_CHK, FALSE, _r_locale_getstring (IDS_USENETWORKRESOLUTION_CHK)); _r_menu_setitemtext (hmenu, IDM_USECERTIFICATES_CHK, FALSE, _r_locale_getstring (IDS_USECERTIFICATES_CHK)); _r_menu_setitemtextformat (hmenu, IDM_USEREFRESHDEVICES_CHK, FALSE, L"%s (%s)", _r_locale_getstring (IDS_USEREFRESHDEVICES_CHK), recommendedString); _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_SPY_TITLE, FALSE, _r_locale_getstring (IDS_BLOCKLIST_SPY)); _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_UPDATE_TITLE, FALSE, _r_locale_getstring (IDS_BLOCKLIST_UPDATE)); _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_EXTRA_TITLE, FALSE, _r_locale_getstring (IDS_BLOCKLIST_EXTRA)); _r_menu_enableitem (hmenu, IDM_BLOCKLIST_SPY_TITLE, MF_BYCOMMAND, FALSE); _r_menu_enableitem (hmenu, IDM_BLOCKLIST_UPDATE_TITLE, MF_BYCOMMAND, FALSE); _r_menu_enableitem (hmenu, IDM_BLOCKLIST_EXTRA_TITLE, MF_BYCOMMAND, FALSE); _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_SPY_DISABLE, FALSE, _r_locale_getstring (IDS_DISABLE)); _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_SPY_ALLOW, FALSE, _r_locale_getstring (IDS_ACTION_ALLOW)); _r_menu_setitemtextformat (hmenu, IDM_BLOCKLIST_SPY_BLOCK, FALSE, L"%s (%s)", _r_locale_getstring (IDS_ACTION_BLOCK), recommendedString); _r_menu_setitemtextformat (hmenu, IDM_BLOCKLIST_UPDATE_DISABLE, FALSE, L"%s (%s)", _r_locale_getstring (IDS_DISABLE), recommendedString); _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_UPDATE_ALLOW, FALSE, _r_locale_getstring (IDS_ACTION_ALLOW)); _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_UPDATE_BLOCK, FALSE, _r_locale_getstring (IDS_ACTION_BLOCK)); _r_menu_setitemtextformat (hmenu, IDM_BLOCKLIST_EXTRA_DISABLE, FALSE, L"%s (%s)", _r_locale_getstring (IDS_DISABLE), recommendedString); _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_EXTRA_ALLOW, FALSE, _r_locale_getstring (IDS_ACTION_ALLOW)); _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_EXTRA_BLOCK, FALSE, _r_locale_getstring (IDS_ACTION_BLOCK)); _r_menu_setitemtext (hmenu, IDM_WEBSITE, FALSE, _r_locale_getstring (IDS_WEBSITE)); _r_menu_setitemtext (hmenu, IDM_CHECKUPDATES, FALSE, _r_locale_getstring (IDS_CHECKUPDATES)); _r_menu_setitemtextformat (hmenu, IDM_ABOUT, FALSE, L"%s\tF1", _r_locale_getstring (IDS_ABOUT)); _r_locale_enum ((HWND)GetSubMenu (hmenu, 2), LANG_MENU, IDX_LANGUAGE); // enum localizations } PR_STRING localizedString = NULL; // localize toolbar _app_setinterfacestate (hwnd); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_REFRESH, _r_locale_getstring (IDS_REFRESH), BTNS_BUTTON | BTNS_AUTOSIZE | BTNS_SHOWTEXT, 0, I_IMAGENONE); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_SETTINGS, _r_locale_getstring (IDS_SETTINGS), BTNS_BUTTON | BTNS_AUTOSIZE | BTNS_SHOWTEXT, 0, I_IMAGENONE); _r_obj_movereference (&localizedString, _r_format_string (L"%s...", _r_locale_getstring (IDS_OPENRULESEDITOR))); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_OPENRULESEDITOR, _r_obj_getstringorempty (localizedString), BTNS_BUTTON | BTNS_AUTOSIZE, 0, I_IMAGENONE); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_ENABLENOTIFICATIONS_CHK, _r_locale_getstring (IDS_ENABLENOTIFICATIONS_CHK), BTNS_CHECK | BTNS_AUTOSIZE, 0, I_IMAGENONE); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_ENABLELOG_CHK, _r_locale_getstring (IDS_ENABLELOG_CHK), BTNS_CHECK | BTNS_AUTOSIZE, 0, I_IMAGENONE); _r_obj_movereference (&localizedString, _r_format_string (L"%s (session only)", _r_locale_getstring (IDS_ENABLEUILOG_CHK))); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_ENABLEUILOG_CHK, _r_obj_getstringorempty (localizedString), BTNS_CHECK | BTNS_AUTOSIZE, 0, I_IMAGENONE); _r_obj_movereference (&localizedString, _r_format_string (L"%s (Ctrl+I)", _r_locale_getstring (IDS_LOGSHOW))); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_LOGSHOW, _r_obj_getstringorempty (localizedString), BTNS_BUTTON | BTNS_AUTOSIZE, 0, I_IMAGENONE); _r_obj_movereference (&localizedString, _r_format_string (L"%s (Ctrl+X)", _r_locale_getstring (IDS_LOGCLEAR))); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_LOGCLEAR, _r_obj_getstringorempty (localizedString), BTNS_BUTTON | BTNS_AUTOSIZE, 0, I_IMAGENONE); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_DONATE, _r_locale_getstring (IDS_DONATE), BTNS_BUTTON | BTNS_AUTOSIZE, 0, I_IMAGENONE); // set rebar size _app_toolbar_resize (); // localize tabs for (INT i = 0; i < (INT)SendDlgItemMessage (hwnd, IDC_TAB, TCM_GETITEMCOUNT, 0, 0); i++) { INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, i); UINT locale_id; if (listview_id == IDC_APPS_PROFILE) locale_id = IDS_TAB_APPS; else if (listview_id == IDC_APPS_SERVICE) locale_id = IDS_TAB_SERVICES; else if (listview_id == IDC_APPS_UWP) locale_id = IDS_TAB_PACKAGES; else if (listview_id == IDC_RULES_BLOCKLIST) locale_id = IDS_TRAY_BLOCKLIST_RULES; else if (listview_id == IDC_RULES_SYSTEM) locale_id = IDS_TRAY_SYSTEM_RULES; else if (listview_id == IDC_RULES_CUSTOM) locale_id = IDS_TRAY_USER_RULES; else if (listview_id == IDC_NETWORK) locale_id = IDS_TAB_NETWORK; else if (listview_id == IDC_LOG) locale_id = IDS_TITLE_LOGGING; else continue; _r_tab_setitem (hwnd, IDC_TAB, i, _r_locale_getstring (locale_id), I_IMAGENONE, 0); if (listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_APPS_UWP) { _r_listview_setcolumn (hwnd, listview_id, 0, _r_locale_getstring (IDS_NAME), 0); _r_listview_setcolumn (hwnd, listview_id, 1, _r_locale_getstring (IDS_ADDED), 0); } else if (listview_id >= IDC_RULES_BLOCKLIST && listview_id <= IDC_RULES_CUSTOM) { _r_listview_setcolumn (hwnd, listview_id, 0, _r_locale_getstring (IDS_NAME), 0); _r_listview_setcolumn (hwnd, listview_id, 1, _r_locale_getstring (IDS_PROTOCOL), 0); _r_listview_setcolumn (hwnd, listview_id, 2, _r_locale_getstring (IDS_DIRECTION), 0); } else if (listview_id == IDC_NETWORK) { _r_listview_setcolumn (hwnd, listview_id, 0, _r_locale_getstring (IDS_NAME), 0); _r_obj_movereference (&localizedString, _r_format_string (L"%s (" SZ_DIRECTION_LOCAL L")", _r_locale_getstring (IDS_ADDRESS))); _r_listview_setcolumn (hwnd, listview_id, 1, _r_obj_getstringorempty (localizedString), 0); _r_obj_movereference (&localizedString, _r_format_string (L"%s (" SZ_DIRECTION_LOCAL L")", _r_locale_getstring (IDS_PORT))); _r_listview_setcolumn (hwnd, listview_id, 2, _r_obj_getstringorempty (localizedString), 0); _r_obj_movereference (&localizedString, _r_format_string (L"%s (" SZ_DIRECTION_REMOTE L")", _r_locale_getstring (IDS_ADDRESS))); _r_listview_setcolumn (hwnd, listview_id, 3, _r_obj_getstringorempty (localizedString), 0); _r_obj_movereference (&localizedString, _r_format_string (L"%s (" SZ_DIRECTION_REMOTE L")", _r_locale_getstring (IDS_PORT))); _r_listview_setcolumn (hwnd, listview_id, 4, _r_obj_getstringorempty (localizedString), 0); _r_listview_setcolumn (hwnd, listview_id, 5, _r_locale_getstring (IDS_PROTOCOL), 0); _r_listview_setcolumn (hwnd, listview_id, 6, _r_locale_getstring (IDS_STATE), 0); } else if (listview_id == IDC_LOG) { _r_listview_setcolumn (hwnd, listview_id, 0, _r_locale_getstring (IDS_NAME), 0); _r_obj_movereference (&localizedString, _r_format_string (L"%s (" SZ_DIRECTION_LOCAL L")", _r_locale_getstring (IDS_ADDRESS))); _r_listview_setcolumn (hwnd, listview_id, 1, _r_obj_getstringorempty (localizedString), 0); _r_obj_movereference (&localizedString, _r_format_string (L"%s (" SZ_DIRECTION_LOCAL L")", _r_locale_getstring (IDS_PORT))); _r_listview_setcolumn (hwnd, listview_id, 2, _r_obj_getstringorempty (localizedString), 0); _r_obj_movereference (&localizedString, _r_format_string (L"%s (" SZ_DIRECTION_REMOTE L")", _r_locale_getstring (IDS_ADDRESS))); _r_listview_setcolumn (hwnd, listview_id, 3, _r_obj_getstringorempty (localizedString), 0); _r_obj_movereference (&localizedString, _r_format_string (L"%s (" SZ_DIRECTION_REMOTE L")", _r_locale_getstring (IDS_PORT))); _r_listview_setcolumn (hwnd, listview_id, 4, _r_obj_getstringorempty (localizedString), 0); _r_listview_setcolumn (hwnd, listview_id, 5, _r_locale_getstring (IDS_PROTOCOL), 0); _r_listview_setcolumn (hwnd, listview_id, 6, _r_locale_getstring (IDS_FILTER), 0); _r_listview_setcolumn (hwnd, listview_id, 7, _r_locale_getstring (IDS_DIRECTION), 0); _r_listview_setcolumn (hwnd, listview_id, 8, _r_locale_getstring (IDS_STATE), 0); } } INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); if (listview_id) { _app_listviewresize (hwnd, listview_id, FALSE); _app_refreshstatus (hwnd, listview_id); } // refresh notification BOOLEAN is_classic = _r_app_isclassicui (); _r_wnd_addstyle (config.hnotification, IDC_RULES_BTN, is_classic ? WS_EX_STATICEDGE : 0, WS_EX_STATICEDGE, GWL_EXSTYLE); _r_wnd_addstyle (config.hnotification, IDC_ALLOW_BTN, is_classic ? WS_EX_STATICEDGE : 0, WS_EX_STATICEDGE, GWL_EXSTYLE); _r_wnd_addstyle (config.hnotification, IDC_BLOCK_BTN, is_classic ? WS_EX_STATICEDGE : 0, WS_EX_STATICEDGE, GWL_EXSTYLE); _r_wnd_addstyle (config.hnotification, IDC_LATER_BTN, is_classic ? WS_EX_STATICEDGE : 0, WS_EX_STATICEDGE, GWL_EXSTYLE); _app_notifyrefresh (config.hnotification, FALSE); SAFE_DELETE_REFERENCE (localizedString); break; } case RM_TASKBARCREATED: { // refresh tray icon _r_tray_destroy (hwnd, UID); _r_tray_create (hwnd, UID, WM_TRAYICON, _r_app_getsharedimage (_r_sys_getimagebase (), (_wfp_isfiltersinstalled () != InstallDisabled) ? IDI_ACTIVE : IDI_INACTIVE, _r_dc_getsystemmetrics (hwnd, SM_CXSMICON)), APP_NAME, FALSE); break; } case RM_DPICHANGED: { PR_STRING localizedString = NULL; _app_imagelist_init (hwnd); SendDlgItemMessage (config.hrebar, IDC_TOOLBAR, TB_SETIMAGELIST, 0, (LPARAM)config.himg_toolbar); // reset toolbar information _app_setinterfacestate (hwnd); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_REFRESH, _r_locale_getstring (IDS_REFRESH), BTNS_BUTTON | BTNS_AUTOSIZE | BTNS_SHOWTEXT, 0, I_IMAGENONE); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_SETTINGS, _r_locale_getstring (IDS_SETTINGS), BTNS_BUTTON | BTNS_AUTOSIZE | BTNS_SHOWTEXT, 0, I_IMAGENONE); _r_obj_movereference (&localizedString, _r_format_string (L"%s...", _r_locale_getstring (IDS_OPENRULESEDITOR))); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_OPENRULESEDITOR, _r_obj_getstringorempty (localizedString), BTNS_BUTTON | BTNS_AUTOSIZE, 0, I_IMAGENONE); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_ENABLENOTIFICATIONS_CHK, _r_locale_getstring (IDS_ENABLENOTIFICATIONS_CHK), BTNS_CHECK | BTNS_AUTOSIZE, 0, I_IMAGENONE); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_ENABLELOG_CHK, _r_locale_getstring (IDS_ENABLELOG_CHK), BTNS_CHECK | BTNS_AUTOSIZE, 0, I_IMAGENONE); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_ENABLEUILOG_CHK, _r_locale_getstring (IDS_ENABLEUILOG_CHK), BTNS_CHECK | BTNS_AUTOSIZE, 0, I_IMAGENONE); _r_obj_movereference (&localizedString, _r_format_string (L"%s (Ctrl+I)", _r_locale_getstring (IDS_LOGSHOW))); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_LOGSHOW, _r_obj_getstringorempty (localizedString), BTNS_BUTTON | BTNS_AUTOSIZE, 0, I_IMAGENONE); _r_obj_movereference (&localizedString, _r_format_string (L"%s (Ctrl+X)", _r_locale_getstring (IDS_LOGCLEAR))); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_LOGCLEAR, _r_obj_getstringorempty (localizedString), BTNS_BUTTON | BTNS_AUTOSIZE, 0, I_IMAGENONE); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_DONATE, _r_locale_getstring (IDS_DONATE), BTNS_BUTTON | BTNS_AUTOSIZE, 0, I_IMAGENONE); _app_toolbar_resize (); INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); if (listview_id) { _app_listviewsetview (hwnd, listview_id); _app_listviewsetfont (hwnd, listview_id, TRUE); _app_listviewresize (hwnd, listview_id, FALSE); } _app_refreshstatus (hwnd, 0); SAFE_DELETE_REFERENCE (localizedString); break; } case RM_CONFIG_UPDATE: { _app_profile_save (); _app_profile_load (hwnd, NULL); _app_refreshstatus (hwnd, INVALID_INT); _app_changefilters (hwnd, TRUE, FALSE); break; } case RM_CONFIG_RESET: { time_t current_timestamp = (time_t)lparam; _app_freerulesconfig_map (&rules_config); _r_fs_makebackup (config.profile_path, current_timestamp, TRUE); _app_profile_load (hwnd, NULL); _app_refreshstatus (hwnd, INVALID_INT); _app_changefilters (hwnd, TRUE, FALSE); break; } case WM_CLOSE: { if (_wfp_isfiltersinstalled ()) { if (_app_istimersactive () ? !_r_show_confirmmessage (hwnd, NULL, _r_locale_getstring (IDS_QUESTION_TIMER), L"ConfirmExitTimer") : !_r_show_confirmmessage (hwnd, NULL, _r_locale_getstring (IDS_QUESTION_EXIT), L"ConfirmExit2")) { SetWindowLongPtr (hwnd, DWLP_MSGRESULT, TRUE); return TRUE; } } DestroyWindow (hwnd); break; } case WM_DESTROY: { _r_config_setinteger (L"CurrentTab", (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT)); if (config.hnotification) DestroyWindow (config.hnotification); if (config.htimer) DeleteTimerQueue (config.htimer); _r_tray_destroy (hwnd, UID); _app_loginit (FALSE); _app_freelogstack (); if (config.done_evt) { if (_wfp_isfiltersapplying ()) WaitForSingleObjectEx (config.done_evt, FILTERS_TIMEOUT, FALSE); CloseHandle (config.done_evt); } HANDLE hengine = _wfp_getenginehandle (); if (hengine) _wfp_uninitialize (hengine, FALSE); ImageList_Destroy (config.himg_toolbar); ImageList_Destroy (config.himg_rules_small); ImageList_Destroy (config.himg_rules_large); BufferedPaintUnInit (); PostQuitMessage (0); break; } case WM_DROPFILES: { PR_STRING string; UINT numfiles; UINT length; SIZE_T app_hash = 0; numfiles = DragQueryFile ((HDROP)wparam, UINT32_MAX, NULL, 0); for (UINT i = 0; i < numfiles; i++) { length = DragQueryFile ((HDROP)wparam, i, NULL, 0); string = _r_obj_createstringex (NULL, length * sizeof (WCHAR)); if (DragQueryFile ((HDROP)wparam, i, string->Buffer, length + 1)) app_hash = _app_addapplication (hwnd, string->Buffer, 0, 0, 0, FALSE, FALSE); _r_obj_dereference (string); } DragFinish ((HDROP)wparam); _app_profile_save (); _app_refreshstatus (hwnd, INVALID_INT); { INT app_listview_id = (INT)_app_getappinfo (app_hash, InfoListviewId); if (app_listview_id) { if (app_listview_id == (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT)) _app_listviewsort (hwnd, app_listview_id, INVALID_INT, FALSE); _app_showitem (hwnd, app_listview_id, _app_getposition (hwnd, app_listview_id, app_hash), INVALID_INT); } } break; } case WM_SETTINGCHANGE: { _app_notifyrefresh (config.hnotification, FALSE); break; } case WM_NOTIFY: { LPNMHDR nmlp = (LPNMHDR)lparam; switch (nmlp->code) { case TCN_SELCHANGING: { INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); if (!listview_id) break; HWND hlistview = GetDlgItem (hwnd, listview_id); if (!hlistview) break; ShowWindow (hlistview, SW_HIDE); break; } case TCN_SELCHANGE: { INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); if (!listview_id) break; HWND hlistview = GetDlgItem (hwnd, listview_id); if (!hlistview) break; _r_tab_adjustchild (hwnd, IDC_TAB, hlistview); _app_listviewsetview (hwnd, listview_id); _app_listviewsetfont (hwnd, listview_id, FALSE); _app_listviewsort (hwnd, listview_id, INVALID_INT, FALSE); _app_listviewresize (hwnd, listview_id, FALSE); _app_refreshstatus (hwnd, listview_id); _r_listview_redraw (hwnd, listview_id, INVALID_INT); ShowWindow (hlistview, SW_SHOWNA); if (IsWindowVisible (hwnd) && !IsIconic (hwnd)) // HACK!!! SetFocus (hlistview); break; } case NM_CUSTOMDRAW: { LONG_PTR result = CDRF_DODEFAULT; LPNMLVCUSTOMDRAW lpnmcd = (LPNMLVCUSTOMDRAW)lparam; INT ctrl_id = PtrToInt ((PVOID)lpnmcd->nmcd.hdr.idFrom); if (ctrl_id == IDC_TOOLBAR) { result = _app_nmcustdraw_toolbar (lpnmcd); } else { result = _app_nmcustdraw_listview (lpnmcd); } SetWindowLongPtr (hwnd, DWLP_MSGRESULT, result); return result; } case LVN_COLUMNCLICK: { LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)lparam; INT ctrl_id = PtrToInt ((PVOID)lpnmlv->hdr.idFrom); _app_listviewsort (hwnd, ctrl_id, lpnmlv->iSubItem, TRUE); break; } case LVN_GETINFOTIP: { LPNMLVGETINFOTIP lpnmlv = (LPNMLVGETINFOTIP)lparam; PR_STRING string = _app_gettooltip (hwnd, (INT)lpnmlv->hdr.idFrom, lpnmlv->iItem); if (string) { _r_str_copy (lpnmlv->pszText, lpnmlv->cchTextMax, string->Buffer); _r_obj_dereference (string); } break; } case LVN_ITEMCHANGED: { LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)lparam; if ((lpnmlv->uChanged & LVIF_STATE) != 0) { if ((lpnmlv->uNewState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK (1) || ((lpnmlv->uNewState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK (2))) { if (_r_fastlock_islocked (&lock_checkbox)) break; INT listview_id = PtrToInt ((PVOID)lpnmlv->hdr.idFrom); BOOLEAN is_changed = FALSE; BOOLEAN is_enabled = (lpnmlv->uNewState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK (2); if (listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_APPS_UWP) { SIZE_T app_hash = lpnmlv->lParam; PITEM_APP ptr_app = _app_getappitem (app_hash); if (!ptr_app) break; OBJECTS_APP_VECTOR rules; if (ptr_app->is_enabled != is_enabled) { ptr_app->is_enabled = is_enabled; _r_fastlock_acquireshared (&lock_checkbox); _app_setappiteminfo (hwnd, listview_id, lpnmlv->iItem, app_hash, ptr_app); _r_fastlock_releaseshared (&lock_checkbox); if (is_enabled) _app_freenotify (app_hash, ptr_app); if (!is_enabled && _app_istimeractive (ptr_app)) _app_timer_reset (hwnd, ptr_app); rules.emplace_back (ptr_app); if (_wfp_isfiltersinstalled ()) { HANDLE hengine = _wfp_getenginehandle (); if (hengine) _wfp_create3filters (hengine, &rules, __LINE__); } is_changed = TRUE; } _r_obj_dereference (ptr_app); } else if (listview_id >= IDC_RULES_BLOCKLIST && listview_id <= IDC_RULES_CUSTOM) { OBJECTS_RULE_VECTOR rules; SIZE_T rule_idx = lpnmlv->lParam; PITEM_RULE ptr_rule = _app_getrulebyid (rule_idx); if (!ptr_rule) break; if (ptr_rule->is_enabled != is_enabled) { _r_fastlock_acquireshared (&lock_checkbox); _app_ruleenable (ptr_rule, is_enabled); _app_setruleiteminfo (hwnd, listview_id, lpnmlv->iItem, ptr_rule, TRUE); _r_fastlock_releaseshared (&lock_checkbox); rules.emplace_back (ptr_rule); if (_wfp_isfiltersinstalled ()) { HANDLE hengine = _wfp_getenginehandle (); if (hengine) _wfp_create4filters (hengine, &rules, __LINE__); } is_changed = TRUE; } _r_obj_dereference (ptr_rule); } if (is_changed) { _app_listviewsort (hwnd, listview_id, INVALID_INT, FALSE); _app_refreshstatus (hwnd, listview_id); _app_profile_save (); } } } break; } case NM_DBLCLK: { LPNMITEMACTIVATE lpnmlv = (LPNMITEMACTIVATE)lparam; if (lpnmlv->iItem == INVALID_INT) break; INT command_id = 0; INT ctrl_id = PtrToInt ((PVOID)lpnmlv->hdr.idFrom); if (ctrl_id >= IDC_APPS_PROFILE && ctrl_id <= IDC_LOG) { command_id = IDM_PROPERTIES; } else if (ctrl_id == IDC_STATUSBAR) { LPNMMOUSE nmouse = (LPNMMOUSE)lparam; if (nmouse->dwItemSpec == 0) command_id = IDM_SELECT_ALL; else if (nmouse->dwItemSpec == 1) command_id = IDM_PURGE_UNUSED; else if (nmouse->dwItemSpec == 2) command_id = IDM_PURGE_TIMERS; } if (command_id) PostMessage (hwnd, WM_COMMAND, MAKEWPARAM (command_id, 0), 0); break; } case NM_RCLICK: { LPNMITEMACTIVATE lpnmlv = (LPNMITEMACTIVATE)lparam; if (lpnmlv->iItem == INVALID_INT) break; INT listview_id = PtrToInt ((PVOID)lpnmlv->hdr.idFrom); if (!(listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_LOG)) break; HMENU hmenu = CreatePopupMenu (); if (!hmenu) break; PR_STRING localizedString = NULL; PR_STRING columnText = NULL; HMENU hsubmenu1 = NULL; HMENU hsubmenu2 = NULL; SIZE_T hash_item = _r_listview_getitemlparam (hwnd, listview_id, lpnmlv->iItem); INT lv_column_current = lpnmlv->iSubItem; if (listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_APPS_UWP) { hsubmenu1 = CreatePopupMenu (); hsubmenu2 = CreatePopupMenu (); // show rules AppendMenu (hsubmenu1, MF_STRING, IDM_DISABLENOTIFICATIONS, _r_locale_getstring (IDS_DISABLENOTIFICATIONS)); _app_generate_rulesmenu (hsubmenu1, hash_item); // show timers AppendMenu (hsubmenu2, MF_STRING, IDM_DISABLETIMER, _r_locale_getstring (IDS_DISABLETIMER)); AppendMenu (hsubmenu2, MF_SEPARATOR, 0, NULL); _app_generate_timermenu (hsubmenu2, hash_item); _r_obj_movereference (&localizedString, _r_format_string (L"%s\tEnter", _r_locale_getstring (IDS_EXPLORE))); AppendMenu (hmenu, MF_STRING, IDM_PROPERTIES, _r_obj_getstringorempty (localizedString)); AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); AppendMenu (hmenu, MF_POPUP, (UINT_PTR)hsubmenu1, _r_locale_getstring (IDS_TRAY_RULES)); AppendMenu (hmenu, MF_POPUP, (UINT_PTR)hsubmenu2, _r_locale_getstring (IDS_TIMER)); AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); _r_obj_movereference (&localizedString, _r_format_string (L"%s\tDel", _r_locale_getstring (IDS_DELETE))); AppendMenu (hmenu, MF_STRING, IDM_DELETE, _r_obj_getstringorempty (localizedString)); AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); AppendMenu (hmenu, MF_STRING, IDM_CHECK, _r_locale_getstring (IDS_CHECK)); AppendMenu (hmenu, MF_STRING, IDM_UNCHECK, _r_locale_getstring (IDS_UNCHECK)); AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+A", _r_locale_getstring (IDS_SELECT_ALL))); AppendMenu (hmenu, MF_STRING, IDM_SELECT_ALL, _r_obj_getstringorempty (localizedString)); AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+C", _r_locale_getstring (IDS_COPY))); AppendMenu (hmenu, MF_STRING, IDM_COPY, _r_obj_getstringorempty (localizedString)); columnText = _r_listview_getcolumntext (hwnd, listview_id, lv_column_current); if (columnText) { _r_obj_movereference (&localizedString, _r_format_string (L"%s \"%s\"", _r_locale_getstring (IDS_COPY), _r_obj_getstringorempty (columnText))); AppendMenu (hmenu, MF_STRING, IDM_COPY2, _r_obj_getstringorempty (localizedString)); _r_obj_dereference (columnText); } SetMenuDefaultItem (hmenu, IDM_PROPERTIES, MF_BYCOMMAND); _r_menu_checkitem (hmenu, IDM_DISABLENOTIFICATIONS, 0, MF_BYCOMMAND, _app_getappinfo (hash_item, InfoIsSilent) != FALSE); if (listview_id != IDC_APPS_PROFILE) _r_menu_enableitem (hmenu, IDM_DELETE, MF_BYCOMMAND, FALSE); } else if (listview_id >= IDC_RULES_BLOCKLIST && listview_id <= IDC_RULES_CUSTOM) { if (listview_id == IDC_RULES_CUSTOM) { _r_obj_movereference (&localizedString, _r_format_string (L"%s...", _r_locale_getstring (IDS_ADD))); AppendMenu (hmenu, MF_STRING, IDM_OPENRULESEDITOR, _r_obj_getstringorempty (localizedString)); } _r_obj_movereference (&localizedString, _r_format_string (L"%s...\tEnter", _r_locale_getstring (IDS_EDIT2))); AppendMenu (hmenu, MF_STRING, IDM_PROPERTIES, _r_obj_getstringorempty (localizedString)); if (listview_id == IDC_RULES_CUSTOM) { _r_obj_movereference (&localizedString, _r_format_string (L"%s\tDel", _r_locale_getstring (IDS_DELETE))); AppendMenu (hmenu, MF_STRING, IDM_DELETE, _r_obj_getstringorempty (localizedString)); PITEM_RULE ptr_rule = _app_getrulebyid (hash_item); if (ptr_rule) { if (ptr_rule->is_readonly) _r_menu_enableitem (hmenu, IDM_DELETE, MF_BYCOMMAND, FALSE); _r_obj_dereference (ptr_rule); } } AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); AppendMenu (hmenu, MF_STRING, IDM_CHECK, _r_locale_getstring (IDS_CHECK)); AppendMenu (hmenu, MF_STRING, IDM_UNCHECK, _r_locale_getstring (IDS_UNCHECK)); AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+A", _r_locale_getstring (IDS_SELECT_ALL))); AppendMenu (hmenu, MF_STRING, IDM_SELECT_ALL, _r_obj_getstringorempty (localizedString)); AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+C", _r_locale_getstring (IDS_COPY))); AppendMenu (hmenu, MF_STRING, IDM_COPY, _r_obj_getstringorempty (localizedString)); columnText = _r_listview_getcolumntext (hwnd, listview_id, lv_column_current); if (columnText) { _r_obj_movereference (&localizedString, _r_format_string (L"%s \"%s\"", _r_locale_getstring (IDS_COPY), _r_obj_getstringorempty (columnText))); AppendMenu (hmenu, MF_STRING, IDM_COPY2, _r_obj_getstringorempty (localizedString)); _r_obj_dereference (columnText); } SetMenuDefaultItem (hmenu, IDM_PROPERTIES, MF_BYCOMMAND); } else if (listview_id == IDC_NETWORK) { _r_obj_movereference (&localizedString, _r_format_string (L"%s\tEnter", _r_locale_getstring (IDS_SHOWINLIST))); AppendMenu (hmenu, MF_STRING, IDM_PROPERTIES, _r_obj_getstringorempty (localizedString)); _r_obj_movereference (&localizedString, _r_format_string (L"%s...", _r_locale_getstring (IDS_OPENRULESEDITOR))); AppendMenu (hmenu, MF_STRING, IDM_OPENRULESEDITOR, _r_obj_getstringorempty (localizedString)); AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); AppendMenu (hmenu, MF_STRING, IDM_NETWORK_CLOSE, _r_locale_getstring (IDS_NETWORK_CLOSE)); AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+A", _r_locale_getstring (IDS_SELECT_ALL))); AppendMenu (hmenu, MF_STRING, IDM_SELECT_ALL, _r_obj_getstringorempty (localizedString)); AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+C", _r_locale_getstring (IDS_COPY))); AppendMenu (hmenu, MF_STRING, IDM_COPY, _r_obj_getstringorempty (localizedString)); columnText = _r_listview_getcolumntext (hwnd, listview_id, lv_column_current); if (columnText) { _r_obj_movereference (&localizedString, _r_format_string (L"%s \"%s\"", _r_locale_getstring (IDS_COPY), _r_obj_getstringorempty (columnText))); AppendMenu (hmenu, MF_STRING, IDM_COPY2, _r_obj_getstringorempty (localizedString)); _r_obj_dereference (columnText); } SetMenuDefaultItem (hmenu, IDM_PROPERTIES, MF_BYCOMMAND); PITEM_NETWORK ptr_network = _app_getnetworkitem (hash_item); if (ptr_network) { if (ptr_network->af != AF_INET || ptr_network->state != MIB_TCP_STATE_ESTAB) _r_menu_enableitem (hmenu, IDM_NETWORK_CLOSE, MF_BYCOMMAND, FALSE); _r_obj_dereference (ptr_network); } } else if (listview_id == IDC_LOG) { _r_obj_movereference (&localizedString, _r_format_string (L"%s\tEnter", _r_locale_getstring (IDS_SHOWINLIST))); AppendMenu (hmenu, MF_STRING, IDM_PROPERTIES, _r_obj_getstringorempty (localizedString)); _r_obj_movereference (&localizedString, _r_format_string (L"%s...", _r_locale_getstring (IDS_OPENRULESEDITOR))); AppendMenu (hmenu, MF_STRING, IDM_OPENRULESEDITOR, _r_obj_getstringorempty (localizedString)); _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+X", _r_locale_getstring (IDS_LOGCLEAR))); AppendMenu (hmenu, MF_STRING, IDM_TRAY_LOGCLEAR, _r_obj_getstringorempty (localizedString)); AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+A", _r_locale_getstring (IDS_SELECT_ALL))); AppendMenu (hmenu, MF_STRING, IDM_SELECT_ALL, _r_obj_getstringorempty (localizedString)); AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+C", _r_locale_getstring (IDS_COPY))); AppendMenu (hmenu, MF_STRING, IDM_COPY, _r_obj_getstringorempty (localizedString)); columnText = _r_listview_getcolumntext (hwnd, listview_id, lv_column_current); if (columnText) { _r_obj_movereference (&localizedString, _r_format_string (L"%s \"%s\"", _r_locale_getstring (IDS_COPY), _r_obj_getstringorempty (columnText))); AppendMenu (hmenu, MF_STRING, IDM_COPY2, _r_obj_getstringorempty (localizedString)); _r_obj_dereference (columnText); } SetMenuDefaultItem (hmenu, IDM_PROPERTIES, MF_BYCOMMAND); } INT command_id = _r_menu_popup (hmenu, hwnd, NULL, FALSE); if (hsubmenu1) DestroyMenu (hsubmenu1); if (hsubmenu2) DestroyMenu (hsubmenu2); DestroyMenu (hmenu); if (command_id) PostMessage (hwnd, WM_COMMAND, MAKEWPARAM (command_id, 0), (LPARAM)lv_column_current); SAFE_DELETE_REFERENCE (localizedString); break; } } break; } case WM_SIZE: { _app_resizewindow (hwnd, lparam); break; } case WM_TRAYICON: { switch (LOWORD (lparam)) { case NIN_POPUPOPEN: { PITEM_LOG ptr_log = _app_notifyget_obj (_app_notifyget_id (config.hnotification, FALSE)); if (ptr_log) { _app_notifyshow (config.hnotification, ptr_log, TRUE, FALSE); _r_obj_dereference (ptr_log); } break; } case WM_MBUTTONUP: { PostMessage (hwnd, WM_COMMAND, MAKEWPARAM (IDM_TRAY_LOGSHOW, 0), 0); break; } case WM_LBUTTONUP: { SetForegroundWindow (hwnd); break; } case WM_LBUTTONDBLCLK: { _r_wnd_toggle (hwnd, FALSE); break; } case WM_CONTEXTMENU: { SetForegroundWindow (hwnd); // don't touch #define NOTIFICATIONS_ID 4 #define LOGGING_ID 5 #define ERRLOG_ID 6 HMENU hmenu = LoadMenu (NULL, MAKEINTRESOURCE (IDM_TRAY)); HMENU hsubmenu = GetSubMenu (hmenu, 0); BOOLEAN is_filtersinstalled = (_wfp_isfiltersinstalled () != InstallDisabled); _r_menu_setitembitmap (hsubmenu, IDM_TRAY_START, FALSE, is_filtersinstalled ? config.hbmp_disable : config.hbmp_enable); // localize _r_menu_setitemtext (hsubmenu, IDM_TRAY_SHOW, FALSE, _r_locale_getstring (IDS_TRAY_SHOW)); _r_menu_setitemtext (hsubmenu, IDM_TRAY_START, FALSE, _r_locale_getstring (is_filtersinstalled ? IDS_TRAY_STOP : IDS_TRAY_START)); _r_menu_setitemtext (hsubmenu, NOTIFICATIONS_ID, TRUE, _r_locale_getstring (IDS_TITLE_NOTIFICATIONS)); _r_menu_setitemtext (hsubmenu, LOGGING_ID, TRUE, _r_locale_getstring (IDS_TITLE_LOGGING)); _r_menu_setitemtext (hsubmenu, IDM_TRAY_ENABLENOTIFICATIONS_CHK, FALSE, _r_locale_getstring (IDS_ENABLENOTIFICATIONS_CHK)); _r_menu_setitemtext (hsubmenu, IDM_TRAY_ENABLENOTIFICATIONSSOUND_CHK, FALSE, _r_locale_getstring (IDS_NOTIFICATIONSOUND_CHK)); _r_menu_setitemtext (hsubmenu, IDM_TRAY_NOTIFICATIONFULLSCREENSILENTMODE_CHK, FALSE, _r_locale_getstring (IDS_NOTIFICATIONFULLSCREENSILENTMODE_CHK)); _r_menu_setitemtext (hsubmenu, IDM_TRAY_NOTIFICATIONONTRAY_CHK, FALSE, _r_locale_getstring (IDS_NOTIFICATIONONTRAY_CHK)); _r_menu_setitemtext (hsubmenu, IDM_TRAY_ENABLELOG_CHK, FALSE, _r_locale_getstring (IDS_ENABLELOG_CHK)); _r_menu_setitemtextformat (hsubmenu, IDM_TRAY_ENABLEUILOG_CHK, FALSE, L"%s (session only)", _r_locale_getstring (IDS_ENABLEUILOG_CHK)); _r_menu_setitemtext (hsubmenu, IDM_TRAY_LOGSHOW, FALSE, _r_locale_getstring (IDS_LOGSHOW)); _r_menu_setitemtext (hsubmenu, IDM_TRAY_LOGCLEAR, FALSE, _r_locale_getstring (IDS_LOGCLEAR)); if (_r_fs_exists (_r_app_getlogpath ())) { _r_menu_setitemtext (hsubmenu, ERRLOG_ID, TRUE, _r_locale_getstring (IDS_TRAY_LOGERR)); _r_menu_setitemtext (hsubmenu, IDM_TRAY_LOGSHOW_ERR, FALSE, _r_locale_getstring (IDS_LOGSHOW)); _r_menu_setitemtext (hsubmenu, IDM_TRAY_LOGCLEAR_ERR, FALSE, _r_locale_getstring (IDS_LOGCLEAR)); } else { DeleteMenu (hsubmenu, ERRLOG_ID, MF_BYPOSITION); } _r_menu_setitemtextformat (hsubmenu, IDM_TRAY_SETTINGS, FALSE, L"%s...", _r_locale_getstring (IDS_SETTINGS)); _r_menu_setitemtext (hsubmenu, IDM_TRAY_WEBSITE, FALSE, _r_locale_getstring (IDS_WEBSITE)); _r_menu_setitemtext (hsubmenu, IDM_TRAY_ABOUT, FALSE, _r_locale_getstring (IDS_ABOUT)); _r_menu_setitemtext (hsubmenu, IDM_TRAY_EXIT, FALSE, _r_locale_getstring (IDS_EXIT)); _r_menu_checkitem (hsubmenu, IDM_TRAY_ENABLENOTIFICATIONS_CHK, 0, MF_BYCOMMAND, _r_config_getboolean (L"IsNotificationsEnabled", TRUE)); _r_menu_checkitem (hsubmenu, IDM_TRAY_ENABLENOTIFICATIONSSOUND_CHK, 0, MF_BYCOMMAND, _r_config_getboolean (L"IsNotificationsSound", TRUE)); _r_menu_checkitem (hsubmenu, IDM_TRAY_NOTIFICATIONFULLSCREENSILENTMODE_CHK, 0, MF_BYCOMMAND, _r_config_getboolean (L"IsNotificationsFullscreenSilentMode", TRUE)); _r_menu_checkitem (hsubmenu, IDM_TRAY_NOTIFICATIONONTRAY_CHK, 0, MF_BYCOMMAND, _r_config_getboolean (L"IsNotificationsOnTray", FALSE)); _r_menu_checkitem (hsubmenu, IDM_TRAY_ENABLELOG_CHK, 0, MF_BYCOMMAND, _r_config_getboolean (L"IsLogEnabled", FALSE)); _r_menu_checkitem (hsubmenu, IDM_TRAY_ENABLEUILOG_CHK, 0, MF_BYCOMMAND, _r_config_getboolean (L"IsLogUiEnabled", FALSE)); if (!_r_config_getboolean (L"IsNotificationsEnabled", TRUE)) { _r_menu_enableitem (hsubmenu, IDM_TRAY_ENABLENOTIFICATIONSSOUND_CHK, MF_BYCOMMAND, FALSE); _r_menu_enableitem (hsubmenu, IDM_TRAY_NOTIFICATIONFULLSCREENSILENTMODE_CHK, MF_BYCOMMAND, FALSE); _r_menu_enableitem (hsubmenu, IDM_TRAY_NOTIFICATIONONTRAY_CHK, MF_BYCOMMAND, FALSE); } else if (!_r_config_getboolean (L"IsNotificationsSound", TRUE)) { _r_menu_enableitem (hsubmenu, IDM_TRAY_NOTIFICATIONFULLSCREENSILENTMODE_CHK, MF_BYCOMMAND, FALSE); } if (_wfp_isfiltersapplying ()) _r_menu_enableitem (hsubmenu, IDM_TRAY_START, MF_BYCOMMAND, FALSE); _r_menu_popup (hsubmenu, hwnd, NULL, TRUE); DestroyMenu (hmenu); break; } } break; } case WM_POWERBROADCAST: { if (_wfp_isfiltersapplying ()) break; switch (wparam) { case PBT_APMSUSPEND: { if (config.is_neteventset) { HANDLE hengine = _wfp_getenginehandle (); if (hengine) _wfp_logunsubscribe (hengine); } SetWindowLongPtr (hwnd, DWLP_MSGRESULT, TRUE); return TRUE; } case PBT_APMRESUMECRITICAL: case PBT_APMRESUMESUSPEND: { if (config.is_neteventset) { HANDLE hengine = _wfp_getenginehandle (); if (hengine) _wfp_logsubscribe (hengine); } SetWindowLongPtr (hwnd, DWLP_MSGRESULT, TRUE); return TRUE; } } break; } case WM_DEVICECHANGE: { switch (wparam) { case DBT_DEVICEARRIVAL: case DBT_DEVICEREMOVECOMPLETE: { if (!_r_config_getboolean (L"IsRefreshDevices", TRUE)) break; PDEV_BROADCAST_HDR lbhdr = (PDEV_BROADCAST_HDR)lparam; if (lbhdr && lbhdr->dbch_devicetype == DBT_DEVTYP_VOLUME) { PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lparam; if (wparam == DBT_DEVICEARRIVAL) { if (_wfp_isfiltersinstalled () && !_wfp_isfiltersapplying ()) { BOOLEAN is_appexist = _app_isapphavedrive (FirstDriveFromMask (lpdbv->dbcv_unitmask)); if (is_appexist) _app_changefilters (hwnd, TRUE, FALSE); } else { if (IsWindowVisible (hwnd)) _r_listview_redraw (hwnd, (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT), INVALID_INT); } } else if (wparam == DBT_DEVICEREMOVECOMPLETE) { if (IsWindowVisible (hwnd)) _r_listview_redraw (hwnd, (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT), INVALID_INT); } } break; } } break; } case WM_COMMAND: { INT ctrl_id = LOWORD (wparam); if (HIWORD (wparam) == 0 && ctrl_id >= IDX_LANGUAGE && ctrl_id <= (IDX_LANGUAGE + (INT)_r_locale_getcount ())) { _r_locale_applyfrommenu (GetSubMenu (GetSubMenu (GetMenu (hwnd), 2), LANG_MENU), ctrl_id); return FALSE; } else if ((ctrl_id >= IDX_RULES_SPECIAL && ctrl_id <= (IDX_RULES_SPECIAL + (INT)rules_arr.size ()))) { INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); if (!SendDlgItemMessage (hwnd, listview_id, LVM_GETSELECTEDCOUNT, 0, 0)) return FALSE; INT item = INVALID_INT; BOOL is_remove = INVALID_INT; SIZE_T rule_idx = (ctrl_id - IDX_RULES_SPECIAL); PITEM_RULE ptr_rule = _app_getrulebyid (rule_idx); if (!ptr_rule) return FALSE; while ((item = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETNEXTITEM, (WPARAM)item, LVNI_SELECTED)) != INVALID_INT) { SIZE_T app_hash = _r_listview_getitemlparam (hwnd, listview_id, item); if (ptr_rule->is_forservices && (app_hash == config.ntoskrnl_hash || app_hash == config.svchost_hash)) continue; PITEM_APP ptr_app = _app_getappitem (app_hash); if (!ptr_app) continue; _app_freenotify (app_hash, ptr_app); if (is_remove == INVALID_INT) is_remove = !!(ptr_rule->is_enabled && (ptr_rule->apps->find (app_hash) != ptr_rule->apps->end ())); if (is_remove) { ptr_rule->apps->erase (app_hash); if (ptr_rule->apps->empty ()) _app_ruleenable (ptr_rule, FALSE); } else { ptr_rule->apps->emplace (app_hash, TRUE); _app_ruleenable (ptr_rule, TRUE); } _r_fastlock_acquireshared (&lock_checkbox); _app_setappiteminfo (hwnd, listview_id, item, app_hash, ptr_app); _r_fastlock_releaseshared (&lock_checkbox); _r_obj_dereference (ptr_app); } INT rule_listview_id = _app_getlistview_id (ptr_rule->type); if (rule_listview_id) { INT item_pos = _app_getposition (hwnd, rule_listview_id, rule_idx); if (item_pos != INVALID_INT) { _r_fastlock_acquireshared (&lock_checkbox); _app_setruleiteminfo (hwnd, rule_listview_id, item_pos, ptr_rule, TRUE); _r_fastlock_releaseshared (&lock_checkbox); } } OBJECTS_RULE_VECTOR rules; rules.emplace_back (ptr_rule); if (_wfp_isfiltersinstalled ()) { HANDLE hengine = _wfp_getenginehandle (); if (hengine) _wfp_create4filters (hengine, &rules, __LINE__); } _r_obj_dereference (ptr_rule); _app_listviewsort (hwnd, listview_id, INVALID_INT, FALSE); _app_refreshstatus (hwnd, listview_id); _app_profile_save (); return FALSE; } else if ((ctrl_id >= IDX_TIMER && ctrl_id <= (IDX_TIMER + (INT)timers.size ()))) { INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); if (!listview_id || !SendDlgItemMessage (hwnd, listview_id, LVM_GETSELECTEDCOUNT, 0, 0)) return FALSE; SIZE_T timer_idx = (ctrl_id - IDX_TIMER); time_t seconds = timers.at (timer_idx); INT item = INVALID_INT; OBJECTS_APP_VECTOR rules; while ((item = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETNEXTITEM, (WPARAM)item, LVNI_SELECTED)) != INVALID_INT) { SIZE_T app_hash = _r_listview_getitemlparam (hwnd, listview_id, item); PITEM_APP ptr_app = _app_getappitem (app_hash); if (!ptr_app) continue; _app_timer_set (hwnd, ptr_app, seconds); rules.emplace_back (ptr_app); } if (_wfp_isfiltersinstalled ()) { HANDLE hengine = _wfp_getenginehandle (); if (hengine) _wfp_create3filters (hengine, &rules, __LINE__); } _app_freeapps_vec (&rules); _app_listviewsort (hwnd, listview_id, INVALID_INT, FALSE); _app_refreshstatus (hwnd, listview_id); _app_profile_save (); return FALSE; } switch (ctrl_id) { case IDCANCEL: // process Esc key case IDM_TRAY_SHOW: { _r_wnd_toggle (hwnd, FALSE); break; } case IDM_SETTINGS: case IDM_TRAY_SETTINGS: { _r_settings_createwindow (hwnd, &SettingsProc); break; } case IDM_EXIT: case IDM_TRAY_EXIT: { PostMessage (hwnd, WM_CLOSE, 0, 0); break; } case IDM_WEBSITE: case IDM_TRAY_WEBSITE: { ShellExecute (hwnd, NULL, _APP_WEBSITE_URL, NULL, NULL, SW_SHOWDEFAULT); break; } case IDM_CHECKUPDATES: { _r_update_check (hwnd); break; } case IDM_DONATE: { ShellExecute (hwnd, NULL, _APP_DONATE_NEWURL, NULL, NULL, SW_SHOWDEFAULT); break; } case IDM_ABOUT: case IDM_TRAY_ABOUT: { _r_show_aboutmessage (hwnd); break; } case IDM_IMPORT: { WCHAR path[MAX_PATH]; _r_str_copy (path, RTL_NUMBER_OF (path), XML_PROFILE); WCHAR title[MAX_PATH]; _r_str_printf (title, RTL_NUMBER_OF (title), L"%s %s...", _r_locale_getstring (IDS_IMPORT), path); OPENFILENAME ofn = {0}; ofn.lStructSize = sizeof (ofn); ofn.hwndOwner = hwnd; ofn.lpstrFile = path; ofn.nMaxFile = RTL_NUMBER_OF (path); ofn.lpstrFilter = L"*.xml;*.xml.bak\0*.xml;*.xml.bak\0*.*\0*.*\0\0"; ofn.lpstrDefExt = L"xml"; ofn.lpstrTitle = title; ofn.Flags = OFN_EXPLORER | OFN_ENABLESIZING | OFN_PATHMUSTEXIST | OFN_FORCESHOWHIDDEN; if (GetOpenFileName (&ofn)) { if (!_app_profile_load_check (path, XmlProfileV3, TRUE)) { _r_show_errormessage (hwnd, L"Import failure!", ERROR_INVALID_DATA, path, NULL); } else { // made backup _r_fs_remove (config.profile_path_backup, _R_FLAG_REMOVE_FORCE); _app_profile_save (); _app_profile_load (hwnd, path); // load profile _app_refreshstatus (hwnd, INVALID_INT); _app_changefilters (hwnd, TRUE, FALSE); } } break; } case IDM_EXPORT: { WCHAR path[MAX_PATH]; _r_str_copy (path, RTL_NUMBER_OF (path), XML_PROFILE); WCHAR title[MAX_PATH]; _r_str_printf (title, RTL_NUMBER_OF (title), L"%s %s...", _r_locale_getstring (IDS_EXPORT), path); OPENFILENAME ofn = {0}; ofn.lStructSize = sizeof (ofn); ofn.hwndOwner = hwnd; ofn.lpstrFile = path; ofn.nMaxFile = RTL_NUMBER_OF (path); ofn.lpstrFilter = L"*.xml\0*.xml\0\0"; ofn.lpstrDefExt = L"xml"; ofn.lpstrTitle = title; ofn.Flags = OFN_EXPLORER | OFN_ENABLESIZING | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; if (GetSaveFileName (&ofn)) { _app_profile_save (); // added information for export profile failure (issue #707) if (!_r_fs_copy (config.profile_path, path, 0)) _r_show_errormessage (hwnd, L"Export failure!", GetLastError (), path, NULL); } break; } case IDM_ALWAYSONTOP_CHK: { BOOLEAN new_val = !_r_config_getboolean (L"AlwaysOnTop", _APP_ALWAYSONTOP); _r_menu_checkitem (GetMenu (hwnd), ctrl_id, 0, MF_BYCOMMAND, new_val); _r_config_setboolean (L"AlwaysOnTop", new_val); _r_wnd_top (hwnd, new_val); break; } case IDM_AUTOSIZECOLUMNS_CHK: { BOOLEAN new_val = !_r_config_getboolean (L"AutoSizeColumns", TRUE); _r_menu_checkitem (GetMenu (hwnd), ctrl_id, 0, MF_BYCOMMAND, new_val); _r_config_setboolean (L"AutoSizeColumns", new_val); if (new_val) _app_listviewresize (hwnd, (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT), FALSE); break; } case IDM_SHOWFILENAMESONLY_CHK: { BOOLEAN new_val = !_r_config_getboolean (L"ShowFilenames", TRUE); _r_menu_checkitem (GetMenu (hwnd), ctrl_id, 0, MF_BYCOMMAND, new_val); _r_config_setboolean (L"ShowFilenames", new_val); // regroup apps for (auto it = apps.begin (); it != apps.end (); ++it) { if (!it->second) continue; SIZE_T app_hash = it->first; PITEM_APP ptr_app = (PITEM_APP)_r_obj_reference (it->second); _r_obj_movereference (&ptr_app->display_name, _app_getdisplayname (app_hash, ptr_app, FALSE)); INT listview_id = _app_getlistview_id (ptr_app->type); if (listview_id) { INT item_pos = _app_getposition (hwnd, listview_id, app_hash); if (item_pos != INVALID_INT) { _r_fastlock_acquireshared (&lock_checkbox); _app_setappiteminfo (hwnd, listview_id, item_pos, app_hash, ptr_app); _r_fastlock_releaseshared (&lock_checkbox); } } _r_obj_dereference (ptr_app); } _app_listviewsort (hwnd, (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT), INVALID_INT, FALSE); break; } case IDM_VIEW_ICON: case IDM_VIEW_DETAILS: case IDM_VIEW_TILE: { INT view_type; if (ctrl_id == IDM_VIEW_ICON) view_type = LV_VIEW_ICON; else if (ctrl_id == IDM_VIEW_TILE) view_type = LV_VIEW_TILE; else view_type = LV_VIEW_DETAILS; _r_menu_checkitem (GetMenu (hwnd), IDM_VIEW_ICON, IDM_VIEW_TILE, MF_BYCOMMAND, ctrl_id); _r_config_setinteger (L"ViewType", view_type); INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); if (listview_id) { _app_listviewsetview (hwnd, listview_id); _app_listviewresize (hwnd, listview_id, FALSE); _r_listview_redraw (hwnd, listview_id, INVALID_INT); } break; } case IDM_SIZE_SMALL: case IDM_SIZE_LARGE: case IDM_SIZE_EXTRALARGE: { INT icon_size; if (ctrl_id == IDM_SIZE_LARGE) icon_size = SHIL_LARGE; else if (ctrl_id == IDM_SIZE_EXTRALARGE) icon_size = SHIL_EXTRALARGE; else icon_size = SHIL_SYSSMALL; _r_menu_checkitem (GetMenu (hwnd), IDM_SIZE_SMALL, IDM_SIZE_EXTRALARGE, MF_BYCOMMAND, ctrl_id); _r_config_setinteger (L"IconSize", icon_size); INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); if (listview_id) { _app_listviewsetview (hwnd, listview_id); _app_listviewresize (hwnd, listview_id, FALSE); _r_listview_redraw (hwnd, listview_id, INVALID_INT); } break; } case IDM_ICONSISHIDDEN: { BOOLEAN new_val = !_r_config_getboolean (L"IsIconsHidden", FALSE); _r_menu_checkitem (GetMenu (hwnd), ctrl_id, 0, MF_BYCOMMAND, new_val); _r_config_setboolean (L"IsIconsHidden", new_val); for (auto it = apps.begin (); it != apps.end (); ++it) { if (!it->second) continue; SIZE_T app_hash = it->first; PITEM_APP ptr_app = (PITEM_APP)_r_obj_reference (it->second); INT listview_id = _app_getlistview_id (ptr_app->type); if (listview_id) { INT item_pos = _app_getposition (hwnd, listview_id, app_hash); if (item_pos != INVALID_INT) { _r_fastlock_acquireshared (&lock_checkbox); _app_setappiteminfo (hwnd, listview_id, item_pos, app_hash, ptr_app); _r_fastlock_releaseshared (&lock_checkbox); } } _r_obj_dereference (ptr_app); } break; } case IDM_FONT: { CHOOSEFONT cf = {0}; LOGFONT lf = {0}; cf.lStructSize = sizeof (cf); cf.hwndOwner = hwnd; cf.Flags = CF_INITTOLOGFONTSTRUCT | CF_NOSCRIPTSEL | CF_LIMITSIZE | CF_NOVERTFONTS; cf.nSizeMax = 16; cf.nSizeMin = 8; cf.lpLogFont = &lf; _r_config_getfont (L"Font", hwnd, &lf); if (ChooseFont (&cf)) { _r_config_setfont (L"Font", hwnd, &lf); SAFE_DELETE_OBJECT (config.hfont); INT current_page = (INT)SendDlgItemMessage (hwnd, IDC_TAB, TCM_GETCURSEL, 0, 0); for (INT i = 0; i < (INT)SendDlgItemMessage (hwnd, IDC_TAB, TCM_GETITEMCOUNT, 0, 0); i++) { INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, i); if (listview_id) { _app_listviewsetfont (hwnd, listview_id, FALSE); if (i == current_page) _app_listviewresize (hwnd, listview_id, FALSE); } } RedrawWindow (hwnd, NULL, NULL, RDW_NOFRAME | RDW_NOINTERNALPAINT | RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); } break; } case IDM_FIND: { if (!config.hfind) { static FINDREPLACE fr = {0}; // "static" is required for WM_FINDMSGSTRING fr.lStructSize = sizeof (fr); fr.hwndOwner = hwnd; fr.lpstrFindWhat = config.search_string; fr.wFindWhatLen = RTL_NUMBER_OF (config.search_string) - 1; fr.Flags = FR_HIDEWHOLEWORD | FR_HIDEMATCHCASE | FR_HIDEUPDOWN; config.hfind = FindText (&fr); } else { SetFocus (config.hfind); } break; } case IDM_FINDNEXT: { if (_r_str_isempty (config.search_string)) { PostMessage (hwnd, WM_COMMAND, MAKEWPARAM (IDM_FIND, 0), 0); } else { FINDREPLACE fr = {0}; fr.Flags = FR_FINDNEXT; fr.lpstrFindWhat = config.search_string; SendMessage (hwnd, WM_FINDMSGSTRING, 0, (LPARAM)&fr); } break; } case IDM_REFRESH: { if (_wfp_isfiltersapplying ()) break; _r_config_initialize (); _app_profile_load (hwnd, NULL); _app_refreshstatus (hwnd, INVALID_INT); _app_changefilters (hwnd, TRUE, FALSE); break; } case IDM_RULE_BLOCKOUTBOUND: case IDM_RULE_BLOCKINBOUND: case IDM_RULE_ALLOWLOOPBACK: case IDM_RULE_ALLOW6TO4: case IDM_SECUREFILTERS_CHK: case IDM_USESTEALTHMODE_CHK: case IDM_INSTALLBOOTTIMEFILTERS_CHK: case IDM_USENETWORKRESOLUTION_CHK: case IDM_USECERTIFICATES_CHK: case IDM_USEREFRESHDEVICES_CHK: { _app_config_apply (hwnd, ctrl_id); break; } case IDM_BLOCKLIST_SPY_DISABLE: case IDM_BLOCKLIST_SPY_ALLOW: case IDM_BLOCKLIST_SPY_BLOCK: case IDM_BLOCKLIST_UPDATE_DISABLE: case IDM_BLOCKLIST_UPDATE_ALLOW: case IDM_BLOCKLIST_UPDATE_BLOCK: case IDM_BLOCKLIST_EXTRA_DISABLE: case IDM_BLOCKLIST_EXTRA_ALLOW: case IDM_BLOCKLIST_EXTRA_BLOCK: { HMENU hmenu = GetMenu (hwnd); if (ctrl_id >= IDM_BLOCKLIST_SPY_DISABLE && ctrl_id <= IDM_BLOCKLIST_SPY_BLOCK) { _r_menu_checkitem (hmenu, IDM_BLOCKLIST_SPY_DISABLE, IDM_BLOCKLIST_SPY_BLOCK, MF_BYCOMMAND, ctrl_id); INT new_state = _r_calc_clamp (INT, ctrl_id - IDM_BLOCKLIST_SPY_DISABLE, 0, 2); _r_config_setinteger (L"BlocklistSpyState", new_state); _app_ruleblocklistset (hwnd, new_state, INVALID_INT, INVALID_INT, TRUE); } else if (ctrl_id >= IDM_BLOCKLIST_UPDATE_DISABLE && ctrl_id <= IDM_BLOCKLIST_UPDATE_BLOCK) { _r_menu_checkitem (hmenu, IDM_BLOCKLIST_UPDATE_DISABLE, IDM_BLOCKLIST_UPDATE_BLOCK, MF_BYCOMMAND, ctrl_id); INT new_state = _r_calc_clamp (INT, ctrl_id - IDM_BLOCKLIST_UPDATE_DISABLE, 0, 2); _r_config_setinteger (L"BlocklistUpdateState", new_state); _app_ruleblocklistset (hwnd, INVALID_INT, new_state, INVALID_INT, TRUE); } else if (ctrl_id >= IDM_BLOCKLIST_EXTRA_DISABLE && ctrl_id <= IDM_BLOCKLIST_EXTRA_BLOCK) { _r_menu_checkitem (hmenu, IDM_BLOCKLIST_EXTRA_DISABLE, IDM_BLOCKLIST_EXTRA_BLOCK, MF_BYCOMMAND, ctrl_id); INT new_state = _r_calc_clamp (INT, ctrl_id - IDM_BLOCKLIST_EXTRA_DISABLE, 0, 2); _r_config_setinteger (L"BlocklistExtraState", new_state); _app_ruleblocklistset (hwnd, INVALID_INT, INVALID_INT, new_state, TRUE); } break; } case IDM_TRAY_ENABLELOG_CHK: { BOOLEAN new_val = !_r_config_getboolean (L"IsLogEnabled", FALSE); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, ctrl_id, NULL, 0, new_val ? TBSTATE_PRESSED | TBSTATE_ENABLED : TBSTATE_ENABLED, I_IMAGENONE); _r_config_setboolean (L"IsLogEnabled", new_val); _app_loginit (new_val); break; } case IDM_TRAY_ENABLEUILOG_CHK: { BOOLEAN new_val = !_r_config_getboolean (L"IsLogUiEnabled", FALSE); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, ctrl_id, NULL, 0, new_val ? TBSTATE_PRESSED | TBSTATE_ENABLED : TBSTATE_ENABLED, I_IMAGENONE); _r_config_setboolean (L"IsLogUiEnabled", new_val); break; } case IDM_TRAY_ENABLENOTIFICATIONS_CHK: { BOOLEAN new_val = !_r_config_getboolean (L"IsNotificationsEnabled", TRUE); _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, ctrl_id, NULL, 0, new_val ? TBSTATE_PRESSED | TBSTATE_ENABLED : TBSTATE_ENABLED, I_IMAGENONE); _r_config_setboolean (L"IsNotificationsEnabled", new_val); _app_notifyrefresh (config.hnotification, TRUE); break; } case IDM_TRAY_ENABLENOTIFICATIONSSOUND_CHK: { BOOLEAN new_val = !_r_config_getboolean (L"IsNotificationsSound", TRUE); _r_config_setboolean (L"IsNotificationsSound", new_val); break; } case IDM_TRAY_NOTIFICATIONFULLSCREENSILENTMODE_CHK: { BOOLEAN new_val = !_r_config_getboolean (L"IsNotificationsFullscreenSilentMode", TRUE); _r_config_setboolean (L"IsNotificationsFullscreenSilentMode", new_val); break; } case IDM_TRAY_NOTIFICATIONONTRAY_CHK: { BOOLEAN new_val = !_r_config_getboolean (L"IsNotificationsOnTray", FALSE); _r_config_setboolean (L"IsNotificationsOnTray", new_val); if (IsWindowVisible (config.hnotification)) _app_notifysetpos (config.hnotification, TRUE); break; } case IDM_TRAY_LOGSHOW: { if (_r_config_getboolean (L"IsLogUiEnabled", FALSE)) { _r_wnd_toggle (hwnd, TRUE); if (!log_arr.empty ()) { _app_showitem (hwnd, IDC_LOG, _app_getposition (hwnd, IDC_LOG, (log_arr.size () - 1)), INVALID_INT); } else { _app_settab_id (hwnd, IDC_LOG); } } else { PR_STRING logPath; PR_STRING viewerPath; PR_STRING processPath; logPath = _r_path_expand (_r_config_getstring (L"LogPath", LOG_PATH_DEFAULT)); if (!logPath) return FALSE; if (!_r_fs_exists (logPath->Buffer)) { _r_obj_dereference (logPath); return FALSE; } if (_r_fs_isvalidhandle (config.hlogfile)) FlushFileBuffers (config.hlogfile); viewerPath = _app_getlogviewer (); if (viewerPath) { processPath = _r_format_string (L"%s \"%s\"", _r_obj_getstring (viewerPath), logPath->Buffer); if (!_r_sys_createprocess (NULL, processPath->Buffer, NULL)) _r_show_errormessage (hwnd, NULL, GetLastError (), viewerPath->Buffer, NULL); _r_obj_dereference (processPath); _r_obj_dereference (viewerPath); } _r_obj_dereference (logPath); } break; } case IDM_TRAY_LOGCLEAR: { PR_STRING path = _r_path_expand (_r_config_getstring (L"LogPath", LOG_PATH_DEFAULT)); if (_r_fs_isvalidhandle (config.hlogfile) || (path && _r_fs_exists (path->Buffer)) || !log_arr.empty ()) { if (_r_show_confirmmessage (hwnd, NULL, _r_locale_getstring (IDS_QUESTION), L"ConfirmLogClear")) { _app_freelogstack (); _app_logclear (); _app_logclear_ui (hwnd); } } SAFE_DELETE_REFERENCE (path); break; } case IDM_TRAY_LOGSHOW_ERR: { PR_STRING viewerPath; PR_STRING processPath; LPCWSTR logPath; logPath = _r_app_getlogpath (); if (_r_fs_exists (logPath)) { viewerPath = _app_getlogviewer (); if (viewerPath) { processPath = _r_format_string (L"%s \"%s\"", viewerPath->Buffer, logPath); if (!_r_sys_createprocess (NULL, processPath->Buffer, NULL)) _r_show_errormessage (hwnd, NULL, GetLastError (), viewerPath->Buffer, NULL); _r_obj_dereference (processPath); _r_obj_dereference (viewerPath); } } break; } case IDM_TRAY_LOGCLEAR_ERR: { if (!_r_show_confirmmessage (hwnd, NULL, _r_locale_getstring (IDS_QUESTION), L"ConfirmLogClear")) break; LPCWSTR path = _r_app_getlogpath (); if (!_r_fs_exists (path)) break; _r_fs_remove (path, _R_FLAG_REMOVE_FORCE); break; } case IDM_TRAY_START: { if (_wfp_isfiltersapplying ()) break; BOOLEAN is_filtersinstalled = !(_wfp_isfiltersinstalled () != InstallDisabled); if (_app_installmessage (hwnd, is_filtersinstalled)) _app_changefilters (hwnd, is_filtersinstalled, TRUE); break; } case IDM_ADD_FILE: { WCHAR files[8192] = {0}; OPENFILENAME ofn = {0}; ofn.lStructSize = sizeof (ofn); ofn.hwndOwner = hwnd; ofn.lpstrFile = files; ofn.nMaxFile = RTL_NUMBER_OF (files); ofn.lpstrFilter = L"*.exe\0*.exe\0*.*\0*.*\0\0"; ofn.Flags = OFN_EXPLORER | OFN_ALLOWMULTISELECT | OFN_ENABLESIZING | OFN_PATHMUSTEXIST | OFN_FORCESHOWHIDDEN; if (GetOpenFileName (&ofn)) { SIZE_T app_hash = 0; if (files[ofn.nFileOffset - 1] != 0) { app_hash = _app_addapplication (hwnd, files, 0, 0, 0, FALSE, FALSE); } else { LPWSTR p = files; WCHAR dir[MAX_PATH] = {0}; WCHAR full_path[512]; GetCurrentDirectory (RTL_NUMBER_OF (dir), dir); while (*p) { p += _r_str_length (p) + 1; if (*p) { _r_str_printf (full_path, RTL_NUMBER_OF (full_path), L"%s\\%s", dir, p); app_hash = _app_addapplication (hwnd, full_path, 0, 0, 0, FALSE, FALSE); } } } { INT app_listview_id = (INT)_app_getappinfo (app_hash, InfoListviewId); if (app_listview_id) { if (app_listview_id == (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT)) _app_listviewsort (hwnd, app_listview_id, INVALID_INT, FALSE); _app_showitem (hwnd, app_listview_id, _app_getposition (hwnd, app_listview_id, app_hash), INVALID_INT); } } _app_refreshstatus (hwnd, INVALID_INT); _app_profile_save (); } break; } case IDM_DISABLENOTIFICATIONS: case IDM_DISABLETIMER: { INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); // note: these commands only for profile... if (!(listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_APPS_UWP)) break; INT item = INVALID_INT; BOOL new_val = INVALID_INT; while ((item = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETNEXTITEM, (WPARAM)item, LVNI_SELECTED)) != INVALID_INT) { SIZE_T app_hash = _r_listview_getitemlparam (hwnd, listview_id, item); PITEM_APP ptr_app = _app_getappitem (app_hash); if (!ptr_app) continue; if (ctrl_id == IDM_DISABLENOTIFICATIONS) { if (new_val == INVALID_INT) new_val = !ptr_app->is_silent; ptr_app->is_silent = !!new_val; if (new_val) _app_freenotify (app_hash, ptr_app); } else if (ctrl_id == IDM_DISABLETIMER) { _app_timer_reset (hwnd, ptr_app); } _r_obj_dereference (ptr_app); } _app_listviewsort (hwnd, listview_id, INVALID_INT, FALSE); _app_refreshstatus (hwnd, listview_id); _app_profile_save (); break; } case IDM_COPY: case IDM_COPY2: { INT listview_id; INT item; INT column_count; INT column_current; PR_STRING buffer; PR_STRING string; listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); item = INVALID_INT; column_count = _r_listview_getcolumncount (hwnd, listview_id); column_current = (INT)lparam; buffer = _r_obj_createstringbuilder (); while ((item = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETNEXTITEM, (WPARAM)item, LVNI_SELECTED)) != INVALID_INT) { if (ctrl_id == IDM_COPY) { for (INT column_id = 0; column_id < column_count; column_id++) { string = _r_listview_getitemtext (hwnd, listview_id, item, column_id); if (string) { if (!_r_str_isempty (string)) _r_string_appendformat (&buffer, L"%s%s", string->Buffer, DIVIDER_COPY); _r_obj_dereference (string); } } _r_str_trim (buffer, DIVIDER_COPY); } else { string = _r_listview_getitemtext (hwnd, listview_id, item, column_current); if (string) { if (!_r_str_isempty (string)) _r_string_append (&buffer, string->Buffer); _r_obj_dereference (string); } } _r_string_append (&buffer, L"\r\n"); } _r_str_trim (buffer, DIVIDER_TRIM); if (!_r_str_isempty (buffer)) _r_clipboard_set (hwnd, buffer->Buffer, _r_obj_getstringlength (buffer)); _r_obj_dereference (buffer); break; } case IDM_CHECK: case IDM_UNCHECK: { INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); BOOLEAN new_val = (ctrl_id == IDM_CHECK); BOOLEAN is_changed = FALSE; if (listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_APPS_UWP) { OBJECTS_APP_VECTOR rules; INT item = INVALID_INT; while ((item = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETNEXTITEM, (WPARAM)item, LVNI_SELECTED)) != INVALID_INT) { SIZE_T app_hash = _r_listview_getitemlparam (hwnd, listview_id, item); PITEM_APP ptr_app = _app_getappitem (app_hash); if (!ptr_app) continue; if (ptr_app->is_enabled != new_val) { if (!new_val) _app_timer_reset (hwnd, ptr_app); else _app_freenotify (app_hash, ptr_app); ptr_app->is_enabled = new_val; _r_fastlock_acquireshared (&lock_checkbox); _app_setappiteminfo (hwnd, listview_id, item, app_hash, ptr_app); _r_fastlock_releaseshared (&lock_checkbox); rules.emplace_back (ptr_app); is_changed = TRUE; // do not reset reference counter } else { _r_obj_dereference (ptr_app); } } if (is_changed) { if (_wfp_isfiltersinstalled ()) { HANDLE hengine = _wfp_getenginehandle (); if (hengine) _wfp_create3filters (hengine, &rules, __LINE__); } _app_freeapps_vec (&rules); } } else if (listview_id >= IDC_RULES_BLOCKLIST && listview_id <= IDC_RULES_CUSTOM) { OBJECTS_RULE_VECTOR rules; INT item = INVALID_INT; while ((item = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETNEXTITEM, (WPARAM)item, LVNI_SELECTED)) != INVALID_INT) { SIZE_T rule_idx = _r_listview_getitemlparam (hwnd, listview_id, item); PITEM_RULE ptr_rule = _app_getrulebyid (rule_idx); if (!ptr_rule) continue; if (ptr_rule->is_enabled != new_val) { _app_ruleenable (ptr_rule, new_val); _r_fastlock_acquireshared (&lock_checkbox); _app_setruleiteminfo (hwnd, listview_id, item, ptr_rule, TRUE); _r_fastlock_releaseshared (&lock_checkbox); rules.emplace_back (ptr_rule); is_changed = TRUE; // do not reset reference counter } else { _r_obj_dereference (ptr_rule); } } if (is_changed) { if (_wfp_isfiltersinstalled ()) { HANDLE hengine = _wfp_getenginehandle (); if (hengine) _wfp_create4filters (hengine, &rules, __LINE__); } _app_freerules_vec (&rules); } } if (is_changed) { _app_listviewsort (hwnd, listview_id, INVALID_INT, FALSE); _app_refreshstatus (hwnd, listview_id); _app_profile_save (); } break; } case IDM_EDITRULES: { _app_settab_id (hwnd, _app_getlistview_id (DataRuleCustom)); break; } case IDM_OPENRULESEDITOR: { PITEM_RULE ptr_rule = (PITEM_RULE)_r_obj_allocateex (sizeof (ITEM_RULE), &_app_dereferencerule); // initialize stl ptr_rule->apps = new HASHER_MAP; ptr_rule->guids = new GUIDS_VEC; _app_ruleenable (ptr_rule, TRUE); ptr_rule->type = DataRuleCustom; ptr_rule->is_block = FALSE; INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); if (listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_APPS_UWP) { INT item = INVALID_INT; while ((item = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETNEXTITEM, (WPARAM)item, LVNI_SELECTED)) != INVALID_INT) { SIZE_T app_hash = _r_listview_getitemlparam (hwnd, listview_id, item); if (_app_isappfound (app_hash)) ptr_rule->apps->emplace (app_hash, TRUE); } } else if (listview_id == IDC_NETWORK) { ptr_rule->is_block = TRUE; INT item = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETNEXTITEM, (WPARAM)INVALID_INT, LVNI_SELECTED); if (item != INVALID_INT) { SIZE_T network_hash = _r_listview_getitemlparam (hwnd, listview_id, item); PITEM_NETWORK ptr_network = _app_getnetworkitem (network_hash); if (ptr_network) { _r_obj_movereference (&ptr_rule->name, _r_listview_getitemtext (hwnd, listview_id, item, 0)); if (ptr_network->app_hash && !_r_str_isempty (ptr_network->path)) { if (!_app_isappfound (ptr_network->app_hash)) { _app_addapplication (hwnd, ptr_network->path->Buffer, 0, 0, 0, FALSE, FALSE); _app_refreshstatus (hwnd, listview_id); _app_profile_save (); } ptr_rule->apps->emplace (ptr_network->app_hash, TRUE); } ptr_rule->protocol = ptr_network->protocol; _r_obj_movereference (&ptr_rule->rule_remote, _app_formataddress (ptr_network->af, 0, &ptr_network->remote_addr, ptr_network->remote_port, FMTADDR_AS_RULE)); _r_obj_movereference (&ptr_rule->rule_local, _app_formataddress (ptr_network->af, 0, &ptr_network->local_addr, ptr_network->local_port, FMTADDR_AS_RULE)); _r_obj_dereference (ptr_network); } } } else if (listview_id == IDC_LOG) { //ptr_rule->is_block = FALSE; INT item = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETNEXTITEM, (WPARAM)INVALID_INT, LVNI_SELECTED); if (item != INVALID_INT) { SIZE_T log_idx = _r_listview_getitemlparam (hwnd, listview_id, item); PITEM_LOG ptr_log = _app_getlogitem (log_idx); if (ptr_log) { if (_r_str_isempty (ptr_rule->name)) { PR_STRING itemText = _r_listview_getitemtext (hwnd, listview_id, item, 0); if (itemText) _r_obj_movereference (&ptr_rule->name, itemText); } if (ptr_log->app_hash && !_r_str_isempty (ptr_log->path)) { if (!_app_isappfound (ptr_log->app_hash)) { _app_addapplication (hwnd, ptr_log->path->Buffer, 0, 0, 0, FALSE, FALSE); _app_refreshstatus (hwnd, listview_id); _app_profile_save (); } ptr_rule->apps->emplace (ptr_log->app_hash, TRUE); } ptr_rule->protocol = ptr_log->protocol; ptr_rule->direction = ptr_log->direction; _r_obj_movereference (&ptr_rule->rule_remote, _app_formataddress (ptr_log->af, 0, &ptr_log->remote_addr, ptr_log->remote_port, FMTADDR_AS_RULE)); _r_obj_movereference (&ptr_rule->rule_local, _app_formataddress (ptr_log->af, 0, &ptr_log->local_addr, ptr_log->local_port, FMTADDR_AS_RULE)); _r_obj_dereference (ptr_log); } } } if (DialogBoxParam (NULL, MAKEINTRESOURCE (IDD_EDITOR), hwnd, &EditorProc, (LPARAM)ptr_rule)) { SIZE_T rule_idx = rules_arr.size (); rules_arr.emplace_back ((PITEM_RULE)_r_obj_reference (ptr_rule)); INT listview_rules_id = _app_getlistview_id (DataRuleCustom); if (listview_rules_id) { INT item_id = _r_listview_getitemcount (hwnd, listview_rules_id, FALSE); _r_fastlock_acquireshared (&lock_checkbox); _r_listview_additemex (hwnd, listview_rules_id, item_id, 0, _r_obj_getstringordefault (ptr_rule->name, SZ_EMPTY), _app_getruleicon (ptr_rule), _app_getrulegroup (ptr_rule), rule_idx); _app_setruleiteminfo (hwnd, listview_rules_id, item_id, ptr_rule, TRUE); _r_fastlock_releaseshared (&lock_checkbox); } _app_listviewsort (hwnd, listview_id, INVALID_INT, FALSE); _app_refreshstatus (hwnd, listview_id); _app_profile_save (); } _r_obj_dereference (ptr_rule); break; } case IDM_PROPERTIES: { INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); INT item = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETNEXTITEM, (WPARAM)INVALID_INT, LVNI_SELECTED); if (item == INVALID_INT) break; if (listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_APPS_UWP) { do { SIZE_T app_hash = _r_listview_getitemlparam (hwnd, listview_id, item); PR_STRING path = (PR_STRING)_app_getappinfo (app_hash, InfoPath); if (path) { if (!_r_str_isempty (path)) _r_path_explore (path->Buffer); _r_obj_dereference (path); } } while ((item = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETNEXTITEM, (WPARAM)item, LVNI_SELECTED)) != INVALID_INT); } else if (listview_id >= IDC_RULES_BLOCKLIST && listview_id <= IDC_RULES_CUSTOM) { SIZE_T rule_idx = _r_listview_getitemlparam (hwnd, listview_id, item); PITEM_RULE ptr_rule = _app_getrulebyid (rule_idx); if (!ptr_rule) break; if (DialogBoxParam (NULL, MAKEINTRESOURCE (IDD_EDITOR), hwnd, &EditorProc, (LPARAM)ptr_rule)) { _app_setruleiteminfo (hwnd, listview_id, item, ptr_rule, TRUE); _app_listviewsort (hwnd, listview_id, INVALID_INT, FALSE); _app_refreshstatus (hwnd, listview_id); _app_profile_save (); } _r_obj_dereference (ptr_rule); } else if (listview_id == IDC_NETWORK) { SIZE_T network_hash = _r_listview_getitemlparam (hwnd, listview_id, item); PITEM_NETWORK ptr_network = _app_getnetworkitem (network_hash); if (!ptr_network) break; if (ptr_network->app_hash && !_r_str_isempty (ptr_network->path)) { if (!_app_isappfound (ptr_network->app_hash)) { _app_addapplication (hwnd, ptr_network->path->Buffer, 0, 0, 0, FALSE, FALSE); _app_refreshstatus (hwnd, listview_id); _app_profile_save (); } INT app_listview_id = (INT)_app_getappinfo (ptr_network->app_hash, InfoListviewId); if (app_listview_id) { _app_listviewsort (hwnd, app_listview_id, INVALID_INT, FALSE); _app_showitem (hwnd, app_listview_id, _app_getposition (hwnd, app_listview_id, ptr_network->app_hash), INVALID_INT); } } _r_obj_dereference (ptr_network); } else if (listview_id == IDC_LOG) { SIZE_T log_idx = _r_listview_getitemlparam (hwnd, listview_id, item); PITEM_LOG ptr_log = _app_getlogitem (log_idx); if (!ptr_log) break; if (ptr_log->app_hash && !_r_str_isempty (ptr_log->path)) { if (!_app_isappfound (ptr_log->app_hash)) { _app_addapplication (hwnd, ptr_log->path->Buffer, 0, 0, 0, FALSE, FALSE); _app_refreshstatus (hwnd, listview_id); _app_profile_save (); } INT app_listview_id = (INT)_app_getappinfo (ptr_log->app_hash, InfoListviewId); if (app_listview_id) { _app_listviewsort (hwnd, app_listview_id, INVALID_INT, FALSE); _app_showitem (hwnd, app_listview_id, _app_getposition (hwnd, app_listview_id, ptr_log->app_hash), INVALID_INT); } } _r_obj_dereference (ptr_log); } break; } case IDM_NETWORK_CLOSE: { INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); if (listview_id != IDC_NETWORK) break; INT selected = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETSELECTEDCOUNT, 0, 0); if (!selected) break; INT item = INVALID_INT; MIB_TCPROW tcprow; while ((item = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETNEXTITEM, (WPARAM)item, LVNI_SELECTED)) != INVALID_INT) { SIZE_T network_hash = _r_listview_getitemlparam (hwnd, listview_id, item); PITEM_NETWORK ptr_network = _app_getnetworkitem (network_hash); if (!ptr_network) continue; if (ptr_network->af == AF_INET && ptr_network->state == MIB_TCP_STATE_ESTAB) { RtlSecureZeroMemory (&tcprow, sizeof (tcprow)); tcprow.dwState = MIB_TCP_STATE_DELETE_TCB; tcprow.dwLocalAddr = ptr_network->local_addr.S_un.S_addr; tcprow.dwLocalPort = _r_byteswap_ushort ((USHORT)ptr_network->local_port); tcprow.dwRemoteAddr = ptr_network->remote_addr.S_un.S_addr; tcprow.dwRemotePort = _r_byteswap_ushort ((USHORT)ptr_network->remote_port); if (SetTcpEntry (&tcprow) == NO_ERROR) { SendDlgItemMessage (hwnd, listview_id, LVM_DELETEITEM, (WPARAM)item, 0); network_map.erase (network_hash); _r_obj_dereferenceex (ptr_network, 2); continue; } } _r_obj_dereference (ptr_network); } break; } case IDM_DELETE: { INT listview_id; INT selected; INT count; WCHAR messageText[512]; listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); if (listview_id != IDC_APPS_PROFILE && listview_id != IDC_RULES_CUSTOM) break; if (!(selected = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETSELECTEDCOUNT, 0, 0))) break; _r_str_printf (messageText, RTL_NUMBER_OF (messageText), _r_locale_getstring (IDS_QUESTION_DELETE), selected); if (_r_show_message (hwnd, MB_YESNO | MB_ICONEXCLAMATION, NULL, NULL, messageText) != IDYES) break; count = _r_listview_getitemcount (hwnd, listview_id, FALSE) - 1; GUIDS_VEC guids; for (INT i = count; i != INVALID_INT; i--) { if ((UINT)SendDlgItemMessage (hwnd, listview_id, LVM_GETITEMSTATE, (WPARAM)i, LVNI_SELECTED) == LVNI_SELECTED) { if (listview_id == IDC_APPS_PROFILE) { SIZE_T app_hash = _r_listview_getitemlparam (hwnd, listview_id, i); PITEM_APP ptr_app = _app_getappitem (app_hash); if (!ptr_app) continue; if (!ptr_app->is_undeletable) // skip "undeletable" apps { guids.insert (guids.end (), ptr_app->guids->begin (), ptr_app->guids->end ()); SendDlgItemMessage (hwnd, listview_id, LVM_DELETEITEM, (WPARAM)i, 0); _app_timer_reset (hwnd, ptr_app); _app_freenotify (app_hash, ptr_app); _app_freeapplication (app_hash); _r_obj_dereferenceex (ptr_app, 2); } else { _r_obj_dereference (ptr_app); } } else if (listview_id == IDC_RULES_CUSTOM) { SIZE_T rule_idx = _r_listview_getitemlparam (hwnd, listview_id, i); PITEM_RULE ptr_rule = _app_getrulebyid (rule_idx); if (!ptr_rule) continue; HASHER_MAP apps_checker; if (!ptr_rule->is_readonly) // skip "read-only" rules { guids.insert (guids.end (), ptr_rule->guids->begin (), ptr_rule->guids->end ()); for (auto it = ptr_rule->apps->begin (); it != ptr_rule->apps->end (); ++it) apps_checker.emplace (it->first, TRUE); SendDlgItemMessage (hwnd, listview_id, LVM_DELETEITEM, (WPARAM)i, 0); rules_arr.at (rule_idx) = NULL; _r_obj_dereferenceex (ptr_rule, 2); } else { _r_obj_dereference (ptr_rule); } for (auto it = apps_checker.begin (); it != apps_checker.end (); ++it) { SIZE_T app_hash = it->first; PITEM_APP ptr_app = _app_getappitem (app_hash); if (!ptr_app) continue; INT app_listview_id = _app_getlistview_id (ptr_app->type); if (app_listview_id) { INT item_pos = _app_getposition (hwnd, app_listview_id, app_hash); if (item_pos != INVALID_INT) { _r_fastlock_acquireshared (&lock_checkbox); _app_setappiteminfo (hwnd, app_listview_id, item_pos, app_hash, ptr_app); _r_fastlock_releaseshared (&lock_checkbox); } } _r_obj_dereference (ptr_app); } } } } if (_wfp_isfiltersinstalled ()) { HANDLE hengine = _wfp_getenginehandle (); if (hengine) _wfp_destroyfilters_array (hengine, &guids, __LINE__); } _app_refreshstatus (hwnd, INVALID_INT); _app_profile_save (); break; } case IDM_PURGE_UNUSED: { BOOLEAN is_deleted = FALSE; GUIDS_VEC guids; HASH_VEC apps_list; for (auto it = apps.begin (); it != apps.end (); ++it) { if (!it->second) continue; SIZE_T app_hash = it->first; PITEM_APP ptr_app = (PITEM_APP)_r_obj_reference (it->second); if (!ptr_app->is_undeletable && (!_app_isappexists (ptr_app) || ((ptr_app->type != DataAppService && ptr_app->type != DataAppUWP) && !_app_isappused (ptr_app, app_hash)))) { INT app_listview_id = _app_getlistview_id (ptr_app->type); if (app_listview_id) { INT item_pos = _app_getposition (hwnd, app_listview_id, app_hash); if (item_pos != INVALID_INT) SendDlgItemMessage (hwnd, app_listview_id, LVM_DELETEITEM, (WPARAM)item_pos, 0); } _app_timer_reset (hwnd, ptr_app); _app_freenotify (app_hash, ptr_app); guids.insert (guids.end (), ptr_app->guids->begin (), ptr_app->guids->end ()); apps_list.emplace_back (app_hash); is_deleted = TRUE; } _r_obj_dereference (ptr_app); } for (auto it = apps_list.begin (); it != apps_list.end (); ++it) _app_freeapplication (*it); if (is_deleted) { if (_wfp_isfiltersinstalled ()) { HANDLE hengine = _wfp_getenginehandle (); if (hengine) _wfp_destroyfilters_array (hengine, &guids, __LINE__); } _app_refreshstatus (hwnd, INVALID_INT); _app_profile_save (); } break; } case IDM_PURGE_TIMERS: { if (!_app_istimersactive () || _r_show_message (hwnd, MB_YESNO | MB_ICONEXCLAMATION, NULL, NULL, _r_locale_getstring (IDS_QUESTION_TIMERS)) != IDYES) break; OBJECTS_APP_VECTOR rules; for (auto it = apps.begin (); it != apps.end (); ++it) { if (!it->second) continue; PITEM_APP ptr_app = (PITEM_APP)_r_obj_reference (it->second); if (_app_istimeractive (ptr_app)) { _app_timer_reset (hwnd, ptr_app); rules.emplace_back (ptr_app); } else { _r_obj_dereference (ptr_app); } } if (_wfp_isfiltersinstalled ()) { HANDLE hengine = _wfp_getenginehandle (); if (hengine) _wfp_create3filters (hengine, &rules, __LINE__); } _app_freeapps_vec (&rules); _app_profile_save (); INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); if (listview_id) { _app_listviewsort (hwnd, listview_id, INVALID_INT, FALSE); _app_refreshstatus (hwnd, listview_id); } break; } case IDM_SELECT_ALL: { ListView_SetItemState (GetDlgItem (hwnd, (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT)), INVALID_INT, LVIS_SELECTED, LVIS_SELECTED); break; } case IDM_ZOOM: { ShowWindow (hwnd, IsZoomed (hwnd) ? SW_RESTORE : SW_MAXIMIZE); break; } #if defined(_DEBUG) || defined(_APP_BETA) #define FN_AD L"" #define RM_AD L"195.210.46.95" #define RM_AD2 L"195.210.46.%d" #define LM_AD2 L"192.168.1.%d" #define RP_AD 443 #define LP_AD 65535 // Here is debugging content case 998: { PITEM_LOG ptr_log = (PITEM_LOG)_r_obj_allocateex (sizeof (ITEM_LOG), &_app_dereferencelog); ptr_log->app_hash = config.my_hash; ptr_log->timestamp = _r_unixtime_now (); ptr_log->af = AF_INET; ptr_log->protocol = IPPROTO_TCP; ptr_log->filter_id = 777; ptr_log->direction = FWP_DIRECTION_OUTBOUND; InetPton (ptr_log->af, RM_AD, &ptr_log->remote_addr); ptr_log->remote_port = RP_AD; ptr_log->path = _r_obj_createstring (_r_app_getbinarypath ()); ptr_log->filter_name = _r_obj_createstring (FN_AD); //_app_formataddress (ptr_log->af, ptr_log->protocol, &ptr_log->remote_addr, 0, &ptr_log->remote_fmt, FMTADDR_USE_PROTOCOL | FMTADDR_RESOLVE_HOST); //_app_formataddress (ptr_log->af, ptr_log->protocol, &ptr_log->local_addr, 0, &ptr_log->local_fmt, FMTADDR_USE_PROTOCOL | FMTADDR_RESOLVE_HOST); PITEM_APP ptr_app = _app_getappitem (config.my_hash); if (ptr_app) { ptr_app->last_notify = 0; _app_notifyadd (config.hnotification, ptr_log, ptr_app); _r_obj_dereference (ptr_app); } break; } case 999: { UINT32 flags = FWPM_NET_EVENT_FLAG_APP_ID_SET | FWPM_NET_EVENT_FLAG_IP_PROTOCOL_SET | FWPM_NET_EVENT_FLAG_REMOTE_ADDR_SET | FWPM_NET_EVENT_FLAG_REMOTE_PORT_SET | FWPM_NET_EVENT_FLAG_LOCAL_ADDR_SET | FWPM_NET_EVENT_FLAG_LOCAL_PORT_SET | FWPM_NET_EVENT_FLAG_USER_ID_SET | FWPM_NET_EVENT_FLAG_IP_VERSION_SET; FILETIME ft = {0}; GetSystemTimeAsFileTime (&ft); IN_ADDR ipv4_remote = {0}; IN_ADDR ipv4_local = {0}; PR_STRING ntPath = NULL; _r_path_ntpathfromdos (_r_app_getbinarypath (), &ntPath); UINT16 layer_id = 0; UINT64 filter_id = 0; HANDLE hengine = _wfp_getenginehandle (); if (hengine) { FWPM_LAYER *layer = NULL; FWPM_FILTER *filter = NULL; if (FwpmLayerGetByKey (hengine, &FWPM_LAYER_ALE_AUTH_CONNECT_V4, &layer) == ERROR_SUCCESS && layer) layer_id = layer->layerId; if (!filter_ids.empty ()) { if (FwpmFilterGetByKey (hengine, &filter_ids.at (filter_ids.size () - 1), &filter) == ERROR_SUCCESS && filter) filter_id = filter->filterId; } if (layer) FwpmFreeMemory ((PVOID*)&layer); if (filter) FwpmFreeMemory ((PVOID*)&filter); } LPCWSTR terminator = NULL; for (UINT i = 0; i < 255; i++) { WCHAR addressLocalString[256]; WCHAR addressRemoteString[256]; _r_str_printf (addressLocalString, RTL_NUMBER_OF (addressLocalString), LM_AD2, i + 1); _r_str_printf (addressRemoteString, RTL_NUMBER_OF (addressRemoteString), RM_AD2, i + 1); RtlIpv4StringToAddress (addressLocalString, TRUE, &terminator, &ipv4_local); RtlIpv4StringToAddress (addressRemoteString, TRUE, &terminator, &ipv4_remote); UINT32 remote_addr = _r_byteswap_ulong (ipv4_remote.S_un.S_addr); UINT32 local_addr = _r_byteswap_ulong (ipv4_local.S_un.S_addr); _wfp_logcallback (flags, &ft, (UINT8*)_r_obj_getstring (ntPath), NULL, (SID*)config.pbuiltin_admins_sid, IPPROTO_TCP, FWP_IP_VERSION_V4, remote_addr, NULL, RP_AD, local_addr, NULL, LP_AD, layer_id, filter_id, FWP_DIRECTION_OUTBOUND, FALSE, FALSE); } SAFE_DELETE_REFERENCE (ntPath); break; } #endif // _DEBUG || _APP_BETA } break; } } return FALSE; } INT APIENTRY wWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, INT nCmdShow) { MSG msg; if (_r_app_initialize (APP_NAME, APP_NAME_SHORT, APP_VERSION, APP_COPYRIGHT)) { // parse arguments { INT numargs; LPWSTR* arga = CommandLineToArgvW (_r_sys_getimagecommandline (), &numargs); if (arga) { BOOLEAN is_install = FALSE; BOOLEAN is_uninstall = FALSE; BOOLEAN is_silent = FALSE; BOOLEAN is_temporary = FALSE; for (INT i = 0; i < numargs; i++) { if (_r_str_compare (arga[i], L"/install") == 0) is_install = TRUE; else if (_r_str_compare (arga[i], L"/uninstall") == 0) is_uninstall = TRUE; else if (_r_str_compare (arga[i], L"/silent") == 0) is_silent = TRUE; else if (_r_str_compare (arga[i], L"/temp") == 0) is_temporary = TRUE; } LocalFree (arga); if (is_install || is_uninstall) { if (_r_sys_iselevated ()) { _app_initialize (); HANDLE hengine = _wfp_getenginehandle (); if (hengine) { if (is_install) { if (is_silent || ((_wfp_isfiltersinstalled () == InstallDisabled) && _app_installmessage (NULL, TRUE))) { if (is_temporary) config.is_filterstemporary = TRUE; _app_profile_load (NULL, NULL); if (_wfp_initialize (hengine, TRUE)) _wfp_installfilters (hengine); _wfp_uninitialize (hengine, FALSE); } } else if (is_uninstall) { if (is_silent || ((_wfp_isfiltersinstalled () != InstallDisabled) && _app_installmessage (NULL, FALSE))) { _wfp_destroyfilters (hengine); _wfp_uninitialize (hengine, TRUE); } } } } else { return ERROR_ACCESS_DENIED; } return ERROR_SUCCESS; } } } if (_r_app_createwindow (IDD_MAIN, IDI_MAIN, &DlgProc)) { HACCEL haccel = LoadAccelerators (_r_sys_getimagebase (), MAKEINTRESOURCE (IDA_MAIN)); if (haccel) { while (GetMessage (&msg, NULL, 0, 0) > 0) { HWND hwnd = GetActiveWindow (); if (!TranslateAccelerator (hwnd, haccel, &msg) && !IsDialogMessage (hwnd, &msg)) { TranslateMessage (&msg); DispatchMessage (&msg); } } DestroyAcceleratorTable (haccel); } } } return ERROR_SUCCESS; }