mirror of
https://github.com/henrypp/simplewall.git
synced 2026-10-22 11:03:28 -05:00
5129 lines
166 KiB
C++
5129 lines
166 KiB
C++
// 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: <a href=\"%s\">WindowsSpyBlocker</a> - 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"<test filter>"
|
|
#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;
|
|
}
|