Files
simplewall/src/main.c
T
2023-09-29 11:45:38 +06:00

3804 lines
91 KiB
C

// simplewall
// Copyright (c) 2016-2023 Henry++
#include "global.h"
BOOLEAN _app_changefilters (
_In_ HWND hwnd,
_In_ BOOLEAN is_install,
_In_ BOOLEAN is_forced
)
{
PITEM_CONTEXT context;
INT listview_id;
listview_id = _app_listview_getcurrent (hwnd);
_app_listview_sort (hwnd, listview_id);
if (is_forced || _wfp_isfiltersinstalled ())
{
_app_initinterfacestate (hwnd, TRUE);
context = _r_freelist_allocateitem (&context_free_list);
context->hwnd = hwnd;
context->is_install = is_install;
_r_workqueue_queueitem (&wfp_queue, &_wfp_applythread, context);
return TRUE;
}
_r_listview_redraw (hwnd, listview_id, -1);
_app_profile_save ();
return FALSE;
}
BOOLEAN _app_installmessage (
_In_opt_ HWND hwnd,
_In_ BOOLEAN is_install
)
{
TASKDIALOGCONFIG tdc = {0};
WCHAR str_main[256];
WCHAR radio_text_1[128];
WCHAR radio_text_2[128];
WCHAR str_flag[128];
WCHAR str_button_text_1[64];
WCHAR str_button_text_2[64];
TASKDIALOG_BUTTON td_buttons[2] = {0};
TASKDIALOG_BUTTON td_radios[2] = {0};
INT command_id;
INT radio_id;
BOOL is_flagchecked;
tdc.cbSize = sizeof (tdc);
tdc.dwFlags = TDF_ENABLE_HYPERLINKS | TDF_ALLOW_DIALOG_CANCELLATION | TDF_NO_SET_FOREGROUND | TDF_VERIFICATION_FLAG_CHECKED;
tdc.hwndParent = hwnd;
tdc.pszWindowTitle = _r_app_getname ();
tdc.pszMainIcon = is_install ? TD_INFORMATION_ICON : TD_WARNING_ICON;
//tdc.dwCommonButtons = TDCBF_YES_BUTTON | TDCBF_NO_BUTTON;
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;
_r_str_copy (
str_button_text_1,
RTL_NUMBER_OF (str_button_text_1),
_app_getstateaction (is_install ? INSTALL_DISABLED : INSTALL_ENABLED)
);
_r_str_copy (str_button_text_2, RTL_NUMBER_OF (str_button_text_2), _r_locale_getstring (IDS_CLOSE));
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;
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;
_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));
td_radios[0].nButtonID = IDYES;
td_radios[0].pszButtonText = radio_text_1;
td_radios[1].nButtonID = IDNO;
td_radios[1].pszButtonText = radio_text_2;
}
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));
}
tdc.pszMainInstruction = str_main;
tdc.pszVerificationText = str_flag;
if (SUCCEEDED (_r_msg_taskdialog (&tdc, &command_id, &radio_id, &is_flagchecked)))
{
if (command_id == IDYES)
{
if (is_install)
{
config.is_filterstemporary = (radio_id == IDNO);
if (is_flagchecked)
_wfp_firewallenable (FALSE);
}
else
{
config.is_filterstemporary = FALSE;
if (is_flagchecked)
_wfp_firewallenable (TRUE);
}
return TRUE;
}
}
return FALSE;
}
VOID _app_config_apply (
_In_ HWND hwnd,
_In_opt_ HWND hsettings,
_In_ INT ctrl_id
)
{
HMENU hmenu;
BOOLEAN is_enabled;
BOOLEAN new_val;
switch (ctrl_id)
{
case IDC_LOADONSTARTUP_CHK:
case IDM_LOADONSTARTUP_CHK:
{
new_val = !_r_autorun_isenabled ();
break;
}
case IDC_STARTMINIMIZED_CHK:
case IDM_STARTMINIMIZED_CHK:
{
new_val = !_r_config_getboolean (L"IsStartMinimized", FALSE);
break;
}
case IDC_SKIPUACWARNING_CHK:
case IDM_SKIPUACWARNING_CHK:
{
new_val = !_r_skipuac_isenabled ();
break;
}
case IDC_CHECKUPDATES_CHK:
case IDM_CHECKUPDATES_CHK:
{
new_val = !_r_update_isenabled (FALSE);
break;
}
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 IDM_RULE_ALLOWWINDOWSUPDATE:
{
new_val = !_r_config_getboolean (L"IsWUFixEnabled", FALSE);
break;
}
case IDC_USESTEALTHMODE_CHK:
{
new_val = !_r_config_getboolean (L"UseStealthMode", TRUE);
break;
}
case IDC_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 IDM_USEAPPMONITOR_CHK:
{
new_val = !_r_config_getboolean (L"IsEnableAppMonitor", FALSE);
break;
}
case IDM_PROFILETYPE_PLAIN:
case IDM_PROFILETYPE_COMPRESSED:
case IDM_PROFILETYPE_ENCRYPTED:
{
break;
}
default:
{
return;
}
}
hmenu = GetMenu (hwnd);
if (!hmenu)
return;
switch (ctrl_id)
{
case IDC_LOADONSTARTUP_CHK:
case IDM_LOADONSTARTUP_CHK:
{
_r_autorun_enable (hsettings ? hsettings : hwnd, new_val);
is_enabled = _r_autorun_isenabled ();
_r_menu_checkitem (hmenu, IDM_LOADONSTARTUP_CHK, 0, MF_BYCOMMAND, is_enabled);
if (hsettings)
_r_ctrl_checkbutton (hsettings, IDC_LOADONSTARTUP_CHK, is_enabled);
break;
}
case IDC_STARTMINIMIZED_CHK:
case IDM_STARTMINIMIZED_CHK:
{
_r_config_setboolean (L"IsStartMinimized", new_val);
_r_menu_checkitem (hmenu, IDM_STARTMINIMIZED_CHK, 0, MF_BYCOMMAND, new_val);
break;
}
case IDC_SKIPUACWARNING_CHK:
case IDM_SKIPUACWARNING_CHK:
{
_r_skipuac_enable (hsettings ? hsettings : hwnd, new_val);
is_enabled = _r_skipuac_isenabled ();
_r_menu_checkitem (hmenu, IDM_SKIPUACWARNING_CHK, 0, MF_BYCOMMAND, is_enabled);
if (hsettings)
_r_ctrl_checkbutton (hsettings, IDC_SKIPUACWARNING_CHK, is_enabled);
break;
}
case IDC_CHECKUPDATES_CHK:
case IDM_CHECKUPDATES_CHK:
{
_r_update_enable (new_val);
_r_menu_checkitem (hmenu, IDM_CHECKUPDATES_CHK, 0, MF_BYCOMMAND, new_val);
break;
}
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 IDM_RULE_ALLOWWINDOWSUPDATE:
{
_r_config_setboolean (L"IsWUFixEnabled", new_val);
_r_menu_checkitem (hmenu, IDM_RULE_ALLOWWINDOWSUPDATE, 0, MF_BYCOMMAND, new_val);
break;
}
case IDM_PROFILETYPE_PLAIN:
{
_r_config_setlong (L"ProfileType", 0);
_r_menu_checkitem (hmenu, IDM_PROFILETYPE_PLAIN, IDM_PROFILETYPE_ENCRYPTED, MF_BYCOMMAND, IDM_PROFILETYPE_PLAIN);
_app_profile_save ();
break;
}
case IDM_PROFILETYPE_COMPRESSED:
{
_r_config_setlong (L"ProfileType", 1);
_r_menu_checkitem (hmenu, IDM_PROFILETYPE_PLAIN, IDM_PROFILETYPE_ENCRYPTED, MF_BYCOMMAND, IDM_PROFILETYPE_COMPRESSED);
_app_profile_save ();
break;
}
case IDM_PROFILETYPE_ENCRYPTED:
{
_r_config_setlong (L"ProfileType", 2);
_r_menu_checkitem (hmenu, IDM_PROFILETYPE_PLAIN, IDM_PROFILETYPE_ENCRYPTED, MF_BYCOMMAND, IDM_PROFILETYPE_ENCRYPTED);
_app_profile_save ();
break;
}
case IDC_USESTEALTHMODE_CHK:
{
_r_config_setboolean (L"UseStealthMode", new_val);
break;
}
case IDC_INSTALLBOOTTIMEFILTERS_CHK:
{
_r_config_setboolean (L"InstallBoottimeFilters", 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 IDM_USEAPPMONITOR_CHK:
{
_r_config_setboolean (L"IsEnableAppMonitor", new_val);
_r_menu_checkitem (hmenu, IDM_USEAPPMONITOR_CHK, 0, MF_BYCOMMAND, new_val);
_app_fileloggingenable ();
break;
}
}
switch (ctrl_id)
{
case IDM_LOADONSTARTUP_CHK:
case IDC_LOADONSTARTUP_CHK:
case IDM_STARTMINIMIZED_CHK:
case IDC_STARTMINIMIZED_CHK:
case IDM_SKIPUACWARNING_CHK:
case IDC_SKIPUACWARNING_CHK:
case IDM_CHECKUPDATES_CHK:
case IDC_CHECKUPDATES_CHK:
case IDM_PROFILETYPE_PLAIN:
case IDM_PROFILETYPE_COMPRESSED:
case IDM_PROFILETYPE_ENCRYPTED:
case IDC_USENETWORKRESOLUTION_CHK:
case IDM_USENETWORKRESOLUTION_CHK:
case IDM_USEAPPMONITOR_CHK:
{
return;
}
}
if (_wfp_isfiltersinstalled ())
_app_changefilters (hwnd, TRUE, TRUE);
}
INT_PTR CALLBACK SettingsProc (
_In_ HWND hwnd,
_In_ UINT msg,
_In_ WPARAM wparam,
_In_ LPARAM lparam
)
{
switch (msg)
{
case RM_INITIALIZE:
{
INT dialog_id = (INT)wparam;
switch (dialog_id)
{
case IDD_SETTINGS_GENERAL:
{
_r_ctrl_checkbutton (hwnd, IDC_ALWAYSONTOP_CHK, _r_config_getboolean (L"AlwaysOnTop", FALSE));
#if defined(APP_HAVE_AUTORUN)
_r_ctrl_checkbutton (hwnd, IDC_LOADONSTARTUP_CHK, _r_autorun_isenabled ());
#endif // APP_HAVE_AUTORUN
_r_ctrl_checkbutton (hwnd, IDC_STARTMINIMIZED_CHK, _r_config_getboolean (L"IsStartMinimized", FALSE));
#if defined(APP_HAVE_SKIPUAC)
_r_ctrl_checkbutton (hwnd, IDC_SKIPUACWARNING_CHK, _r_skipuac_isenabled ());
#endif // APP_HAVE_SKIPUAC
_r_ctrl_checkbutton (hwnd, IDC_CHECKUPDATES_CHK, _r_update_isenabled (FALSE));
_r_locale_enum (hwnd, IDC_LANGUAGE, 0);
break;
}
case IDD_SETTINGS_RULES:
{
HWND htip;
_r_ctrl_checkbutton (hwnd, IDC_RULE_BLOCKOUTBOUND, _r_config_getboolean (L"BlockOutboundConnections", TRUE));
_r_ctrl_checkbutton (hwnd, IDC_RULE_BLOCKINBOUND, _r_config_getboolean (L"BlockInboundConnections", TRUE));
_r_ctrl_checkbutton (hwnd, IDC_RULE_ALLOWLOOPBACK, _r_config_getboolean (L"AllowLoopbackConnections", TRUE));
_r_ctrl_checkbutton (hwnd, IDC_RULE_ALLOW6TO4, _r_config_getboolean (L"AllowIPv6", TRUE));
_r_ctrl_checkbutton (hwnd, IDC_USESTEALTHMODE_CHK, _r_config_getboolean (L"UseStealthMode", TRUE));
_r_ctrl_checkbutton (hwnd, IDC_INSTALLBOOTTIMEFILTERS_CHK, _r_config_getboolean (L"InstallBoottimeFilters", TRUE));
_r_ctrl_checkbutton (hwnd, IDC_USENETWORKRESOLUTION_CHK, _r_config_getboolean (L"IsNetworkResolutionsEnabled", FALSE));
htip = _r_ctrl_createtip (hwnd);
if (!htip)
break;
_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);
break;
}
case IDD_SETTINGS_BLOCKLIST:
{
for (INT i = IDC_BLOCKLIST_SPY_DISABLE; i <= IDC_BLOCKLIST_EXTRA_BLOCK; i++)
_r_ctrl_checkbutton (hwnd, i, FALSE); // HACK!!! reset button checkboxes!
_r_ctrl_checkbutton (
hwnd,
IDC_BLOCKLIST_SPY_DISABLE + _r_calc_clamp (_r_config_getlong (L"BlocklistSpyState", 2), 0, 2),
TRUE
);
_r_ctrl_checkbutton (
hwnd,
IDC_BLOCKLIST_UPDATE_DISABLE + _r_calc_clamp (_r_config_getlong (L"BlocklistUpdateState", 0), 0, 2),
TRUE
);
_r_ctrl_checkbutton (
hwnd,
IDC_BLOCKLIST_EXTRA_DISABLE + _r_calc_clamp (_r_config_getlong (L"BlocklistExtraState", 0), 0, 2),
TRUE
);
break;
}
case IDD_SETTINGS_INTERFACE:
{
_r_ctrl_checkbutton (hwnd, IDC_CONFIRMEXIT_CHK, _r_config_getboolean (L"ConfirmExit2", TRUE));
_r_ctrl_checkbutton (hwnd, IDC_CONFIRMEXITTIMER_CHK, _r_config_getboolean (L"ConfirmExitTimer", TRUE));
_r_ctrl_checkbutton (hwnd, IDC_CONFIRMLOGCLEAR_CHK, _r_config_getboolean (L"ConfirmLogClear", TRUE));
_r_ctrl_checkbutton (hwnd, IDC_CONFIRMALLOW_CHK, _r_config_getboolean (L"ConfirmAllow", TRUE));
_r_ctrl_checkbutton (hwnd, IDC_TRAYICONSINGLECLICK_CHK, _r_config_getboolean (L"IsTrayIconSingleClick", TRUE));
break;
}
case IDD_SETTINGS_HIGHLIGHTING:
{
PITEM_COLOR ptr_clr = NULL;
ULONG_PTR enum_key = 0;
BOOLEAN val;
LONG icon_id;
INT item_id = 0;
// 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_listview_setview (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);
icon_id = _app_icons_getdefaultapp_id (DATA_APP_REGULAR);
_app_listview_lock (hwnd, IDC_COLORS, TRUE);
while (_r_obj_enumhashtable (colors_table, &ptr_clr, NULL, &enum_key))
{
ptr_clr->new_clr = _r_config_getulong_ex (ptr_clr->config_value->buffer, ptr_clr->default_clr, L"colors");
_r_listview_additem_ex (
hwnd,
IDC_COLORS,
item_id,
_r_locale_getstring (ptr_clr->locale_id),
icon_id,
I_GROUPIDNONE,
(LPARAM)ptr_clr
);
val = _r_config_getboolean_ex (ptr_clr->config_name->buffer, ptr_clr->is_enabled, L"colors");
_r_listview_setitemcheck (hwnd, IDC_COLORS, item_id, val);
item_id += 1;
}
_app_listview_lock (hwnd, IDC_COLORS, FALSE);
break;
}
case IDD_SETTINGS_NOTIFICATIONS:
{
_r_ctrl_checkbutton (hwnd, IDC_ENABLENOTIFICATIONS_CHK, _r_config_getboolean (L"IsNotificationsEnabled", TRUE));
_r_ctrl_checkbutton (hwnd, IDC_NOTIFICATIONSOUND_CHK, _r_config_getboolean (L"IsNotificationsSound", TRUE));
_r_ctrl_checkbutton (hwnd, IDC_NOTIFICATIONFULLSCREENSILENTMODE_CHK, _r_config_getboolean (L"IsNotificationsFullscreenSilentMode", TRUE));
_r_ctrl_checkbutton (hwnd, IDC_NOTIFICATIONONTRAY_CHK, _r_config_getboolean (L"IsNotificationsOnTray", FALSE));
SendDlgItemMessage (
hwnd,
IDC_NOTIFICATIONTIMEOUT,
UDM_SETRANGE32,
0,
(LPARAM)_r_calc_days2seconds (7)
);
SendDlgItemMessage (
hwnd,
IDC_NOTIFICATIONTIMEOUT,
UDM_SETPOS32,
0,
(LPARAM)_r_config_getulong (L"NotificationsTimeout", NOTIFY_TIMEOUT_DEFAULT)
);
PostMessage (hwnd, WM_COMMAND, MAKEWPARAM (IDC_ENABLENOTIFICATIONS_CHK, 0), WM_APP);
break;
}
case IDD_SETTINGS_LOGGING:
{
UDACCEL ud = {0};
PR_STRING string;
_r_ctrl_checkbutton (hwnd, IDC_ENABLELOG_CHK, _r_config_getboolean (L"IsLogEnabled", FALSE));
string = _app_getlogpath ();
if (string)
{
_r_ctrl_setstring (hwnd, IDC_LOGPATH, string->buffer);
_r_obj_dereference (string);
}
string = _app_getlogviewer ();
if (string)
{
_r_ctrl_setstring (hwnd, IDC_LOGVIEWER, string->buffer);
_r_obj_dereference (string);
}
ud.nInc = 64; // set step to 64kb
SendDlgItemMessage (
hwnd,
IDC_LOGSIZELIMIT,
UDM_SETACCEL,
1,
(LPARAM)&ud
);
SendDlgItemMessage (
hwnd,
IDC_LOGSIZELIMIT,
UDM_SETRANGE32,
(WPARAM)64,
(LPARAM)_r_calc_kilobytes2bytes (512)
);
SendDlgItemMessage (
hwnd,
IDC_LOGSIZELIMIT,
UDM_SETPOS32,
0,
(LPARAM)_r_config_getulong (L"LogSizeLimitKb", LOG_SIZE_LIMIT_DEFAULT)
);
_r_ctrl_checkbutton (hwnd, IDC_ENABLEUILOG_CHK, _r_config_getboolean (L"IsLogUiEnabled", FALSE));
PostMessage (hwnd, WM_COMMAND, MAKEWPARAM (IDC_ENABLELOG_CHK, 0), WM_APP);
break;
}
case IDD_SETTINGS_EXCLUDE:
{
_r_ctrl_checkbutton (hwnd, IDC_EXCLUDEBLOCKLIST_CHK, _r_config_getboolean (L"IsExcludeBlocklist", TRUE));
_r_ctrl_checkbutton (hwnd, IDC_EXCLUDECUSTOM_CHK, _r_config_getboolean (L"IsExcludeCustomRules", TRUE));
_r_ctrl_checkbutton (hwnd, IDC_EXCLUDESTEALTH_CHK, _r_config_getboolean (L"IsExcludeStealth", TRUE));
_r_ctrl_checkbutton (hwnd, IDC_EXCLUDECLASSIFYALLOW_CHK, _r_config_getboolean (L"IsExcludeClassifyAllow", TRUE));
break;
}
break;
}
break;
}
case RM_LOCALIZE:
{
INT dialog_id = (INT)wparam;
// localize titles
_r_ctrl_setstringformat (
hwnd,
IDC_TITLE_GENERAL,
L"%s:",
_r_locale_getstring (IDS_TITLE_GENERAL)
);
_r_ctrl_setstringformat (
hwnd,
IDC_TITLE_LANGUAGE,
L"%s: (Language)",
_r_locale_getstring (IDS_TITLE_LANGUAGE)
);
_r_ctrl_setstringformat (
hwnd,
IDC_TITLE_BLOCKLIST_SPY,
L"%s:",
_r_locale_getstring (IDS_BLOCKLIST_SPY)
);
_r_ctrl_setstringformat (
hwnd,
IDC_TITLE_BLOCKLIST_UPDATE,
L"%s:",
_r_locale_getstring (IDS_BLOCKLIST_UPDATE)
);
_r_ctrl_setstringformat (
hwnd,
IDC_TITLE_BLOCKLIST_EXTRA,
L"%s: (Skype, Bing, Live, Outlook, etc.)",
_r_locale_getstring (IDS_BLOCKLIST_EXTRA)
);
_r_ctrl_setstringformat (
hwnd,
IDC_TITLE_CONNECTIONS,
L"%s:",
_r_locale_getstring (IDS_TAB_NETWORK)
);
_r_ctrl_setstringformat (
hwnd,
IDC_TITLE_SECURITY,
L"%s:",
_r_locale_getstring (IDS_TITLE_SECURITY)
);
_r_ctrl_setstringformat (
hwnd,
IDC_TITLE_CONFIRMATIONS,
L"%s:",
_r_locale_getstring (IDS_TITLE_CONFIRMATIONS)
);
_r_ctrl_setstringformat (
hwnd,
IDC_TITLE_TRAY,
L"%s:",
_r_locale_getstring (IDS_TITLE_TRAY)
);
_r_ctrl_setstringformat (
hwnd,
IDC_TITLE_HIGHLIGHTING,
L"%s:",
_r_locale_getstring (IDS_TITLE_HIGHLIGHTING)
);
_r_ctrl_setstringformat (
hwnd,
IDC_TITLE_LOGVIEWER,
L"%s:",
_r_locale_getstring (IDS_LOGVIEWER_HINT)
);
_r_ctrl_setstringformat (
hwnd,
IDC_TITLE_INTERFACE,
L"%s:",
_r_locale_getstring (IDS_TITLE_INTERFACE)
);
_r_ctrl_setstringformat (
hwnd,
IDC_TITLE_NOTIFICATIONS,
L"%s:",
_r_locale_getstring (IDS_TITLE_NOTIFICATIONS)
);
_r_ctrl_setstringformat (
hwnd, IDC_TITLE_LOGGING,
L"%s:",
_r_locale_getstring (IDS_TITLE_LOGGING)
);
_r_ctrl_setstringformat (
hwnd,
IDC_TITLE_ADVANCED,
L"%s:",
_r_locale_getstring (IDS_TITLE_ADVANCED)
);
switch (dialog_id)
{
case IDD_SETTINGS_GENERAL:
{
_r_ctrl_setstring (hwnd, IDC_ALWAYSONTOP_CHK, _r_locale_getstring (IDS_ALWAYSONTOP_CHK));
_r_ctrl_setstring (hwnd, IDC_LOADONSTARTUP_CHK, _r_locale_getstring (IDS_LOADONSTARTUP_CHK));
_r_ctrl_setstring (hwnd, IDC_STARTMINIMIZED_CHK, _r_locale_getstring (IDS_STARTMINIMIZED_CHK));
_r_ctrl_setstring (hwnd, IDC_SKIPUACWARNING_CHK, _r_locale_getstring (IDS_SKIPUACWARNING_CHK));
_r_ctrl_setstring (hwnd, IDC_CHECKUPDATES_CHK, _r_locale_getstring (IDS_CHECKUPDATES_CHK));
_r_ctrl_setstring (hwnd, IDC_LANGUAGE_HINT, _r_locale_getstring (IDS_LANGUAGE_HINT));
break;
}
case IDD_SETTINGS_RULES:
{
LPCWSTR recommended_string;
recommended_string = _r_locale_getstring (IDS_RECOMMENDED);
_r_ctrl_setstringformat (
hwnd,
IDC_RULE_BLOCKOUTBOUND,
L"%s (%s)",
_r_locale_getstring (IDS_RULE_BLOCKOUTBOUND),
recommended_string
);
_r_ctrl_setstringformat (
hwnd,
IDC_RULE_BLOCKINBOUND,
L"%s (%s)",
_r_locale_getstring (IDS_RULE_BLOCKINBOUND),
recommended_string
);
_r_ctrl_setstringformat (
hwnd,
IDC_RULE_ALLOWLOOPBACK,
L"%s (%s)",
_r_locale_getstring (IDS_RULE_ALLOWLOOPBACK),
recommended_string
);
_r_ctrl_setstringformat (
hwnd,
IDC_RULE_ALLOW6TO4,
L"%s (%s)",
_r_locale_getstring (IDS_RULE_ALLOW6TO4),
recommended_string
);
_r_ctrl_setstringformat (
hwnd,
IDC_USESTEALTHMODE_CHK,
L"%s (%s)",
_r_locale_getstring (IDS_USESTEALTHMODE_CHK),
recommended_string
);
_r_ctrl_setstringformat (
hwnd,
IDC_INSTALLBOOTTIMEFILTERS_CHK,
L"%s (%s)",
_r_locale_getstring (IDS_INSTALLBOOTTIMEFILTERS_CHK),
recommended_string
);
_r_ctrl_setstring (
hwnd,
IDC_USENETWORKRESOLUTION_CHK,
_r_locale_getstring (IDS_USENETWORKRESOLUTION_CHK)
);
break;
}
case IDD_SETTINGS_BLOCKLIST:
{
LPCWSTR recommended_string;
LPCWSTR disable_string;
LPCWSTR allow_string;
LPCWSTR block_string;
recommended_string = _r_locale_getstring (IDS_RECOMMENDED);
disable_string = _r_locale_getstring (IDS_DISABLE);
allow_string = _r_locale_getstring (IDS_ACTION_ALLOW);
block_string = _r_locale_getstring (IDS_ACTION_BLOCK);
_r_ctrl_setstring (hwnd, IDC_BLOCKLIST_SPY_DISABLE, disable_string);
_r_ctrl_setstring (hwnd, IDC_BLOCKLIST_SPY_ALLOW, allow_string);
_r_ctrl_setstringformat (
hwnd,
IDC_BLOCKLIST_SPY_BLOCK,
L"%s (%s)",
block_string,
recommended_string
);
_r_ctrl_setstringformat (
hwnd,
IDC_BLOCKLIST_UPDATE_DISABLE,
L"%s (%s)",
disable_string,
recommended_string
);
_r_ctrl_setstring (hwnd, IDC_BLOCKLIST_UPDATE_ALLOW, allow_string);
_r_ctrl_setstring (hwnd, IDC_BLOCKLIST_UPDATE_BLOCK, block_string);
_r_ctrl_setstringformat (
hwnd,
IDC_BLOCKLIST_EXTRA_DISABLE,
L"%s (%s)",
disable_string,
recommended_string
);
_r_ctrl_setstring (hwnd, IDC_BLOCKLIST_EXTRA_ALLOW, allow_string);
_r_ctrl_setstring (hwnd, IDC_BLOCKLIST_EXTRA_BLOCK, block_string);
_r_ctrl_setstringformat (
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_setstring (hwnd, IDC_CONFIRMEXIT_CHK, _r_locale_getstring (IDS_CONFIRMEXIT_CHK));
_r_ctrl_setstring (hwnd, IDC_CONFIRMEXITTIMER_CHK, _r_locale_getstring (IDS_CONFIRMEXITTIMER_CHK));
_r_ctrl_setstring (hwnd, IDC_CONFIRMLOGCLEAR_CHK, _r_locale_getstring (IDS_CONFIRMLOGCLEAR_CHK));
_r_ctrl_setstring (hwnd, IDC_CONFIRMALLOW_CHK, _r_locale_getstring (IDS_CONFIRMALLOW_CHK));
_r_ctrl_setstring (
hwnd,
IDC_TRAYICONSINGLECLICK_CHK,
_r_locale_getstring (IDS_TRAYICONSINGLECLICK_CHK)
);
break;
}
case IDD_SETTINGS_HIGHLIGHTING:
{
PITEM_COLOR ptr_clr;
_r_listview_setcolumn (hwnd, IDC_COLORS, 0, NULL, -100);
for (INT i = 0; i < _r_listview_getitemcount (hwnd, IDC_COLORS); i++)
{
ptr_clr = (PITEM_COLOR)_r_listview_getitemlparam (hwnd, IDC_COLORS, i);
if (ptr_clr)
_r_listview_setitem (hwnd, IDC_COLORS, i, 0, _r_locale_getstring (ptr_clr->locale_id));
}
_r_ctrl_setstring (hwnd, IDC_COLORS_HINT, _r_locale_getstring (IDS_COLORS_HINT));
break;
}
case IDD_SETTINGS_NOTIFICATIONS:
{
_r_ctrl_setstring (
hwnd,
IDC_ENABLENOTIFICATIONS_CHK,
_r_locale_getstring (IDS_ENABLENOTIFICATIONS_CHK)
);
_r_ctrl_setstring (
hwnd,
IDC_NOTIFICATIONSOUND_CHK,
_r_locale_getstring (IDS_NOTIFICATIONSOUND_CHK)
);
_r_ctrl_setstring (
hwnd,
IDC_NOTIFICATIONFULLSCREENSILENTMODE_CHK,
_r_locale_getstring (IDS_NOTIFICATIONFULLSCREENSILENTMODE_CHK)
);
_r_ctrl_setstring (
hwnd,
IDC_NOTIFICATIONONTRAY_CHK,
_r_locale_getstring (IDS_NOTIFICATIONONTRAY_CHK)
);
_r_ctrl_setstring (
hwnd,
IDC_NOTIFICATIONTIMEOUT_HINT,
_r_locale_getstring (IDS_NOTIFICATIONTIMEOUT_HINT)
);
break;
}
case IDD_SETTINGS_LOGGING:
{
_r_ctrl_setstring (hwnd, IDC_ENABLELOG_CHK, _r_locale_getstring (IDS_ENABLELOG_CHK));
_r_ctrl_setstring (hwnd, IDC_LOGSIZELIMIT_HINT, _r_locale_getstring (IDS_LOGSIZELIMIT_HINT));
_r_ctrl_setstringformat (
hwnd,
IDC_ENABLEUILOG_CHK,
L"%s (session only)",
_r_locale_getstring (IDS_ENABLEUILOG_CHK)
);
break;
}
case IDD_SETTINGS_EXCLUDE:
{
_r_ctrl_setstringformat (
hwnd,
IDC_EXCLUDEBLOCKLIST_CHK,
L"%s %s",
_r_locale_getstring (IDS_TITLE_EXCLUDE),
_r_locale_getstring (IDS_EXCLUDEBLOCKLIST_CHK)
);
_r_ctrl_setstringformat (
hwnd,
IDC_EXCLUDECUSTOM_CHK,
L"%s %s",
_r_locale_getstring (IDS_TITLE_EXCLUDE),
_r_locale_getstring (IDS_EXCLUDECUSTOM_CHK)
);
_r_ctrl_setstringformat (
hwnd,
IDC_EXCLUDESTEALTH_CHK,
L"%s %s",
_r_locale_getstring (IDS_TITLE_EXCLUDE),
_r_locale_getstring (IDS_EXCLUDESTEALTH_CHK)
);
_r_ctrl_setstringformat (
hwnd,
IDC_EXCLUDECLASSIFYALLOW_CHK,
L"%s %s",
_r_locale_getstring (IDS_TITLE_EXCLUDE),
_r_locale_getstring (IDS_EXCLUDECLASSIFYALLOW_CHK)
);
break;
}
}
break;
}
case WM_SIZE:
{
RECT rect;
HWND hlistview;
hlistview = GetDlgItem (hwnd, IDC_COLORS);
if (!hlistview)
break;
if (GetClientRect (hlistview, &rect))
_r_listview_setcolumn (hwnd, IDC_COLORS, 0, NULL, rect.right);
break;
}
case WM_VSCROLL:
case WM_HSCROLL:
{
ULONG value;
INT ctrl_id;
ctrl_id = GetDlgCtrlID ((HWND)lparam);
if (ctrl_id == IDC_LOGSIZELIMIT)
{
value = (ULONG)SendDlgItemMessage (hwnd, ctrl_id, UDM_GETPOS32, 0, 0);
_r_config_setulong (L"LogSizeLimitKb", value);
}
else if (ctrl_id == IDC_NOTIFICATIONTIMEOUT)
{
value = (ULONG)SendDlgItemMessage (hwnd, ctrl_id, UDM_GETPOS32, 0, 0);
_r_config_setulong (L"NotificationsTimeout", value);
}
break;
}
case WM_NOTIFY:
{
LPNMHDR nmlp;
nmlp = (LPNMHDR)lparam;
switch (nmlp->code)
{
case TTN_GETDISPINFO:
{
LPNMTTDISPINFO lpnmdi = (LPNMTTDISPINFO)lparam;
WCHAR buffer[1024] = {0};
INT locale_id;
INT ctrl_id;
if ((lpnmdi->uFlags & TTF_IDISHWND) != TTF_IDISHWND)
break;
ctrl_id = GetDlgCtrlID ((HWND)(lpnmdi->hdr.idFrom));
if (ctrl_id == IDC_RULE_BLOCKOUTBOUND)
{
locale_id = IDS_RULE_BLOCKOUTBOUND;
}
else if (ctrl_id == IDC_RULE_BLOCKINBOUND)
{
locale_id = IDS_RULE_BLOCKINBOUND;
}
else if (ctrl_id == IDC_RULE_ALLOWLOOPBACK)
{
locale_id = IDS_RULE_ALLOWLOOPBACK_HINT;
}
else if (ctrl_id == IDC_USESTEALTHMODE_CHK)
{
locale_id = IDS_USESTEALTHMODE_HINT;
}
else if (ctrl_id == IDC_INSTALLBOOTTIMEFILTERS_CHK)
{
locale_id = IDS_INSTALLBOOTTIMEFILTERS_HINT;
}
else
{
break;
}
_r_str_copy (buffer, RTL_NUMBER_OF (buffer), _r_locale_getstring (locale_id));
lpnmdi->lpszText = buffer;
break;
}
case LVN_ITEMCHANGED:
{
LPNMLISTVIEW lpnmlv;
INT listview_id;
PITEM_COLOR ptr_clr;
BOOLEAN is_enabled;
lpnmlv = (LPNMLISTVIEW)lparam;
listview_id = (INT)(INT_PTR)lpnmlv->hdr.idFrom;
if ((lpnmlv->uChanged & LVIF_STATE) == 0)
break;
if (listview_id != IDC_COLORS)
break;
if ((lpnmlv->uNewState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK (1) || ((lpnmlv->uNewState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK (2)))
{
if (_app_listview_islocked (hwnd, (INT)(INT_PTR)lpnmlv->hdr.idFrom))
break;
ptr_clr = (PITEM_COLOR)lpnmlv->lParam;
if (ptr_clr)
{
is_enabled = (lpnmlv->uNewState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK (2);
_r_config_setboolean_ex (ptr_clr->config_name->buffer, is_enabled, L"colors");
_r_listview_redraw (_r_app_gethwnd (), _app_listview_getcurrent (_r_app_gethwnd ()), -1);
}
}
break;
}
case NM_CUSTOMDRAW:
{
LONG_PTR result;
result = _app_message_custdraw (hwnd, (LPNMLVCUSTOMDRAW)lparam);
SetWindowLongPtr (hwnd, DWLP_MSGRESULT, result);
return result;
}
case NM_DBLCLK:
{
LPNMITEMACTIVATE lpnmlv;
INT listview_id;
PITEM_COLOR ptr_clr_crnt;
CHOOSECOLOR cc = {0};
COLORREF cust[16] = {0};
PITEM_COLOR ptr_clr = NULL;
ULONG_PTR enum_key = 0;
ULONG_PTR index = 0;
lpnmlv = (LPNMITEMACTIVATE)lparam;
listview_id = (INT)(INT_PTR)lpnmlv->hdr.idFrom;
if (lpnmlv->iItem == -1)
break;
if (listview_id != IDC_COLORS)
break;
ptr_clr_crnt = (PITEM_COLOR)_r_listview_getitemlparam (hwnd, listview_id, lpnmlv->iItem);
if (!ptr_clr_crnt)
break;
while (_r_obj_enumhashtable (colors_table, &ptr_clr, NULL, &enum_key))
{
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_crnt->new_clr;
if (ChooseColor (&cc))
{
ptr_clr_crnt->new_clr = cc.rgbResult;
_r_config_setulong_ex (ptr_clr_crnt->config_value->buffer, cc.rgbResult, L"colors");
_r_listview_redraw (hwnd, IDC_COLORS, -1);
_r_listview_redraw (_r_app_gethwnd (), _app_listview_getcurrent (_r_app_gethwnd ()), -1);
}
break;
}
case NM_CLICK:
case NM_RETURN:
{
PNMLINK pnmlink;
pnmlink = (PNMLINK)lparam;
if (!_r_str_isempty (pnmlink->item.szUrl))
_r_shell_opendefault (pnmlink->item.szUrl);
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;
is_enabled = _r_ctrl_isbuttonchecked (hwnd, ctrl_id);
_r_config_setboolean (L"AlwaysOnTop", is_enabled);
_r_menu_checkitem (GetMenu (_r_app_gethwnd ()), IDM_ALWAYSONTOP_CHK, 0, MF_BYCOMMAND, is_enabled);
break;
}
case IDC_LANGUAGE:
{
if (notify_code != CBN_SELCHANGE)
break;
_r_locale_apply (hwnd, ctrl_id, 0);
break;
}
case IDC_CONFIRMEXIT_CHK:
{
_r_config_setboolean (L"ConfirmExit2", _r_ctrl_isbuttonchecked (hwnd, ctrl_id));
break;
}
case IDC_CONFIRMEXITTIMER_CHK:
{
_r_config_setboolean (L"ConfirmExitTimer", _r_ctrl_isbuttonchecked (hwnd, ctrl_id));
break;
}
case IDC_CONFIRMLOGCLEAR_CHK:
{
_r_config_setboolean (L"ConfirmLogClear", _r_ctrl_isbuttonchecked (hwnd, ctrl_id));
break;
}
case IDC_CONFIRMALLOW_CHK:
{
_r_config_setboolean (L"ConfirmAllow", _r_ctrl_isbuttonchecked (hwnd, ctrl_id));
break;
}
case IDC_TRAYICONSINGLECLICK_CHK:
{
_r_config_setboolean (L"IsTrayIconSingleClick", _r_ctrl_isbuttonchecked (hwnd, ctrl_id));
break;
}
case IDC_LOADONSTARTUP_CHK:
case IDC_STARTMINIMIZED_CHK:
case IDC_SKIPUACWARNING_CHK:
case IDC_CHECKUPDATES_CHK:
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_USENETWORKRESOLUTION_CHK:
{
_app_config_apply (_r_app_gethwnd (), hwnd, 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;
LONG new_state;
hmenu = GetMenu (_r_app_gethwnd ());
if (ctrl_id >= IDC_BLOCKLIST_SPY_DISABLE && ctrl_id <= IDC_BLOCKLIST_SPY_BLOCK)
{
new_state = _r_calc_clamp (
_r_ctrl_isradiochecked (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_setlong (L"BlocklistSpyState", new_state);
_app_ruleblocklistset (_r_app_gethwnd (), new_state, -1, -1, TRUE);
}
else if (ctrl_id >= IDC_BLOCKLIST_UPDATE_DISABLE && ctrl_id <= IDC_BLOCKLIST_UPDATE_BLOCK)
{
new_state = _r_calc_clamp (
_r_ctrl_isradiochecked (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_setlong (L"BlocklistUpdateState", new_state);
_app_ruleblocklistset (_r_app_gethwnd (), -1, new_state, -1, TRUE);
}
else if (ctrl_id >= IDC_BLOCKLIST_EXTRA_DISABLE && ctrl_id <= IDC_BLOCKLIST_EXTRA_BLOCK)
{
new_state = _r_calc_clamp (
_r_ctrl_isradiochecked (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_setlong (L"BlocklistExtraState", new_state);
_app_ruleblocklistset (_r_app_gethwnd (), -1, -1, new_state, TRUE);
}
break;
}
case IDC_ENABLELOG_CHK:
{
HWND hctrl;
BOOLEAN is_postmessage;
BOOLEAN is_enabled;
BOOLEAN is_logging_enabled;
is_postmessage = ((INT)lparam == WM_APP);
is_enabled = _r_ctrl_isbuttonchecked (hwnd, ctrl_id);
is_logging_enabled = is_enabled || _r_ctrl_isbuttonchecked (hwnd, IDC_ENABLEUILOG_CHK);
if (!is_postmessage)
{
_r_config_setboolean (L"IsLogEnabled", is_enabled);
_app_loginit (is_enabled);
}
SendDlgItemMessage (
config.hrebar,
IDC_TOOLBAR,
TB_PRESSBUTTON,
IDM_TRAY_ENABLELOG_CHK,
MAKELPARAM (is_enabled, 0)
);
_r_ctrl_enable (hwnd, IDC_LOGPATH, is_enabled); // input
_r_ctrl_enable (hwnd, IDC_LOGPATH_BTN, is_enabled); // button
hctrl = (HWND)SendDlgItemMessage (hwnd, IDC_LOGSIZELIMIT, UDM_GETBUDDY, 0, 0);
if (hctrl)
_r_ctrl_enable (hctrl, 0, is_enabled);
break;
}
case IDC_ENABLEUILOG_CHK:
{
BOOLEAN is_enabled;
BOOLEAN is_logging_enabled;
is_enabled = _r_ctrl_isbuttonchecked (hwnd, ctrl_id);
is_logging_enabled = is_enabled || _r_ctrl_isbuttonchecked (hwnd, IDC_ENABLELOG_CHK);
_r_config_setboolean (L"IsLogUiEnabled", is_enabled);
SendDlgItemMessage (
config.hrebar,
IDC_TOOLBAR,
TB_PRESSBUTTON,
IDM_TRAY_ENABLEUILOG_CHK,
MAKELPARAM (is_enabled, 0)
);
break;
}
case IDC_LOGPATH:
{
PR_STRING log_path;
if (notify_code == EN_KILLFOCUS)
{
log_path = _r_ctrl_getstring (hwnd, ctrl_id);
if (log_path)
{
_r_config_setstringexpand (L"LogPath", log_path->buffer);
if (_r_config_getboolean (L"IsLogEnabled", FALSE))
_app_loginit (TRUE);
_r_obj_dereference (log_path);
}
}
break;
}
case IDC_LOGPATH_BTN:
{
static COMDLG_FILTERSPEC filters[] = {
L"Log files (*.log, *.csv)", L"*.log;*.csv",
L"All files (*.*)", L"*.*",
};
R_FILE_DIALOG file_dialog;
PR_STRING path;
if (_r_filedialog_initialize (&file_dialog, PR_FILEDIALOG_SAVEFILE))
{
_r_filedialog_setfilter (&file_dialog, filters, RTL_NUMBER_OF (filters));
path = _r_ctrl_getstring (hwnd, IDC_LOGPATH);
if (path)
_r_filedialog_setpath (&file_dialog, path->buffer);
if (_r_filedialog_show (hwnd, &file_dialog))
{
_r_obj_movereference (&path, _r_filedialog_getpath (&file_dialog));
if (path)
{
_r_config_setstringexpand (L"LogPath", path->buffer);
_r_ctrl_setstring (hwnd, IDC_LOGPATH, path->buffer);
_app_loginit (_r_config_getboolean (L"IsLogEnabled", FALSE));
}
}
if (path)
_r_obj_dereference (path);
_r_filedialog_destroy (&file_dialog);
}
break;
}
case IDC_LOGVIEWER:
{
PR_STRING log_viewer;
if (notify_code != EN_KILLFOCUS)
break;
log_viewer = _r_ctrl_getstring (hwnd, ctrl_id);
if (!log_viewer)
break;
_r_config_setstringexpand (L"LogViewer", log_viewer->buffer);
_r_obj_dereference (log_viewer);
break;
}
case IDC_LOGVIEWER_BTN:
{
static COMDLG_FILTERSPEC filters[] = {
L"Executable files (*.exe)", L"*.exe",
L"All files (*.*)", L"*.*",
};
R_FILE_DIALOG file_dialog;
PR_STRING path;
if (_r_filedialog_initialize (&file_dialog, PR_FILEDIALOG_OPENFILE))
{
_r_filedialog_setfilter (&file_dialog, filters, RTL_NUMBER_OF (filters));
path = _r_ctrl_getstring (hwnd, IDC_LOGVIEWER);
if (path)
_r_filedialog_setpath (&file_dialog, path->buffer);
if (_r_filedialog_show (hwnd, &file_dialog))
{
_r_obj_movereference (&path, _r_filedialog_getpath (&file_dialog));
if (path)
{
_r_config_setstringexpand (L"LogViewer", path->buffer);
_r_ctrl_setstring (hwnd, IDC_LOGVIEWER, path->buffer);
}
}
if (path)
_r_obj_dereference (path);
_r_filedialog_destroy (&file_dialog);
}
break;
}
case IDC_LOGSIZELIMIT_CTRL:
{
ULONG value;
if (notify_code != EN_KILLFOCUS)
break;
value = (ULONG)SendDlgItemMessage (hwnd, IDC_LOGSIZELIMIT, UDM_GETPOS32, 0, 0);
_r_config_setulong (L"LogSizeLimitKb", value);
break;
}
case IDC_ENABLENOTIFICATIONS_CHK:
{
HWND hctrl;
BOOLEAN is_postmessage;
BOOLEAN is_enabled;
is_postmessage = ((INT)lparam == WM_APP);
is_enabled = _r_ctrl_isbuttonchecked (hwnd, ctrl_id);
if (!is_postmessage)
_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);
hctrl = (HWND)SendDlgItemMessage (hwnd, IDC_NOTIFICATIONTIMEOUT, UDM_GETBUDDY, 0, 0);
if (hctrl)
_r_ctrl_enable (hctrl, 0, is_enabled);
PostMessage (hwnd, WM_COMMAND, MAKEWPARAM (IDC_NOTIFICATIONSOUND_CHK, 0), WM_APP);
if (is_postmessage)
break;
hctrl = _app_notify_getwindow (NULL);
if (hctrl)
_app_notify_refresh (hctrl);
break;
}
case IDC_NOTIFICATIONSOUND_CHK:
{
BOOLEAN is_postmessage;
BOOLEAN is_checked;
is_postmessage = ((INT)lparam == WM_APP);
is_checked = _r_ctrl_isbuttonchecked (hwnd, ctrl_id);
_r_ctrl_checkbutton (hwnd, IDC_NOTIFICATIONFULLSCREENSILENTMODE_CHK, _r_config_getboolean (L"IsNotificationsFullscreenSilentMode", TRUE));
if (!is_postmessage)
_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", _r_ctrl_isbuttonchecked (hwnd, ctrl_id));
break;
}
case IDC_NOTIFICATIONONTRAY_CHK:
{
HWND hnotify;
_r_config_setboolean (L"IsNotificationsOnTray", _r_ctrl_isbuttonchecked (hwnd, ctrl_id));
hnotify = _app_notify_getwindow (NULL);
if (hnotify)
_app_notify_setposition (hnotify, TRUE);
break;
}
case IDC_NOTIFICATIONTIMEOUT_CTRL:
{
if (notify_code == EN_KILLFOCUS)
{
_r_config_setulong (L"NotificationsTimeout", (ULONG)SendDlgItemMessage (hwnd, IDC_NOTIFICATIONTIMEOUT, UDM_GETPOS32, 0, 0));
}
break;
}
case IDC_EXCLUDESTEALTH_CHK:
{
_r_config_setboolean (L"IsExcludeStealth", _r_ctrl_isbuttonchecked (hwnd, ctrl_id));
break;
}
case IDC_EXCLUDECLASSIFYALLOW_CHK:
{
HANDLE hengine;
_r_config_setboolean (L"IsExcludeClassifyAllow", _r_ctrl_isbuttonchecked (hwnd, ctrl_id));
hengine = _wfp_getenginehandle ();
if (hengine)
_wfp_logsetoption (hengine);
break;
}
case IDC_EXCLUDEBLOCKLIST_CHK:
{
_r_config_setboolean (L"IsExcludeBlocklist", _r_ctrl_isbuttonchecked (hwnd, ctrl_id));
break;
}
case IDC_EXCLUDECUSTOM_CHK:
{
_r_config_setboolean (L"IsExcludeCustomRules", _r_ctrl_isbuttonchecked (hwnd, ctrl_id));
break;
}
}
break;
}
}
return FALSE;
}
INT _app_addwindowtabs (
_In_ HWND hwnd
)
{
INT tabs_count = 0;
_r_tab_additem (hwnd, IDC_TAB, tabs_count++, L"", I_IMAGENONE, (LPARAM)IDC_APPS_PROFILE);
_r_tab_additem (hwnd, IDC_TAB, tabs_count++, L"", I_IMAGENONE, (LPARAM)IDC_APPS_SERVICE);
// uwp apps (win8+)
_r_tab_additem (hwnd, IDC_TAB, tabs_count++, L"", I_IMAGENONE, (LPARAM)IDC_APPS_UWP);
if (!_r_config_getboolean (L"IsInternalRulesDisabled", FALSE))
{
_r_tab_additem (hwnd, IDC_TAB, tabs_count++, L"", I_IMAGENONE, (LPARAM)IDC_RULES_BLOCKLIST);
_r_tab_additem (hwnd, IDC_TAB, tabs_count++, L"", I_IMAGENONE, (LPARAM)IDC_RULES_SYSTEM);
}
_r_tab_additem (hwnd, IDC_TAB, tabs_count++, L"", I_IMAGENONE, (LPARAM)IDC_RULES_CUSTOM);
_r_tab_additem (hwnd, IDC_TAB, tabs_count++, L"", I_IMAGENONE, (LPARAM)IDC_NETWORK);
_r_tab_additem (hwnd, IDC_TAB, tabs_count++, L"", I_IMAGENONE, (LPARAM)IDC_LOG);
return tabs_count;
}
VOID _app_tabs_init (
_In_ HWND hwnd,
_In_ LONG dpi_value
)
{
RECT rect = {0};
LONG statusbar_height;
LONG rebar_height;
ULONG style;
HWND hlistview;
INT listview_id;
INT tabs_count;
statusbar_height = _r_status_getheight (hwnd, IDC_STATUSBAR);
rebar_height = _r_rebar_getheight (hwnd, IDC_REBAR);
GetClientRect (hwnd, &rect);
SetWindowPos (
config.hrebar,
NULL,
0,
0,
rect.right,
rebar_height,
SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOOWNERZORDER
);
SetWindowPos (
GetDlgItem (hwnd, IDC_TAB),
NULL
,
0,
rebar_height,
rect.right,
rect.bottom - rebar_height - statusbar_height,
SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOOWNERZORDER
);
_app_listview_loadfont (dpi_value, TRUE);
style = LVS_EX_DOUBLEBUFFER | LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP | LVS_EX_LABELTIP |
LVS_EX_HEADERINALLVIEWS | LVS_EX_HEADERDRAGDROP;
tabs_count = _app_addwindowtabs (hwnd);
for (INT i = 0; i < tabs_count; i++)
{
listview_id = _app_listview_getbytab (hwnd, i);
hlistview = GetDlgItem (hwnd, listview_id);
if (!hlistview)
continue;
_r_tab_adjustchild (hwnd, IDC_TAB, hlistview);
if (listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_RULES_CUSTOM)
{
_r_listview_setstyle (hwnd, listview_id, style | LVS_EX_CHECKBOXES, TRUE); // with checkboxes
if (listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_APPS_UWP)
{
_r_listview_addcolumn (hwnd, listview_id, 0, L"", -80, LVCFMT_LEFT);
_r_listview_addcolumn (hwnd, listview_id, 1, L"", -20, LVCFMT_RIGHT);
}
else
{
_r_listview_addcolumn (hwnd, listview_id, 0, L"", -80, LVCFMT_LEFT);
_r_listview_addcolumn (hwnd, listview_id, 1, L"", -10, LVCFMT_RIGHT);
_r_listview_addcolumn (hwnd, listview_id, 2, L"", -10, 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);
_r_listview_addgroup (hwnd, listview_id, 3, L"", 0, LVGS_COLLAPSIBLE, LVGS_COLLAPSIBLE);
_r_listview_addgroup (hwnd, listview_id, 4, L"", 0, LVGS_COLLAPSIBLE, LVGS_COLLAPSIBLE);
}
else if (listview_id == IDC_NETWORK)
{
_r_listview_setstyle (hwnd, listview_id, style, TRUE);
_r_listview_addcolumn (hwnd, listview_id, 0, L"", -20, LVCFMT_LEFT);
_r_listview_addcolumn (hwnd, listview_id, 1, L"", -10, LVCFMT_LEFT);
_r_listview_addcolumn (hwnd, listview_id, 2, L"", -10, LVCFMT_LEFT);
_r_listview_addcolumn (hwnd, listview_id, 3, L"", -10, LVCFMT_RIGHT);
_r_listview_addcolumn (hwnd, listview_id, 4, L"", -10, LVCFMT_LEFT);
_r_listview_addcolumn (hwnd, listview_id, 5, L"", -10, LVCFMT_LEFT);
_r_listview_addcolumn (hwnd, listview_id, 6, L"", -10, LVCFMT_RIGHT);
_r_listview_addcolumn (hwnd, listview_id, 7, L"", -10, LVCFMT_RIGHT);
_r_listview_addcolumn (hwnd, listview_id, 8, L"", -10, 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_setstyle (hwnd, listview_id, style, TRUE);
_r_listview_addcolumn (hwnd, listview_id, 0, L"", -10, LVCFMT_LEFT);
_r_listview_addcolumn (hwnd, listview_id, 1, L"", -10, LVCFMT_LEFT);
_r_listview_addcolumn (hwnd, listview_id, 2, L"", -10, LVCFMT_LEFT);
_r_listview_addcolumn (hwnd, listview_id, 3, L"", -10, LVCFMT_LEFT);
_r_listview_addcolumn (hwnd, listview_id, 4, L"", -10, LVCFMT_RIGHT);
_r_listview_addcolumn (hwnd, listview_id, 5, L"", -10, LVCFMT_LEFT);
_r_listview_addcolumn (hwnd, listview_id, 6, L"", -10, LVCFMT_LEFT);
_r_listview_addcolumn (hwnd, listview_id, 7, L"", -10, LVCFMT_RIGHT);
_r_listview_addcolumn (hwnd, listview_id, 8, L"", -10, LVCFMT_LEFT);
_r_listview_addcolumn (hwnd, listview_id, 9, L"", -10, LVCFMT_RIGHT);
_r_listview_addcolumn (hwnd, listview_id, 10, L"", -10, LVCFMT_LEFT);
_r_listview_addgroup (hwnd, listview_id, 0, L"", 0, LVGS_NOHEADER, LVGS_NOHEADER);
}
// add filter group
_r_listview_addgroup (hwnd, listview_id, LV_HIDDEN_GROUP_ID, L"", 0, LVGS_HIDDEN | LVGS_NOHEADER | LVGS_COLLAPSED, LVGS_HIDDEN | LVGS_NOHEADER | LVGS_COLLAPSED);
_app_listview_setfont (hwnd, listview_id);
BringWindowToTop (hlistview); // HACK!!!
}
}
VOID _app_initialize ()
{
static ULONG privileges[] = {
SE_SECURITY_PRIVILEGE,
SE_TAKE_OWNERSHIP_PRIVILEGE,
SE_INC_BASE_PRIORITY_PRIVILEGE,
SE_BACKUP_PRIVILEGE,
SE_RESTORE_PRIVILEGE,
SE_DEBUG_PRIVILEGE,
};
R_ENVIRONMENT environment;
// set privileges
_r_sys_setprocessprivilege (NtCurrentProcess (), privileges, RTL_NUMBER_OF (privileges), TRUE);
// set process priority
_r_sys_setenvironment (&environment, PROCESS_PRIORITY_CLASS_HIGH, IoPriorityHigh, MEMORY_PRIORITY_NORMAL);
_r_sys_setprocessenvironment (NtCurrentProcess (), &environment);
// initialize workqueue
_r_sys_setenvironment (&environment, THREAD_PRIORITY_ABOVE_NORMAL, IoPriorityHigh, MEMORY_PRIORITY_NORMAL);
_r_workqueue_initialize (&file_queue, 12, &environment, L"FilesQueue");
_r_workqueue_initialize (&log_queue, 6, &environment, L"PacketsQueue");
_r_workqueue_initialize (&resolver_queue, 6, &environment, L"ResolverQueue");
_r_workqueue_initialize (&resolve_notify_queue, 2, &environment, L"NotificationQueue");
_r_sys_setenvironment (&environment, THREAD_PRIORITY_HIGHEST, IoPriorityHigh, MEMORY_PRIORITY_NORMAL);
_r_workqueue_initialize (&wfp_queue, 1, &environment, L"FiltersQueue");
// static initializer
_r_sys_getsystemroot (&config.windows_dir);
_app_profile_initialize ();
config.my_path = _r_obj_createstring (_r_sys_getimagepath ());
config.svchost_path = _r_obj_concatstrings (
2,
_r_sys_getsystemdirectory ()->buffer,
PATH_SVCHOST
);
config.system_path = _r_obj_createstring (PROC_SYSTEM_NAME);
config.ntoskrnl_path = _r_obj_concatstrings (
2,
_r_sys_getsystemdirectory ()->buffer,
PATH_NTOSKRNL
);
config.my_hash = _r_str_gethash2 (config.my_path, TRUE);
config.ntoskrnl_hash = _r_str_gethash2 (config.system_path, TRUE);
config.svchost_hash = _r_str_gethash2 (config.svchost_path, TRUE);
// initialize free list
_r_freelist_initialize (&context_free_list, sizeof (ITEM_CONTEXT), 32);
_r_freelist_initialize (&listview_free_list, sizeof (ITEM_LISTVIEW_CONTEXT), 2048);
// initialize colors array
if (!colors_table)
{
colors_table = _r_obj_createhashtable (sizeof (ITEM_COLOR), NULL);
// initialize colors
config.color_invalid = _app_addcolor (IDS_HIGHLIGHT_INVALID, L"IsHighlightInvalid", TRUE, L"ColorInvalid", LV_COLOR_INVALID);
config.color_special = _app_addcolor (IDS_HIGHLIGHT_SPECIAL, L"IsHighlightSpecial", TRUE, L"ColorSpecial", LV_COLOR_SPECIAL);
config.color_signed = _app_addcolor (IDS_HIGHLIGHT_SIGNED, L"IsHighlightSigned", TRUE, L"ColorSigned", LV_COLOR_SIGNED);
config.color_pico = _app_addcolor (IDS_HIGHLIGHT_PICO, L"IsHighlightPico", TRUE, L"ColorPico", LV_COLOR_PICO);
config.color_system = _app_addcolor (IDS_HIGHLIGHT_SYSTEM, L"IsHighlightSystem", TRUE, L"ColorSystem", LV_COLOR_SYSTEM);
config.color_network = _app_addcolor (IDS_HIGHLIGHT_CONNECTION, L"IsHighlightConnection", TRUE, L"ColorConnection", LV_COLOR_CONNECTION);
}
_app_generate_credentials ();
// load default icons
_app_icons_getdefault ();
// initialize global filters array object
filter_ids = _r_obj_createarray (sizeof (GUID), NULL);
// initialize apps table
apps_table = _r_obj_createhashtablepointer (32);
// initialize rules array object
rules_list = _r_obj_createlist (&_r_obj_dereference);
// initialize rules configuration table
rules_config = _r_obj_createhashtable (sizeof (ITEM_RULE_CONFIG), &_app_dereferenceruleconfig);
// initialize log hashtable object
log_table = _r_obj_createhashtablepointer (32);
// initialize cache table
cache_information = _r_obj_createhashtablepointer (32);
cache_resolution = _r_obj_createhashtablepointer (32);
config.hnotify_evt = CreateEvent (NULL, FALSE, TRUE, NULL);
}
INT FirstDriveFromMask (
_In_ ULONG unitmask
)
{
INT i;
for (i = 0; i < PR_DEVICE_COUNT; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}
return i;
}
INT_PTR CALLBACK DlgProc (
_In_ HWND hwnd,
_In_ UINT msg,
_In_ WPARAM wparam,
_In_ LPARAM lparam
)
{
switch (msg)
{
case WM_INITDIALOG:
{
WCHAR internal_profile_version[64];
ENUM_INSTALL_TYPE install_type;
LONG dpi_value;
// initialize vars
dpi_value = _r_dc_getwindowdpi (hwnd);
_r_app_sethwnd (hwnd); // HACK!!!
_app_initialize ();
// init buffered paint
BufferedPaintInit ();
// allow drag&drop support
DragAcceptFiles (hwnd, TRUE);
// restore window position (required!)
_r_window_restoreposition (hwnd, L"window");
// initialize imagelist
_app_imagelist_init (hwnd, dpi_value);
// initialize toolbar
_app_toolbar_init (hwnd, dpi_value);
_app_toolbar_resize (hwnd, dpi_value);
// initialize tabs
_app_tabs_init (hwnd, dpi_value);
// load profile
_app_profile_load (hwnd, NULL);
// install filters
install_type = _wfp_isfiltersinstalled ();
if (install_type != INSTALL_DISABLED)
{
if (install_type == INSTALL_ENABLED_TEMPORARY)
config.is_filterstemporary = TRUE;
_app_changefilters (hwnd, TRUE, TRUE);
}
else
{
_r_status_settext (hwnd, IDC_STATUSBAR, 0, _app_getstatelocale (install_type));
}
// 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);
_r_settings_addpage (IDD_SETTINGS_EXCLUDE, IDS_TITLE_EXCLUDE);
// add blocklist to update
if (!_r_config_getboolean (L"IsInternalRulesDisabled", FALSE))
{
_r_str_fromlong64 (internal_profile_version, RTL_NUMBER_OF (internal_profile_version), profile_info.profile_internal_timestamp);
_r_update_addcomponent (L"Internal rules", L"rules_internal", internal_profile_version, profile_info.profile_path_internal, FALSE);
}
_app_network_initialize (hwnd);
// initialize tab
_app_settab_id (hwnd, _r_config_getlong (L"CurrentTab", IDC_APPS_PROFILE));
_app_fileloggingenable ();
break;
}
case RM_INITIALIZE:
{
_app_message_initialize (hwnd);
break;
}
case RM_UNINITIALIZE:
{
_app_message_uninitialize (hwnd);
break;
}
case RM_LOCALIZE:
{
_app_message_localize (hwnd);
break;
}
case RM_TASKBARCREATED:
{
ENUM_INSTALL_TYPE install_type;
install_type = _wfp_getinstalltype ();
// refresh tray icon
_r_tray_create (hwnd, &GUID_TrayIcon, RM_TRAYICON, NULL, NULL, FALSE);
_app_settrayicon (hwnd, install_type);
break;
}
case RM_CONFIG_UPDATE:
{
_app_profile_load (hwnd, NULL);
_app_changefilters (hwnd, TRUE, FALSE);
break;
}
case RM_CONFIG_RESET:
{
_r_queuedlock_acquireexclusive (&lock_rules_config);
_r_obj_clearhashtable (rules_config);
_r_queuedlock_releaseexclusive (&lock_rules_config);
_r_path_makebackup (profile_info.profile_path, TRUE);
_app_profile_initialize ();
_app_profile_load (hwnd, NULL);
_app_changefilters (hwnd, TRUE, FALSE);
break;
}
case RM_TRAYICON:
{
switch (LOWORD (lparam))
{
case NIN_KEYSELECT:
{
if (GetForegroundWindow () != hwnd)
_r_wnd_toggle (hwnd, TRUE);
break;
}
case WM_MBUTTONUP:
{
PostMessage (hwnd, WM_COMMAND, MAKEWPARAM (IDM_TRAY_LOGSHOW, 0), 0);
break;
}
case WM_LBUTTONUP:
{
if (_r_config_getboolean (L"IsTrayIconSingleClick", TRUE))
{
_r_wnd_toggle (hwnd, FALSE);
}
else
{
SetForegroundWindow (hwnd);
}
break;
}
case WM_LBUTTONDBLCLK:
{
if (!_r_config_getboolean (L"IsTrayIconSingleClick", TRUE))
_r_wnd_toggle (hwnd, FALSE);
break;
}
case WM_CONTEXTMENU:
{
_app_message_traycontextmenu (hwnd);
break;
}
}
break;
}
case WM_NOTIFICATION:
{
PITEM_LOG ptr_log;
HWND hnotify;
if (_r_queuedlock_tryacquireexclusive (&lock_notify))
{
ptr_log = _r_obj_reference ((PITEM_LOG)lparam);
hnotify = _app_notify_getwindow (ptr_log);
_r_queuedlock_releaseexclusive (&lock_notify);
SetWindowLongPtr (hwnd, DWLP_MSGRESULT, (LONG_PTR)hnotify);
return (INT_PTR)hnotify;
}
break;
}
case WM_CLOSE:
{
LPCWSTR cfg_name;
UINT locale_id;
if (_wfp_isfiltersinstalled ())
{
if (_app_istimersactive ())
{
cfg_name = L"ConfirmExitTimer";
locale_id = IDS_QUESTION_TIMER;
}
else
{
cfg_name = L"ConfirmExit2";
locale_id = IDS_QUESTION_EXIT;
}
if (!_r_show_confirmmessage (hwnd, NULL, _r_locale_getstring (locale_id), cfg_name))
{
SetWindowLongPtr (hwnd, DWLP_MSGRESULT, TRUE);
return TRUE;
}
}
DestroyWindow (hwnd);
break;
}
case WM_DESTROY:
{
HANDLE hengine;
_app_loginit (FALSE);
_r_config_setlong (L"CurrentTab", _app_listview_getcurrent (hwnd));
if (_r_queuedlock_islocked (&lock_apply))
{
_r_workqueue_waitforfinish (&wfp_queue);
_r_workqueue_destroy (&wfp_queue);
}
_r_tray_destroy (hwnd, &GUID_TrayIcon);
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;
HDROP hdrop;
ULONG_PTR app_hash;
ULONG numfiles;
ULONG length;
hdrop = (HDROP)wparam;
numfiles = DragQueryFile (hdrop, UINT32_MAX, NULL, 0);
app_hash = 0;
for (ULONG i = 0; i < numfiles; i++)
{
length = DragQueryFile (hdrop, i, NULL, 0);
string = _r_obj_createstring_ex (NULL, length * sizeof (WCHAR));
if (DragQueryFile (hdrop, i, string->buffer, length + 1))
app_hash = _app_addapplication (hwnd, DATA_UNKNOWN, string, NULL, NULL);
_r_obj_dereference (string);
}
DragFinish (hdrop);
_app_profile_save ();
if (!app_hash)
break;
_app_listview_updateby_param (hwnd, app_hash, PR_SETITEM_UPDATE, TRUE);
_app_listview_showitemby_param (hwnd, app_hash, TRUE);
break;
}
case WM_DPICHANGED:
{
_r_wnd_message_dpichanged (hwnd, wparam, lparam);
_app_message_dpichanged (hwnd, LOWORD (wparam));
break;
}
case WM_THEMECHANGED:
{
LONG dpi_value;
dpi_value = _r_dc_getwindowdpi (hwnd);
_app_windowloadfont (dpi_value);
_app_listview_loadfont (dpi_value, TRUE);
_app_listview_updateby_id (hwnd, DATA_LISTVIEW_CURRENT, PR_UPDATE_TYPE | PR_UPDATE_FORCE);
SendMessage (hwnd, WM_SIZE, 0, 0);
break;
}
case WM_SIZE:
{
RECT rect;
LONG dpi_value;
if (GetClientRect (hwnd, &rect))
{
dpi_value = _r_dc_getwindowdpi (hwnd);
_app_window_resize (hwnd, &rect, dpi_value);
}
break;
}
case WM_GETMINMAXINFO:
{
LPMINMAXINFO minmax;
R_SIZE point = {0};
LONG dpi_value;
minmax = (LPMINMAXINFO)lparam;
point.cx = 320;
point.cy = 120;
dpi_value = _r_dc_getwindowdpi (hwnd);
_r_dc_getsizedpivalue (&point, dpi_value, TRUE);
minmax->ptMinTrackSize.x = point.cx;
minmax->ptMinTrackSize.y = point.cy;
break;
}
case WM_NOTIFY:
{
LPNMHDR nmlp;
nmlp = (LPNMHDR)lparam;
switch (nmlp->code)
{
case TCN_SELCHANGING:
{
HWND hlistview;
INT listview_id;
listview_id = _app_listview_getcurrent (hwnd);
if (!listview_id)
break;
hlistview = GetDlgItem (hwnd, listview_id);
if (!hlistview)
break;
ShowWindow (hlistview, SW_HIDE);
break;
}
case TCN_SELCHANGE:
{
HWND hlistview;
INT listview_id;
listview_id = _app_listview_getcurrent (hwnd);
if (!listview_id)
break;
hlistview = GetDlgItem (hwnd, listview_id);
if (!hlistview)
break;
_app_search_applyfilter (hwnd, listview_id, config.search_string);
_app_listview_updateby_id (hwnd, listview_id, PR_UPDATE_FORCE | PR_UPDATE_NORESIZE);
ShowWindow (hlistview, SW_SHOWNA);
if (_r_wnd_isvisible_ex (hwnd)) // HACK!!!
SetFocus (hlistview);
_app_listview_resize (hwnd, listview_id);
break;
}
case NM_CUSTOMDRAW:
{
LONG_PTR result;
result = _app_message_custdraw (hwnd, (LPNMLVCUSTOMDRAW)lparam);
SetWindowLongPtr (hwnd, DWLP_MSGRESULT, result);
return result;
}
case LVN_INSERTITEM:
{
LPNMLISTVIEW lpnmlv;
PITEM_LISTVIEW_CONTEXT context;
INT listview_id;
lpnmlv = (LPNMLISTVIEW)lparam;
listview_id = (INT)(INT_PTR)lpnmlv->hdr.idFrom;
if (!(listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_LOG))
break;
if (_r_obj_isstringempty (config.search_string))
break;
context = (PITEM_LISTVIEW_CONTEXT)_r_listview_getitemlparam (hwnd, listview_id, lpnmlv->iItem);
if (!context)
break;
_app_search_applyfilteritem (hwnd, listview_id, lpnmlv->iItem, context, config.search_string);
break;
}
case LVN_DELETEITEM:
{
LPNMLISTVIEW lpnmlv;
PITEM_LISTVIEW_CONTEXT context;
INT listview_id;
lpnmlv = (LPNMLISTVIEW)lparam;
listview_id = (INT)(INT_PTR)lpnmlv->hdr.idFrom;
if (!(listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_LOG))
break;
context = (PITEM_LISTVIEW_CONTEXT)lpnmlv->lParam;
if (!context)
break;
_app_listview_destroycontext (context);
break;
}
case LVN_COLUMNCLICK:
{
LPNMLISTVIEW lpnmlv;
INT ctrl_id;
lpnmlv = (LPNMLISTVIEW)lparam;
ctrl_id = (INT)(INT_PTR)lpnmlv->hdr.idFrom;
_app_listview_sort_ex (hwnd, ctrl_id, lpnmlv->iSubItem, TRUE);
break;
}
case LVN_GETINFOTIP:
{
LPNMLVGETINFOTIP lpnmlv;
PR_STRING string;
INT listview_id;
lpnmlv = (LPNMLVGETINFOTIP)lparam;
listview_id = (INT)(INT_PTR)lpnmlv->hdr.idFrom;
lparam = _app_listview_getitemcontext (hwnd, listview_id, lpnmlv->iItem);
string = _app_gettooltipbylparam (hwnd, listview_id, lparam);
if (!string)
break;
_r_str_copy (lpnmlv->pszText, lpnmlv->cchTextMax, string->buffer);
_r_obj_dereference (string);
break;
}
case LVN_ITEMCHANGING:
{
LPNMLISTVIEW lpnmlv;
INT listview_id;
ULONG_PTR app_hash;
lpnmlv = (LPNMLISTVIEW)lparam;
listview_id = (INT)(INT_PTR)lpnmlv->hdr.idFrom;
if (_app_listview_islocked (hwnd, listview_id))
break;
if (!(lpnmlv->uChanged & LVIF_STATE))
break;
if (!lpnmlv->lParam)
break;
if ((listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_APPS_UWP))
{
app_hash = _app_listview_getcontextcode (lpnmlv->lParam);
if ((lpnmlv->uNewState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK (1))
{
if (app_hash == config.my_hash)
{
if (!_r_show_confirmmessage (
hwnd,
L"WARNING!",
SZ_WARNING_ME,
NULL))
{
SetWindowLongPtr (hwnd, DWLP_MSGRESULT, TRUE);
return TRUE;
}
}
}
else if ((lpnmlv->uNewState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK (2))
{
if (app_hash == config.svchost_hash)
{
if (!_r_show_confirmmessage (
hwnd,
L"WARNING!",
SZ_WARNING_SVCHOST,
NULL))
{
SetWindowLongPtr (hwnd, DWLP_MSGRESULT, TRUE);
return TRUE;
}
}
else if (app_hash != config.my_hash)
{
if (!_r_show_confirmmessage (
hwnd,
NULL,
_r_locale_getstring (IDS_QUESTION_ALLOW),
L"ConfirmAllow"))
{
SetWindowLongPtr (hwnd, DWLP_MSGRESULT, TRUE);
return TRUE;
}
}
}
}
break;
}
case LVN_ITEMCHANGED:
{
LPNMLISTVIEW lpnmlv;
HANDLE hengine;
PR_LIST rules;
PITEM_APP ptr_app;
PITEM_RULE ptr_rule;
ULONG_PTR app_hash;
ULONG_PTR rule_idx;
INT listview_id;
BOOLEAN is_changed;
BOOLEAN is_enabled;
lpnmlv = (LPNMLISTVIEW)lparam;
listview_id = (INT)(INT_PTR)lpnmlv->hdr.idFrom;
if ((lpnmlv->uChanged & LVIF_STATE) == 0)
break;
if ((lpnmlv->uNewState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK (1) ||
((lpnmlv->uNewState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK (2)))
{
if (_app_listview_islocked (hwnd, (INT)(INT_PTR)lpnmlv->hdr.idFrom))
break;
is_changed = FALSE;
is_enabled = (lpnmlv->uNewState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK (2);
if (listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_APPS_UWP)
{
app_hash = _app_listview_getcontextcode (lpnmlv->lParam);
ptr_app = _app_getappitem (app_hash);
if (!ptr_app)
break;
if (ptr_app->is_enabled != is_enabled)
{
ptr_app->is_enabled = is_enabled;
_app_listview_lock (hwnd, listview_id, TRUE);
_app_setappiteminfo (hwnd, listview_id, lpnmlv->iItem, ptr_app);
_app_listview_lock (hwnd, listview_id, FALSE);
if (is_enabled)
_app_notify_freeobject (NULL, ptr_app);
if (!is_enabled && _app_istimerset (ptr_app))
_app_timer_reset (hwnd, ptr_app);
if (_wfp_isfiltersinstalled ())
{
hengine = _wfp_getenginehandle ();
if (hengine)
{
rules = _r_obj_createlist (NULL);
_r_obj_addlistitem (rules, ptr_app);
_wfp_create3filters (hengine, rules, DBG_ARG, FALSE);
_r_obj_dereference (rules);
}
}
is_changed = TRUE;
}
_r_obj_dereference (ptr_app);
}
else if (listview_id >= IDC_RULES_BLOCKLIST && listview_id <= IDC_RULES_CUSTOM)
{
rule_idx = _app_listview_getcontextcode (lpnmlv->lParam);
ptr_rule = _app_getrulebyid (rule_idx);
if (!ptr_rule)
break;
if (ptr_rule->is_enabled != is_enabled)
{
_app_listview_lock (hwnd, listview_id, TRUE);
_app_ruleenable (ptr_rule, is_enabled, TRUE);
_app_setruleiteminfo (hwnd, listview_id, lpnmlv->iItem, ptr_rule, TRUE);
_app_listview_lock (hwnd, listview_id, FALSE);
if (_wfp_isfiltersinstalled ())
{
hengine = _wfp_getenginehandle ();
if (hengine)
{
rules = _r_obj_createlist (NULL);
_r_obj_addlistitem (rules, ptr_rule);
_wfp_create4filters (hengine, rules, DBG_ARG, FALSE);
_r_obj_dereference (rules);
}
}
is_changed = TRUE;
}
_r_obj_dereference (ptr_rule);
}
if (is_changed)
{
_app_listview_updateby_id (hwnd, listview_id, 0);
_app_profile_save ();
}
}
break;
}
case LVN_GETDISPINFO:
{
LPNMLVDISPINFOW lpnmlv;
INT listview_id;
lpnmlv = (LPNMLVDISPINFOW)lparam;
listview_id = (INT)(INT_PTR)lpnmlv->hdr.idFrom;
_app_message_displayinfo (hwnd, listview_id, lpnmlv);
break;
}
case NM_DBLCLK:
{
LPNMITEMACTIVATE lpnmlv;
LPNMMOUSE lpmouse;
INT command_id;
INT listview_id;
lpnmlv = (LPNMITEMACTIVATE)lparam;
if (lpnmlv->iItem == -1)
break;
listview_id = (INT)(INT_PTR)lpnmlv->hdr.idFrom;
command_id = 0;
if (listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_LOG)
{
command_id = IDM_PROPERTIES;
}
else if (listview_id == IDC_STATUSBAR)
{
lpmouse = (LPNMMOUSE)lparam;
if (lpmouse->dwItemSpec == 0)
{
command_id = IDM_SELECT_ALL;
}
else if (lpmouse->dwItemSpec == 1)
{
command_id = IDM_PURGE_UNUSED;
}
else if (lpmouse->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;
if (nmlp->idFrom)
{
lpnmlv = (LPNMITEMACTIVATE)lparam;
_app_message_contextmenu (hwnd, lpnmlv);
}
else
{
_app_message_contextmenu_columns (hwnd, nmlp);
}
break;
}
}
break;
}
case WM_POWERBROADCAST:
{
if (_wfp_isfiltersapplying ())
break;
switch (wparam)
{
case PBT_APMSUSPEND:
{
HANDLE hengine;
_app_logclear_ui (hwnd);
if (config.is_neteventset)
{
hengine = _wfp_getenginehandle ();
if (hengine)
_wfp_logunsubscribe (hengine);
}
SetWindowLongPtr (hwnd, DWLP_MSGRESULT, TRUE);
return TRUE;
}
case PBT_APMRESUMECRITICAL:
case PBT_APMRESUMESUSPEND:
{
HANDLE hengine;
if (config.is_neteventset)
{
hengine = _wfp_getenginehandle ();
if (!hengine)
break;
_wfp_logsubscribe (hwnd, hengine);
}
SetWindowLongPtr (hwnd, DWLP_MSGRESULT, TRUE);
return TRUE;
}
}
break;
}
case WM_DEVICECHANGE:
{
switch (wparam)
{
case DBT_DEVICEARRIVAL:
{
PDEV_BROADCAST_HDR lbhdr;
PDEV_BROADCAST_VOLUME lpdbv;
BOOLEAN is_appexist;
if (_wfp_isfiltersapplying () || !_wfp_isfiltersinstalled ())
break;
lbhdr = (PDEV_BROADCAST_HDR)lparam;
if (lbhdr && lbhdr->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
lpdbv = (PDEV_BROADCAST_VOLUME)lparam;
is_appexist = _app_isapphavedrive (FirstDriveFromMask (lpdbv->dbcv_unitmask));
if (is_appexist)
_app_changefilters (hwnd, TRUE, FALSE);
}
break;
}
}
break;
}
case WM_COMMAND:
{
INT ctrl_id = LOWORD (wparam);
INT notify_code = HIWORD (wparam);
if (notify_code == EN_CHANGE)
{
PR_STRING string;
INT listview_id;
if (ctrl_id != IDC_SEARCH)
break;
listview_id = _app_listview_getcurrent (hwnd);
string = _r_ctrl_getstring (config.hrebar, IDC_SEARCH);
_r_obj_movereference (&config.search_string, string);
_app_search_applyfilter (hwnd, listview_id, string);
return FALSE;
}
else if (notify_code == 0)
{
if (ctrl_id >= IDX_LANGUAGE && ctrl_id <= IDX_LANGUAGE + (INT)(INT_PTR)_r_locale_getcount () + 1)
{
HMENU hmenu;
HMENU hsubmenu;
hmenu = GetMenu (hwnd);
if (hmenu)
{
hsubmenu = GetSubMenu (GetSubMenu (hmenu, 2), LANG_MENU);
if (hsubmenu)
_r_locale_apply (hsubmenu, ctrl_id, IDX_LANGUAGE);
}
return FALSE;
}
else if (ctrl_id >= IDX_RULES_SPECIAL && ctrl_id <= (IDX_RULES_SPECIAL + (INT)(INT_PTR)_r_obj_getlistsize (rules_list)))
{
_app_command_idtorules (hwnd, ctrl_id);
return FALSE;
}
else if (ctrl_id >= IDX_TIMER && ctrl_id <= (IDX_TIMER + (RTL_NUMBER_OF (timer_array) - 1)))
{
_app_command_idtotimers (hwnd, ctrl_id);
return FALSE;
}
}
switch (ctrl_id)
{
case IDCANCEL: // process Esc key
{
if (GetFocus () == config.hsearchbar)
{
_r_ctrl_setstring (config.hsearchbar, 0, L"");
SetFocus (hwnd);
break;
}
// fall through
}
case IDM_TRAY_SHOW:
{
_r_wnd_toggle (hwnd, FALSE);
break;
}
case IDM_SETTINGS:
case IDM_TRAY_SETTINGS:
{
_r_settings_createwindow (hwnd, &SettingsProc, 0);
break;
}
case IDM_EXIT:
case IDM_TRAY_EXIT:
{
PostMessage (hwnd, WM_CLOSE, 0, 0);
break;
}
case IDM_WEBSITE:
case IDM_TRAY_WEBSITE:
{
_r_shell_opendefault (_r_app_getwebsite_url ());
break;
}
case IDM_CHECKUPDATES:
{
_r_update_check (hwnd);
break;
}
case IDM_DONATE:
{
_r_shell_opendefault (_r_app_getdonate_url ());
break;
}
case IDM_ABOUT:
case IDM_TRAY_ABOUT:
{
_r_show_aboutmessage (hwnd);
break;
}
case IDM_IMPORT:
{
static COMDLG_FILTERSPEC filters[] = {
L"Profile files (*.xml)", L"*.xml",
L"All files (*.*)", L"*.*",
};
R_FILE_DIALOG file_dialog;
PR_STRING path;
if (_r_filedialog_initialize (&file_dialog, PR_FILEDIALOG_OPENFILE))
{
_r_filedialog_setfilter (&file_dialog, filters, RTL_NUMBER_OF (filters));
_r_filedialog_setpath (&file_dialog, XML_PROFILE_FILE);
if (_r_filedialog_show (hwnd, &file_dialog))
{
path = _r_filedialog_getpath (&file_dialog);
if (path)
{
if (_app_profile_load (hwnd, path) == STATUS_SUCCESS)
{
_app_profile_save ();
_app_changefilters (hwnd, TRUE, FALSE);
}
_r_obj_dereference (path);
}
}
_r_filedialog_destroy (&file_dialog);
}
break;
}
case IDM_EXPORT:
{
static COMDLG_FILTERSPEC filters[] = {
L"Profile files (*.xml)", L"*.xml",
L"All files (*.*)", L"*.*",
};
R_FILE_DIALOG file_dialog;
R_ERROR_INFO error_info;
PR_STRING path;
NTSTATUS status;
if (_r_filedialog_initialize (&file_dialog, PR_FILEDIALOG_SAVEFILE))
{
_r_filedialog_setfilter (&file_dialog, filters, RTL_NUMBER_OF (filters));
_r_filedialog_setpath (&file_dialog, XML_PROFILE_FILE);
if (_r_filedialog_show (hwnd, &file_dialog))
{
path = _r_filedialog_getpath (&file_dialog);
if (path)
{
_app_profile_save ();
// added information for export profile failure (issue #707)
status = _r_fs_copyfile (profile_info.profile_path->buffer, path->buffer);
if (!NT_SUCCESS (status))
{
_r_error_initialize (&error_info, NULL, path->buffer, NULL);
_r_show_errormessage (hwnd, NULL, status, &error_info);
}
_r_obj_dereference (path);
}
}
_r_filedialog_destroy (&file_dialog);
}
break;
}
case IDM_ALWAYSONTOP_CHK:
{
BOOLEAN new_val;
new_val = !_r_config_getboolean (L"AlwaysOnTop", FALSE);
_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;
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_listview_resize (hwnd, _app_listview_getcurrent (hwnd));
break;
}
case IDM_SHOWFILENAMESONLY_CHK:
{
INT listview_id;
BOOLEAN new_val;
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);
listview_id = _app_listview_getcurrent (hwnd);
_r_listview_redraw (hwnd, listview_id, -1);
_app_listview_sort (hwnd, listview_id);
break;
}
case IDM_SHOWSEARCHBAR_CHK:
{
BOOLEAN new_val;
new_val = !_r_config_getboolean (L"IsShowSearchBar", TRUE);
_r_menu_checkitem (GetMenu (hwnd), ctrl_id, 0, MF_BYCOMMAND, new_val);
_r_config_setboolean (L"IsShowSearchBar", new_val);
if (config.hsearchbar)
{
_app_search_setvisible (hwnd, config.hsearchbar);
PostMessage (hwnd, WM_SIZE, 0, 0);
}
break;
}
case IDM_VIEW_DETAILS:
case IDM_VIEW_ICON:
case IDM_VIEW_TILE:
{
LONG 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_DETAILS, IDM_VIEW_TILE, MF_BYCOMMAND, ctrl_id);
_r_config_setlong (L"ViewType", view_type);
_app_listview_updateby_id (hwnd, DATA_LISTVIEW_CURRENT, PR_UPDATE_TYPE);
break;
}
case IDM_SIZE_SMALL:
case IDM_SIZE_LARGE:
case IDM_SIZE_EXTRALARGE:
{
LONG 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_SMALL;
}
_r_menu_checkitem (GetMenu (hwnd), IDM_SIZE_SMALL, IDM_SIZE_EXTRALARGE, MF_BYCOMMAND, ctrl_id);
_r_config_setlong (L"IconSize", icon_size);
_app_listview_updateby_id (hwnd, DATA_LISTVIEW_CURRENT, PR_UPDATE_TYPE);
break;
}
case IDM_ICONSISHIDDEN:
{
PITEM_APP ptr_app = NULL;
ULONG_PTR enum_key;
BOOLEAN new_val;
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);
if (!new_val)
{
_r_queuedlock_acquireshared (&lock_apps);
enum_key = 0;
while (_r_obj_enumhashtablepointer (apps_table, &ptr_app, NULL, &enum_key))
{
if (ptr_app->real_path)
_app_queue_fileinformation (ptr_app->real_path, ptr_app->app_hash, ptr_app->type, _app_listview_getbytype (ptr_app->type));
}
_r_queuedlock_releaseshared (&lock_apps);
}
break;
}
case IDM_FONT:
{
_app_command_selectfont (hwnd);
break;
}
case IDM_FIND:
{
if (!config.hsearchbar)
break;
if (!_r_wnd_isvisible (config.hsearchbar))
break;
SetFocus (config.hsearchbar);
SendMessage (config.hsearchbar, EM_SETSEL, 0, (LPARAM)-1);
break;
}
case IDM_REFRESH:
{
if (_wfp_isfiltersapplying ())
break;
_app_profile_load (hwnd, NULL);
_app_changefilters (hwnd, TRUE, FALSE);
break;
}
case IDM_LOADONSTARTUP_CHK:
case IDM_STARTMINIMIZED_CHK:
case IDM_SKIPUACWARNING_CHK:
case IDM_CHECKUPDATES_CHK:
case IDM_RULE_BLOCKOUTBOUND:
case IDM_RULE_BLOCKINBOUND:
case IDM_RULE_ALLOWLOOPBACK:
case IDM_RULE_ALLOW6TO4:
case IDM_RULE_ALLOWWINDOWSUPDATE:
case IDM_PROFILETYPE_PLAIN:
case IDM_PROFILETYPE_COMPRESSED:
case IDM_PROFILETYPE_ENCRYPTED:
case IDM_USENETWORKRESOLUTION_CHK:
case IDM_USEAPPMONITOR_CHK:
{
_app_config_apply (hwnd, NULL, 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;
LONG new_state;
hmenu = GetMenu (hwnd);
if (!hmenu)
break;
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);
new_state = _r_calc_clamp (ctrl_id - IDM_BLOCKLIST_SPY_DISABLE, 0, 2);
_r_config_setlong (L"BlocklistSpyState", new_state);
_app_ruleblocklistset (hwnd, new_state, -1, -1, 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);
new_state = _r_calc_clamp (ctrl_id - IDM_BLOCKLIST_UPDATE_DISABLE, 0, 2);
_r_config_setlong (L"BlocklistUpdateState", new_state);
_app_ruleblocklistset (hwnd, -1, new_state, -1, 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);
new_state = _r_calc_clamp (ctrl_id - IDM_BLOCKLIST_EXTRA_DISABLE, 0, 2);
_r_config_setlong (L"BlocklistExtraState", new_state);
_app_ruleblocklistset (hwnd, -1, -1, new_state, TRUE);
}
break;
}
case IDM_TRAY_ENABLELOG_CHK:
{
BOOLEAN new_val;
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;
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:
{
HWND hnotify;
BOOLEAN new_val;
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);
hnotify = _app_notify_getwindow (NULL);
if (hnotify)
_app_notify_refresh (hnotify);
break;
}
case IDM_TRAY_ENABLENOTIFICATIONSSOUND_CHK:
{
BOOLEAN new_val;
new_val = !_r_config_getboolean (L"IsNotificationsSound", TRUE);
_r_config_setboolean (L"IsNotificationsSound", new_val);
break;
}
case IDM_TRAY_NOTIFICATIONFULLSCREENSILENTMODE_CHK:
{
BOOLEAN new_val;
new_val = !_r_config_getboolean (L"IsNotificationsFullscreenSilentMode", TRUE);
_r_config_setboolean (L"IsNotificationsFullscreenSilentMode", new_val);
break;
}
case IDM_TRAY_NOTIFICATIONONTRAY_CHK:
{
HWND hnotify;
BOOLEAN new_val;
new_val = !_r_config_getboolean (L"IsNotificationsOnTray", FALSE);
_r_config_setboolean (L"IsNotificationsOnTray", new_val);
hnotify = _app_notify_getwindow (NULL);
if (hnotify)
_app_notify_setposition (hnotify, TRUE);
break;
}
case IDM_TRAY_LOGSHOW:
{
_app_command_logshow (hwnd);
break;
}
case IDM_TRAY_LOGCLEAR:
case IDM_LOGCLEAR:
{
_app_command_logclear (hwnd);
break;
}
case IDM_TRAY_LOGSHOW_ERR:
{
_app_command_logerrshow (hwnd);
break;
}
case IDM_TRAY_LOGCLEAR_ERR:
{
_app_command_logerrclear (hwnd);
break;
}
case IDM_TRAY_START:
{
BOOLEAN is_filtersinstalled;
if (_wfp_isfiltersapplying ())
break;
is_filtersinstalled = !_wfp_isfiltersinstalled ();
if (_app_installmessage (hwnd, is_filtersinstalled))
_app_changefilters (hwnd, is_filtersinstalled, TRUE);
break;
}
case IDM_ADD_FILE:
{
static COMDLG_FILTERSPEC filters[] = {
L"Executable files (*.exe)", L"*.exe",
L"All files (*.*)", L"*.*",
};
R_FILE_DIALOG file_dialog;
PR_STRING path;
ULONG_PTR app_hash;
if (_r_filedialog_initialize (&file_dialog, PR_FILEDIALOG_OPENFILE))
{
_r_filedialog_setfilter (&file_dialog, filters, RTL_NUMBER_OF (filters));
if (_r_filedialog_show (hwnd, &file_dialog))
{
path = _r_filedialog_getpath (&file_dialog);
if (path)
{
app_hash = _app_addapplication (hwnd, DATA_UNKNOWN, path, NULL, NULL);
if (app_hash)
{
_app_listview_updateby_param (hwnd, app_hash, PR_SETITEM_UPDATE, TRUE);
_app_listview_showitemby_param (hwnd, app_hash, TRUE);
_app_profile_save ();
}
}
}
_r_filedialog_destroy (&file_dialog);
}
break;
}
case IDM_DISABLENOTIFICATIONS:
case IDM_DISABLETIMER:
{
_app_command_disable (hwnd, ctrl_id);
break;
}
case IDM_COPY:
case IDM_COPY2:
{
_app_command_copy (hwnd, ctrl_id, (INT)lparam);
break;
}
case IDM_EXPLORE:
{
PITEM_APP ptr_app;
PITEM_NETWORK ptr_network;
PITEM_LOG ptr_log;
ULONG_PTR hash_code;
INT listview_id;
INT item_id = -1;
listview_id = _app_listview_getcurrent (hwnd);
if (listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_APPS_UWP)
{
while ((item_id = _r_listview_getnextselected (hwnd, listview_id, item_id)) != -1)
{
hash_code = _app_listview_getitemcontext (hwnd, listview_id, item_id);
ptr_app = _app_getappitem (hash_code);
if (ptr_app)
{
if (ptr_app->real_path)
{
if (_app_isappvalidpath (ptr_app->real_path))
_r_shell_showfile (ptr_app->real_path->buffer);
}
_r_obj_dereference (ptr_app);
}
}
}
else if (listview_id == IDC_NETWORK)
{
while ((item_id = _r_listview_getnextselected (hwnd, listview_id, item_id)) != -1)
{
hash_code = _app_listview_getitemcontext (hwnd, listview_id, item_id);
ptr_network = _app_network_getitem (hash_code);
if (ptr_network)
{
if (ptr_network->path)
{
if (_app_isappvalidpath (ptr_network->path))
_r_shell_showfile (ptr_network->path->buffer);
}
_r_obj_dereference (ptr_network);
}
}
}
else if (listview_id == IDC_LOG)
{
while ((item_id = _r_listview_getnextselected (hwnd, listview_id, item_id)) != -1)
{
hash_code = _app_listview_getitemcontext (hwnd, listview_id, item_id);
ptr_log = _app_getlogitem (hash_code);
if (ptr_log)
{
if (ptr_log->path)
{
if (_app_isappvalidpath (ptr_log->path))
_r_shell_showfile (ptr_log->path->buffer);
}
_r_obj_dereference (ptr_log);
}
}
}
break;
}
case IDM_OPENRULESEDITOR:
{
_app_command_openeditor (hwnd);
break;
}
case IDM_CHECK:
case IDM_UNCHECK:
{
_app_command_checkbox (hwnd, ctrl_id);
break;
}
case IDM_DELETE:
{
_app_command_delete (hwnd);
break;
}
case IDM_PROPERTIES:
{
_app_command_properties (hwnd);
break;
}
case IDM_PURGE_UNUSED:
{
_app_command_purgeunused (hwnd);
break;
}
case IDM_PURGE_TIMERS:
{
_app_command_purgetimers (hwnd);
break;
}
case IDM_SELECT_ALL:
{
INT listview_id;
listview_id = _app_listview_getcurrent (hwnd);
if (!listview_id)
break;
if (GetFocus () == GetDlgItem (hwnd, listview_id))
_r_listview_setitemstate (hwnd, listview_id, -1, LVIS_SELECTED, LVIS_SELECTED);
break;
}
case IDM_ZOOM:
{
ShowWindow (hwnd, IsZoomed (hwnd) ? SW_RESTORE : SW_MAXIMIZE);
break;
}
case IDM_TAB_NEXT:
case IDM_TAB_PREV:
{
INT tabs_count;
INT item_id;
tabs_count = _r_tab_getitemcount (hwnd, IDC_TAB);
if (!tabs_count)
break;
item_id = _r_tab_getcurrentitem (hwnd, IDC_TAB);
if (item_id == -1)
break;
if (ctrl_id == IDM_TAB_NEXT)
{
item_id += 1;
if (item_id >= tabs_count)
item_id = 0;
}
else
{
item_id -= 1;
if (item_id == -1)
item_id = tabs_count - 1;
}
_r_tab_selectitem (hwnd, IDC_TAB, item_id);
break;
}
}
break;
}
}
return FALSE;
}
BOOLEAN NTAPI _app_parseargs (
_In_ R_CMDLINE_INFO_CLASS info_class
)
{
HANDLE hengine;
_app_initialize ();
hengine = _wfp_getenginehandle ();
if (!hengine)
return FALSE;
switch (info_class)
{
case CmdlineHelp:
{
_r_show_message (
NULL,
MB_OK | MB_ICONINFORMATION,
L"Available options:",
L"simplewall.exe -install - enable filtering.\r\n"
L"simplewall.exe -install -temp - enable filtering until reboot.\r\n"
L"simplewall.exe -install -silent - enable filtering without prompt.\r\n"
L"simplewall.exe -uninstall - remove all installed filters.\r\n"
L"simplewall.exe -help - show this message."
);
return TRUE;
}
case CmdlineInstall:
{
if (_r_sys_getopt (_r_sys_getimagecommandline (), L"silent", NULL) || _app_installmessage (NULL, TRUE))
{
if (_r_sys_getopt (_r_sys_getimagecommandline (), L"temp", NULL))
config.is_filterstemporary = TRUE;
_app_profile_initialize ();
_app_profile_load (NULL, NULL);
if (_wfp_initialize (NULL, hengine))
_wfp_installfilters (hengine);
_wfp_uninitialize (hengine, FALSE);
}
return TRUE;
}
case CmdlineUninstall:
{
if (_wfp_isfiltersinstalled () && _app_installmessage (NULL, FALSE))
{
_wfp_destroyfilters (hengine);
_wfp_uninitialize (hengine, TRUE);
}
return TRUE;
}
}
return FALSE;
}
INT APIENTRY wWinMain (
_In_ HINSTANCE hinst,
_In_opt_ HINSTANCE prev_hinst,
_In_ LPWSTR cmdline,
_In_ INT show_cmd
)
{
HWND hwnd;
ULONG result;
if (!_r_app_initialize (&_app_parseargs))
return ERROR_APP_INIT_FAILURE;
hwnd = _r_app_createwindow (hinst, MAKEINTRESOURCE (IDD_MAIN), MAKEINTRESOURCE (IDI_MAIN), &DlgProc);
if (!hwnd)
return ERROR_APP_INIT_FAILURE;
result = _r_wnd_message_callback (hwnd, MAKEINTRESOURCE (IDA_MAIN));
return result;
}