From 0dcd1790865af8f41bfa0f7c53fd078047648df9 Mon Sep 17 00:00:00 2001 From: henrypp Date: Wed, 15 Jul 2020 18:45:47 +0600 Subject: [PATCH] code refactored --- src/editor.cpp | 395 +++++---- src/main.cpp | 1803 +++++++++++++++++++++++------------------ src/notifications.cpp | 479 ++++++----- src/profile.cpp | 1531 ++++++++++++++++++---------------- src/profile.hpp | 12 +- src/wfp.cpp | 679 ++++++++-------- src/wfp.hpp | 14 +- 7 files changed, 2670 insertions(+), 2243 deletions(-) diff --git a/src/editor.cpp b/src/editor.cpp index cab974bd..875a689c 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -20,15 +20,23 @@ INT_PTR CALLBACK AddRuleProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) _r_wnd_center (hwnd, GetParent (hwnd)); // localize window - SetWindowText (hwnd, app.LocaleString (IDS_RULE, NULL).GetString ()); + SetWindowText (hwnd, app.LocaleString (IDS_RULE)); if (pcontext->item_id != INVALID_INT) - SetDlgItemText (hwnd, IDC_RULE_ID, _r_listview_getitemtext (pcontext->hwnd, pcontext->listview_id, pcontext->item_id, 0).GetString ()); + { + PR_STRING itemText = _r_listview_getitemtext (pcontext->hwnd, pcontext->listview_id, pcontext->item_id, 0); - SetDlgItemText (hwnd, IDC_RULE_HINT, L"eg. 192.168.0.1\r\neg. [fe80::]\r\neg. 192.168.0.1:443\r\neg. [fe80::]:443\r\neg. 192.168.0.1-192.168.0.255\r\neg. 192.168.0.1-192.168.0.255:443\r\neg. 192.168.0.0/16\r\neg. fe80::/10\r\neg. 80\r\neg. 443\r\neg. 20-21\r\neg. 49152-65534"); + if (itemText) + { + _r_ctrl_settext (hwnd, IDC_RULE_ID, itemText->Buffer); + _r_obj_dereference (itemText); + } + } - SetDlgItemText (hwnd, IDC_SAVE, app.LocaleString (pcontext->item_id != INVALID_INT ? IDS_SAVE : IDS_ADD, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_CLOSE, app.LocaleString (IDS_CLOSE, NULL).GetString ()); + _r_ctrl_settext (hwnd, IDC_RULE_HINT, L"eg. 192.168.0.1\r\neg. [fe80::]\r\neg. 192.168.0.1:443\r\neg. [fe80::]:443\r\neg. 192.168.0.1-192.168.0.255\r\neg. 192.168.0.1-192.168.0.255:443\r\neg. 192.168.0.0/16\r\neg. fe80::/10\r\neg. 80\r\neg. 443\r\neg. 20-21\r\neg. 49152-65534"); + + _r_ctrl_settext (hwnd, IDC_SAVE, app.LocaleString (pcontext->item_id != INVALID_INT ? IDS_SAVE : IDS_ADD)); + _r_ctrl_settext (hwnd, IDC_CLOSE, app.LocaleString (IDS_CLOSE)); _r_wnd_addstyle (hwnd, IDC_SAVE, app.IsClassicUI () ? WS_EX_STATICEDGE : 0, WS_EX_STATICEDGE, GWL_EXSTYLE); _r_wnd_addstyle (hwnd, IDC_CLOSE, app.IsClassicUI () ? WS_EX_STATICEDGE : 0, WS_EX_STATICEDGE, GWL_EXSTYLE); @@ -75,29 +83,37 @@ INT_PTR CALLBACK AddRuleProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) if (!_r_ctrl_isenabled (hwnd, IDC_SAVE)) return FALSE; - rstring rule_single = _r_ctrl_gettext (hwnd, IDC_RULE_ID); - _r_str_trim (rule_single, DIVIDER_TRIM DIVIDER_RULE); + PR_STRING ruleString = _r_ctrl_gettext (hwnd, IDC_RULE_ID); - if (rule_single.IsEmpty ()) - return FALSE; - - if (!_app_parserulestring (rule_single, NULL)) + if (_r_str_isempty (ruleString)) { - _r_ctrl_showtip (hwnd, IDC_RULE_ID, 0, NULL, app.LocaleString (IDS_STATUS_SYNTAX_ERROR, NULL).GetString ()); + if (ruleString) + _r_obj_dereference (ruleString); + + return FALSE; + } + + if (!_app_parserulestring (ruleString, NULL)) + { + _r_ctrl_showballoontip (hwnd, IDC_RULE_ID, 0, NULL, app.LocaleString (IDS_STATUS_SYNTAX_ERROR)); _r_ctrl_enable (hwnd, IDC_SAVE, FALSE); + _r_obj_dereference (ruleString); + return FALSE; } if (pcontext->item_id == INVALID_INT) { - _r_listview_additem (pcontext->hwnd, pcontext->listview_id, INVALID_INT, 0, rule_single.GetString ()); + _r_listview_additem (pcontext->hwnd, pcontext->listview_id, INVALID_INT, 0, ruleString->Buffer); } else { - _r_listview_setitem (pcontext->hwnd, pcontext->listview_id, pcontext->item_id, 0, rule_single.GetString ()); + _r_listview_setitem (pcontext->hwnd, pcontext->listview_id, pcontext->item_id, 0, ruleString->Buffer); } + _r_obj_dereference (ruleString); + [[fallthrough]]; } @@ -137,25 +153,23 @@ INT_PTR CALLBACK EditorPagesProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa // name if (GetDlgItem (hwnd, IDC_RULE_NAME_ID)) { - SetDlgItemText (hwnd, IDC_RULE_NAME, app.LocaleString (IDS_NAME, L":").GetString ()); + _r_ctrl_settextformat (hwnd, IDC_RULE_NAME, L"%s:", app.LocaleString (IDS_NAME)); - if (!_r_str_isempty (ptr_rule->pname)) - SetDlgItemText (hwnd, IDC_RULE_NAME_ID, ptr_rule->pname); + if (!_r_str_isempty (ptr_rule->name)) + _r_ctrl_settext (hwnd, IDC_RULE_NAME_ID, ptr_rule->name->Buffer); SendDlgItemMessage (hwnd, IDC_RULE_NAME_ID, EM_LIMITTEXT, RULE_NAME_CCH_MAX - 1, 0); SendDlgItemMessage (hwnd, IDC_RULE_NAME_ID, EM_SETREADONLY, ptr_rule->is_readonly, 0); } - rstring text_any = app.LocaleString (IDS_ANY, NULL); - // direction if (GetDlgItem (hwnd, IDC_RULE_DIRECTION)) { - SetDlgItemText (hwnd, IDC_RULE_DIRECTION, app.LocaleString (IDS_DIRECTION, L":").GetString ()); + _r_ctrl_settextformat (hwnd, IDC_RULE_DIRECTION, L"%s:", app.LocaleString (IDS_DIRECTION)); - SetDlgItemText (hwnd, IDC_RULE_DIRECTION_OUTBOUND, app.LocaleString (IDS_DIRECTION_1, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_RULE_DIRECTION_INBOUND, app.LocaleString (IDS_DIRECTION_2, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_RULE_DIRECTION_ANY, text_any.GetString ()); + _r_ctrl_settext (hwnd, IDC_RULE_DIRECTION_OUTBOUND, app.LocaleString (IDS_DIRECTION_1)); + _r_ctrl_settext (hwnd, IDC_RULE_DIRECTION_INBOUND, app.LocaleString (IDS_DIRECTION_2)); + _r_ctrl_settext (hwnd, IDC_RULE_DIRECTION_ANY, app.LocaleString (IDS_ANY)); if (ptr_rule->direction == FWP_DIRECTION_OUTBOUND) CheckRadioButton (hwnd, IDC_RULE_DIRECTION_OUTBOUND, IDC_RULE_DIRECTION_ANY, IDC_RULE_DIRECTION_OUTBOUND); @@ -174,10 +188,10 @@ INT_PTR CALLBACK EditorPagesProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa // action if (GetDlgItem (hwnd, IDC_RULE_ACTION)) { - SetDlgItemText (hwnd, IDC_RULE_ACTION, app.LocaleString (IDS_ACTION, L":").GetString ()); + _r_ctrl_settextformat (hwnd, IDC_RULE_ACTION, L"%s:", app.LocaleString (IDS_ACTION)); - SetDlgItemText (hwnd, IDC_RULE_ACTION_BLOCK, app.LocaleString (IDS_ACTION_BLOCK, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_RULE_ACTION_ALLOW, app.LocaleString (IDS_ACTION_ALLOW, NULL).GetString ()); + _r_ctrl_settext (hwnd, IDC_RULE_ACTION_BLOCK, app.LocaleString (IDS_ACTION_BLOCK)); + _r_ctrl_settext (hwnd, IDC_RULE_ACTION_ALLOW, app.LocaleString (IDS_ACTION_ALLOW)); CheckRadioButton (hwnd, IDC_RULE_ACTION_BLOCK, IDC_RULE_ACTION_ALLOW, ptr_rule->is_block ? IDC_RULE_ACTION_BLOCK : IDC_RULE_ACTION_ALLOW); @@ -188,7 +202,7 @@ INT_PTR CALLBACK EditorPagesProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa // protocols if (GetDlgItem (hwnd, IDC_RULE_PROTOCOL_ID)) { - SetDlgItemText (hwnd, IDC_RULE_PROTOCOL, app.LocaleString (IDS_PROTOCOL, L":").GetString ()); + _r_ctrl_settextformat (hwnd, IDC_RULE_PROTOCOL, L"%s:", app.LocaleString (IDS_PROTOCOL)); UINT8 protos[] = { IPPROTO_ICMP, @@ -204,8 +218,10 @@ INT_PTR CALLBACK EditorPagesProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa }; INT index = 0; + WCHAR format[256]; + LPCWSTR protocolString; - SendDlgItemMessage (hwnd, IDC_RULE_PROTOCOL_ID, CB_INSERTSTRING, (WPARAM)index, (LPARAM)text_any.GetString ()); + SendDlgItemMessage (hwnd, IDC_RULE_PROTOCOL_ID, CB_INSERTSTRING, (WPARAM)index, (LPARAM)app.LocaleString (IDS_ANY)); SendDlgItemMessage (hwnd, IDC_RULE_PROTOCOL_ID, CB_SETITEMDATA, (WPARAM)index, 0); if (ptr_rule->protocol == 0) @@ -213,12 +229,16 @@ INT_PTR CALLBACK EditorPagesProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa index += 1; - for (auto &proto : protos) + for (auto protocolId : protos) { - SendDlgItemMessage (hwnd, IDC_RULE_PROTOCOL_ID, CB_INSERTSTRING, (WPARAM)index, (LPARAM)_r_fmt (L"%s (%" TEXT (PRIu8) L")", _app_getprotoname (proto, AF_UNSPEC, SZ_UNKNOWN).GetString (), proto).GetString ()); - SendDlgItemMessage (hwnd, IDC_RULE_PROTOCOL_ID, CB_SETITEMDATA, (WPARAM)index, (LPARAM)proto); + protocolString = _app_getprotoname (protocolId, AF_UNSPEC, SZ_UNKNOWN); - if (ptr_rule->protocol == proto) + _r_str_printf (format, RTL_NUMBER_OF (format), L"%s (%" TEXT (PRIu8) L")", protocolString, protocolId); + + SendDlgItemMessage (hwnd, IDC_RULE_PROTOCOL_ID, CB_INSERTSTRING, (WPARAM)index, (LPARAM)format); + SendDlgItemMessage (hwnd, IDC_RULE_PROTOCOL_ID, CB_SETITEMDATA, (WPARAM)index, (LPARAM)protocolId); + + if (ptr_rule->protocol == protocolId) SendDlgItemMessage (hwnd, IDC_RULE_PROTOCOL_ID, CB_SETCURSEL, (WPARAM)index, 0); index += 1; @@ -227,7 +247,11 @@ INT_PTR CALLBACK EditorPagesProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa // unknown protocol if (SendDlgItemMessage (hwnd, IDC_RULE_PROTOCOL_ID, CB_GETCURSEL, 0, 0) == CB_ERR) { - SendDlgItemMessage (hwnd, IDC_RULE_PROTOCOL_ID, CB_INSERTSTRING, (WPARAM)index, (LPARAM)_r_fmt (L"%s (%" TEXT (PRIu8) L")", _app_getprotoname (ptr_rule->protocol, AF_UNSPEC, SZ_UNKNOWN).GetString (), ptr_rule->protocol).GetString ()); + protocolString = _app_getprotoname (ptr_rule->protocol, AF_UNSPEC, SZ_UNKNOWN); + + _r_str_printf (format, RTL_NUMBER_OF (format), L"%s (%" TEXT (PRIu8) L")", protocolString, ptr_rule->protocol); + + SendDlgItemMessage (hwnd, IDC_RULE_PROTOCOL_ID, CB_INSERTSTRING, (WPARAM)index, (LPARAM)format); SendDlgItemMessage (hwnd, IDC_RULE_PROTOCOL_ID, CB_SETITEMDATA, (WPARAM)index, (LPARAM)ptr_rule->protocol); SendDlgItemMessage (hwnd, IDC_RULE_PROTOCOL_ID, CB_SETCURSEL, (WPARAM)index, 0); @@ -239,35 +263,45 @@ INT_PTR CALLBACK EditorPagesProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa // rule (remote) if (GetDlgItem (hwnd, IDC_RULE_REMOTE_ID)) { - SetDlgItemText (hwnd, IDC_RULE_REMOTE, app.LocaleString (IDS_RULE, L" (" SZ_DIRECTION_REMOTE L"):").GetString ()); + _r_ctrl_settextformat (hwnd, IDC_RULE_REMOTE, L"%s (" SZ_DIRECTION_REMOTE L"):", app.LocaleString (IDS_RULE)); _r_listview_setstyle (hwnd, IDC_RULE_REMOTE_ID, LVS_EX_DOUBLEBUFFER | LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP | LVS_EX_LABELTIP, FALSE); _r_listview_addcolumn (hwnd, IDC_RULE_REMOTE_ID, 0, NULL, -100, 0); - if (!_r_str_isempty (ptr_rule->prule_remote)) + if (!_r_str_isempty (ptr_rule->rule_remote)) { - rstringvec rvc; - _r_str_split (ptr_rule->prule_remote, INVALID_SIZE_T, DIVIDER_RULE[0], rvc); - INT index = 0; - for (auto &rule_single : rvc) + PR_STRING rulePart; + R_STRINGREF remainingPart; + + _r_stringref_initializeex (&remainingPart, ptr_rule->rule_remote->Buffer, ptr_rule->rule_remote->Length); + + while (remainingPart.Length != 0) { - _r_str_trim (rule_single, DIVIDER_TRIM DIVIDER_RULE); + rulePart = _r_str_splitatchar (&remainingPart, &remainingPart, DIVIDER_RULE[0], TRUE); - _r_fastlock_acquireshared (&lock_checkbox); - _r_listview_additem (hwnd, IDC_RULE_REMOTE_ID, index, 0, rule_single.GetString ()); - _r_fastlock_releaseshared (&lock_checkbox); + if (rulePart) + { + if (!_r_str_isempty (rulePart)) + { + _r_fastlock_acquireshared (&lock_checkbox); + _r_listview_additem (hwnd, IDC_RULE_REMOTE_ID, index, 0, rulePart->Buffer); + _r_fastlock_releaseshared (&lock_checkbox); - index += 1; + index += 1; + } + + _r_obj_dereference (rulePart); + } } _r_listview_setcolumn (hwnd, IDC_RULE_REMOTE_ID, 0, NULL, -100); } - SetDlgItemText (hwnd, IDC_RULE_REMOTE_ADD, app.LocaleString (IDS_ADD, L"...").GetString ()); - SetDlgItemText (hwnd, IDC_RULE_REMOTE_EDIT, app.LocaleString (IDS_EDIT2, L"...").GetString ()); - SetDlgItemText (hwnd, IDC_RULE_REMOTE_DELETE, app.LocaleString (IDS_DELETE, NULL).GetString ()); + _r_ctrl_settextformat (hwnd, IDC_RULE_REMOTE_ADD, L"%s...", app.LocaleString (IDS_ADD)); + _r_ctrl_settextformat (hwnd, IDC_RULE_REMOTE_EDIT, L"%s...", app.LocaleString (IDS_EDIT2)); + _r_ctrl_settext (hwnd, IDC_RULE_REMOTE_DELETE, app.LocaleString (IDS_DELETE)); _r_ctrl_enable (hwnd, IDC_RULE_REMOTE_ADD, !ptr_rule->is_readonly); _r_ctrl_enable (hwnd, IDC_RULE_REMOTE_EDIT, FALSE); @@ -281,35 +315,45 @@ INT_PTR CALLBACK EditorPagesProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa // rule (local) if (GetDlgItem (hwnd, IDC_RULE_LOCAL_ID)) { - SetDlgItemText (hwnd, IDC_RULE_LOCAL, app.LocaleString (IDS_RULE, L" (" SZ_DIRECTION_LOCAL L"):").GetString ()); + _r_ctrl_settextformat (hwnd, IDC_RULE_LOCAL, L"%s (" SZ_DIRECTION_LOCAL L"):", app.LocaleString (IDS_RULE)); _r_listview_setstyle (hwnd, IDC_RULE_LOCAL_ID, LVS_EX_DOUBLEBUFFER | LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP | LVS_EX_LABELTIP, FALSE); _r_listview_addcolumn (hwnd, IDC_RULE_LOCAL_ID, 0, NULL, -100, 0); - if (!_r_str_isempty (ptr_rule->prule_local)) + if (!_r_str_isempty (ptr_rule->rule_local)) { - rstringvec rvc; - _r_str_split (ptr_rule->prule_local, INVALID_SIZE_T, DIVIDER_RULE[0], rvc); - INT index = 0; - for (auto &rule_single : rvc) + PR_STRING rulePart; + R_STRINGREF remainingPart; + + _r_stringref_initializeex (&remainingPart, ptr_rule->rule_local->Buffer, ptr_rule->rule_local->Length); + + while (remainingPart.Length != 0) { - _r_str_trim (rule_single, DIVIDER_TRIM DIVIDER_RULE); + rulePart = _r_str_splitatchar (&remainingPart, &remainingPart, DIVIDER_RULE[0], TRUE); - _r_fastlock_acquireshared (&lock_checkbox); - _r_listview_additem (hwnd, IDC_RULE_LOCAL_ID, index, 0, rule_single.GetString ()); - _r_fastlock_releaseshared (&lock_checkbox); + if (rulePart) + { + if (!_r_str_isempty (rulePart)) + { + _r_fastlock_acquireshared (&lock_checkbox); + _r_listview_additem (hwnd, IDC_RULE_LOCAL_ID, index, 0, rulePart->Buffer); + _r_fastlock_releaseshared (&lock_checkbox); - index += 1; + index += 1; + } + + _r_obj_dereference (rulePart); + } } _r_listview_setcolumn (hwnd, IDC_RULE_LOCAL_ID, 0, NULL, -100); } - SetDlgItemText (hwnd, IDC_RULE_LOCAL_ADD, app.LocaleString (IDS_ADD, L"...").GetString ()); - SetDlgItemText (hwnd, IDC_RULE_LOCAL_EDIT, app.LocaleString (IDS_EDIT2, L"...").GetString ()); - SetDlgItemText (hwnd, IDC_RULE_LOCAL_DELETE, app.LocaleString (IDS_DELETE, NULL).GetString ()); + _r_ctrl_settextformat (hwnd, IDC_RULE_LOCAL_ADD, L"%s...", app.LocaleString (IDS_ADD)); + _r_ctrl_settextformat (hwnd, IDC_RULE_LOCAL_EDIT, L"%s...", app.LocaleString (IDS_EDIT2)); + _r_ctrl_settext (hwnd, IDC_RULE_LOCAL_DELETE, app.LocaleString (IDS_DELETE)); _r_ctrl_enable (hwnd, IDC_RULE_LOCAL_ADD, !ptr_rule->is_readonly); _r_ctrl_enable (hwnd, IDC_RULE_LOCAL_EDIT, FALSE); @@ -327,25 +371,26 @@ INT_PTR CALLBACK EditorPagesProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa _r_listview_setstyle (hwnd, IDC_RULE_APPS_ID, LVS_EX_DOUBLEBUFFER | LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP | LVS_EX_LABELTIP | LVS_EX_CHECKBOXES, TRUE); - _r_listview_addcolumn (hwnd, IDC_RULE_APPS_ID, 0, app.LocaleString (IDS_NAME, NULL).GetString (), 0, LVCFMT_LEFT); + _r_listview_addcolumn (hwnd, IDC_RULE_APPS_ID, 0, app.LocaleString (IDS_NAME), 0, LVCFMT_LEFT); _r_listview_addgroup (hwnd, IDC_RULE_APPS_ID, 0, L"", 0, LVGS_COLLAPSIBLE, LVGS_COLLAPSIBLE); _r_listview_addgroup (hwnd, IDC_RULE_APPS_ID, 1, L"", 0, LVGS_COLLAPSIBLE, LVGS_COLLAPSIBLE); _r_listview_addgroup (hwnd, IDC_RULE_APPS_ID, 2, L"", 0, LVGS_COLLAPSIBLE, LVGS_COLLAPSIBLE); // apps (apply to) - for (auto &p : apps) { - PR_OBJECT ptr_app_object = _r_obj2_reference (p.second); + PITEM_APP ptr_app; + SIZE_T app_hash; + INT group_id; + BOOLEAN is_enabled; - if (!ptr_app_object) - continue; - - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; - - if (ptr_app) + for (auto it = apps.begin (); it != apps.end (); ++it) { - INT group_id; + if (!it->second) + continue; + + app_hash = it->first; + ptr_app = (PITEM_APP)_r_obj_reference (it->second); if (ptr_app->type == DataAppUWP) group_id = 2; @@ -357,17 +402,17 @@ INT_PTR CALLBACK EditorPagesProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa group_id = 0; // check for services - BOOLEAN is_enabled = (ptr_rule->apps.find (p.first) != ptr_rule->apps.end ()) || (ptr_rule->is_forservices && (p.first == config.ntoskrnl_hash || p.first == config.svchost_hash)); + is_enabled = (ptr_rule->apps->find (app_hash) != ptr_rule->apps->end ()) || (ptr_rule->is_forservices && (app_hash == config.ntoskrnl_hash || app_hash == config.svchost_hash)); _r_fastlock_acquireshared (&lock_checkbox); - _r_listview_additem (hwnd, IDC_RULE_APPS_ID, 0, 0, _r_path_getfilename (ptr_app->display_name), ptr_app->icon_id, group_id, p.first); + _r_listview_additem (hwnd, IDC_RULE_APPS_ID, 0, 0, _r_obj_getstringordefault (ptr_app->display_name, SZ_EMPTY), ptr_app->icon_id, group_id, app_hash); _r_listview_setitemcheck (hwnd, IDC_RULE_APPS_ID, 0, is_enabled); _r_fastlock_releaseshared (&lock_checkbox); - } - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); + } } // resize column @@ -382,10 +427,10 @@ INT_PTR CALLBACK EditorPagesProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa // hints if (GetDlgItem (hwnd, IDC_RULE_HINT)) - SetDlgItemText (hwnd, IDC_RULE_HINT, app.LocaleString (IDS_RULE_HINT, NULL).GetString ()); + _r_ctrl_settext (hwnd, IDC_RULE_HINT, app.LocaleString (IDS_RULE_HINT)); if (GetDlgItem (hwnd, IDC_RULE_APPS_HINT)) - SetDlgItemText (hwnd, IDC_RULE_APPS_HINT, app.LocaleString (IDS_RULE_APPS_HINT, NULL).GetString ()); + _r_ctrl_settext (hwnd, IDC_RULE_APPS_HINT, app.LocaleString (IDS_RULE_APPS_HINT)); break; } @@ -453,17 +498,22 @@ INT_PTR CALLBACK EditorPagesProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa if (listview_id == IDC_RULE_REMOTE_ID || listview_id == IDC_RULE_LOCAL_ID) { + PR_STRING localizedString = NULL; BOOLEAN is_remote = listview_id == IDC_RULE_REMOTE_ID; UINT id_add = is_remote ? IDC_RULE_REMOTE_ADD : IDC_RULE_LOCAL_ADD; UINT id_edit = is_remote ? IDC_RULE_REMOTE_EDIT : IDC_RULE_LOCAL_EDIT; UINT id_delete = is_remote ? IDC_RULE_REMOTE_DELETE : IDC_RULE_LOCAL_DELETE; - AppendMenu (hsubmenu, MF_STRING, id_add, app.LocaleString (IDS_ADD, L"...").GetString ()); - AppendMenu (hsubmenu, MF_STRING, id_edit, app.LocaleString (IDS_EDIT2, L"...").GetString ()); - AppendMenu (hsubmenu, MF_STRING, id_delete, app.LocaleString (IDS_DELETE, NULL).GetString ()); + _r_obj_movereference (&localizedString, _r_format_string (L"%s...", app.LocaleString (IDS_ADD))); + AppendMenu (hsubmenu, MF_STRING, id_add, _r_obj_getstringorempty (localizedString)); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s...", app.LocaleString (IDS_EDIT2))); + AppendMenu (hsubmenu, MF_STRING, id_edit, _r_obj_getstringorempty (localizedString)); + + AppendMenu (hsubmenu, MF_STRING, id_delete, app.LocaleString (IDS_DELETE)); AppendMenu (hsubmenu, MF_SEPARATOR, 0, NULL); - AppendMenu (hsubmenu, MF_STRING, IDM_COPY, app.LocaleString (IDS_COPY, NULL).GetString ()); + AppendMenu (hsubmenu, MF_STRING, IDM_COPY, app.LocaleString (IDS_COPY)); if (ptr_rule->is_readonly) { @@ -478,15 +528,17 @@ INT_PTR CALLBACK EditorPagesProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa _r_menu_enableitem (hsubmenu, id_delete, MF_BYCOMMAND, FALSE); _r_menu_enableitem (hsubmenu, IDM_COPY, MF_BYCOMMAND, FALSE); } + + SAFE_DELETE_REFERENCE (localizedString); } else if (listview_id == IDC_RULE_APPS_ID) { - AppendMenu (hsubmenu, MF_STRING, IDM_CHECK, app.LocaleString (IDS_CHECK, NULL).GetString ()); - AppendMenu (hsubmenu, MF_STRING, IDM_UNCHECK, app.LocaleString (IDS_UNCHECK, NULL).GetString ()); + AppendMenu (hsubmenu, MF_STRING, IDM_CHECK, app.LocaleString (IDS_CHECK)); + AppendMenu (hsubmenu, MF_STRING, IDM_UNCHECK, app.LocaleString (IDS_UNCHECK)); AppendMenu (hsubmenu, MF_SEPARATOR, 0, NULL); - AppendMenu (hsubmenu, MF_STRING, IDM_PROPERTIES, app.LocaleString (IDS_SHOWINLIST, NULL).GetString ()); + AppendMenu (hsubmenu, MF_STRING, IDM_PROPERTIES, app.LocaleString (IDS_SHOWINLIST)); AppendMenu (hsubmenu, MF_SEPARATOR, 0, NULL); - AppendMenu (hsubmenu, MF_STRING, IDM_COPY, app.LocaleString (IDS_COPY, NULL).GetString ()); + AppendMenu (hsubmenu, MF_STRING, IDM_COPY, app.LocaleString (IDS_COPY)); if (ptr_rule->type != DataRuleCustom) { @@ -593,8 +645,13 @@ INT_PTR CALLBACK EditorPagesProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa case LVN_GETINFOTIP: { LPNMLVGETINFOTIP lpnmlv = (LPNMLVGETINFOTIP)lparam; + PR_STRING string = _app_gettooltip (hwnd, lpnmlv); - _r_str_copy (lpnmlv->pszText, lpnmlv->cchTextMax, _app_gettooltip (hwnd, lpnmlv).GetString ()); + if (string) + { + _r_str_copy (lpnmlv->pszText, lpnmlv->cchTextMax, string->Buffer); + _r_obj_dereference (string); + } break; } @@ -604,7 +661,7 @@ INT_PTR CALLBACK EditorPagesProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa NMLVEMPTYMARKUP* lpnmlv = (NMLVEMPTYMARKUP*)lparam; lpnmlv->dwFlags = EMF_CENTERED; - _r_str_copy (lpnmlv->szMarkup, RTL_NUMBER_OF (lpnmlv->szMarkup), app.LocaleString (IDS_STATUS_EMPTY, NULL).GetString ()); + _r_str_copy (lpnmlv->szMarkup, RTL_NUMBER_OF (lpnmlv->szMarkup), app.LocaleString (IDS_STATUS_EMPTY)); SetWindowLongPtr (hwnd, DWLP_MSGRESULT, TRUE); return TRUE; @@ -664,7 +721,10 @@ INT_PTR CALLBACK EditorPagesProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa INT listview_id = ((ctrl_id == IDC_RULE_REMOTE_DELETE) ? IDC_RULE_REMOTE_ID : IDC_RULE_LOCAL_ID); INT selected = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETSELECTEDCOUNT, 0, 0); - if (!selected || app.ShowMessage (hwnd, MB_YESNO | MB_ICONEXCLAMATION, NULL, NULL, _r_fmt (app.LocaleString (IDS_QUESTION_DELETE, NULL).GetString (), selected).GetString ()) != IDYES) + WCHAR messageText[256]; + _r_str_printf (messageText, RTL_NUMBER_OF (messageText), app.LocaleString (IDS_QUESTION_DELETE), selected); + + if (!selected || app.ShowMessage (hwnd, MB_YESNO | MB_ICONEXCLAMATION, NULL, NULL, messageText) != IDYES) break; INT count = _r_listview_getitemcount (hwnd, listview_id, FALSE) - 1; @@ -715,28 +775,45 @@ INT_PTR CALLBACK EditorPagesProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa case IDM_COPY: { - HWND hlistview = GetFocus (); + HWND hlistview; + PR_STRING buffer; + PR_STRING string; + INT listview_id; + INT item; + + hlistview = GetFocus (); if (!hlistview) break; - INT listview_id = GetDlgCtrlID (hlistview); + listview_id = GetDlgCtrlID (hlistview); if (!listview_id || !_r_listview_getitemcount (hwnd, listview_id, FALSE)) break; - INT item = INVALID_INT; + buffer = _r_obj_createstringbuilder (512 * sizeof (WCHAR)); - rstring buffer; + item = INVALID_INT; while ((item = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETNEXTITEM, (WPARAM)item, LVNI_SELECTED)) != INVALID_INT) { - buffer.AppendFormat (L"%s\r\n", _r_listview_getitemtext (hwnd, listview_id, item, 0).GetString ()); + string = _r_listview_getitemtext (hwnd, listview_id, item, 0); + + if (string) + { + if (!_r_str_isempty (string)) + _r_string_appendformat (&buffer, L"%s\r\n", string->Buffer); + + _r_obj_dereference (string); + } } _r_str_trim (buffer, DIVIDER_TRIM); - _r_clipboard_set (hwnd, buffer.GetString (), buffer.GetLength ()); + if (!_r_str_isempty (buffer)) + _r_clipboard_set (hwnd, buffer->Buffer, _r_obj_getstringlength (buffer)); + + _r_obj_dereference (buffer); break; } @@ -751,22 +828,13 @@ INT_PTR CALLBACK EditorPagesProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa INT_PTR CALLBACK EditorProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { - static PR_OBJECT ptr_rule_object = NULL; static PITEM_RULE ptr_rule = NULL; switch (msg) { case WM_INITDIALOG: { - ptr_rule_object = (PR_OBJECT)lparam; - - if (!ptr_rule_object) - { - EndDialog (hwnd, FALSE); - return FALSE; - } - - ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; + ptr_rule = (PITEM_RULE)lparam; if (!ptr_rule) { @@ -774,13 +842,13 @@ INT_PTR CALLBACK EditorProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) return FALSE; } - //// configure window + // configure window _r_wnd_center (hwnd, GetParent (hwnd)); - //// configure tabs - _r_tab_additem (hwnd, IDC_TAB, 0, app.LocaleString (IDS_SETTINGS_GENERAL, NULL).GetString (), I_IMAGENONE, (LPARAM)CreateDialogParam (app.GetHINSTANCE (), MAKEINTRESOURCE (IDD_EDITOR_GENERAL), hwnd, &EditorPagesProc, (LPARAM)ptr_rule)); - _r_tab_additem (hwnd, IDC_TAB, 1, app.LocaleString (IDS_RULE, NULL).GetString (), I_IMAGENONE, (LPARAM)CreateDialogParam (app.GetHINSTANCE (), MAKEINTRESOURCE (IDD_EDITOR_RULE), hwnd, &EditorPagesProc, (LPARAM)ptr_rule)); - _r_tab_additem (hwnd, IDC_TAB, 2, app.LocaleString (IDS_TAB_APPS, NULL).GetString (), I_IMAGENONE, (LPARAM)CreateDialogParam (app.GetHINSTANCE (), MAKEINTRESOURCE (IDD_EDITOR_APPS), hwnd, &EditorPagesProc, (LPARAM)ptr_rule)); + // configure tabs + _r_tab_additem (hwnd, IDC_TAB, 0, app.LocaleString (IDS_SETTINGS_GENERAL), I_IMAGENONE, (LPARAM)CreateDialogParam (app.GetHINSTANCE (), MAKEINTRESOURCE (IDD_EDITOR_GENERAL), hwnd, &EditorPagesProc, (LPARAM)ptr_rule)); + _r_tab_additem (hwnd, IDC_TAB, 1, app.LocaleString (IDS_RULE), I_IMAGENONE, (LPARAM)CreateDialogParam (app.GetHINSTANCE (), MAKEINTRESOURCE (IDD_EDITOR_RULE), hwnd, &EditorPagesProc, (LPARAM)ptr_rule)); + _r_tab_additem (hwnd, IDC_TAB, 2, app.LocaleString (IDS_TAB_APPS), I_IMAGENONE, (LPARAM)CreateDialogParam (app.GetHINSTANCE (), MAKEINTRESOURCE (IDD_EDITOR_APPS), hwnd, &EditorPagesProc, (LPARAM)ptr_rule)); #if !defined(_APP_NO_DARKTHEME) _r_wnd_setdarktheme (hwnd); @@ -788,21 +856,19 @@ INT_PTR CALLBACK EditorProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) // localize window { - rstring title = app.LocaleString (IDS_EDITOR, NULL); - - if (!_r_str_isempty (ptr_rule->pname)) - title.AppendFormat (L" \"%s\"", !_r_str_isempty (ptr_rule->pname) ? ptr_rule->pname : SZ_RULE_NEW_TITLE); + WCHAR title[128]; + _r_str_printf (title, RTL_NUMBER_OF (title), L"%s \"%s\"", app.LocaleString (IDS_EDITOR), _r_obj_getstringordefault (ptr_rule->name, SZ_RULE_NEW_TITLE)); if (ptr_rule->is_readonly) - title.AppendFormat (L" (%s)", SZ_RULE_INTERNAL_TITLE); + _r_str_appendformat (title, RTL_NUMBER_OF (title), L" (%s)", SZ_RULE_INTERNAL_TITLE); - SetWindowText (hwnd, title.GetString ()); + SetWindowText (hwnd, title); } - SetDlgItemText (hwnd, IDC_ENABLE_CHK, app.LocaleString (IDS_ENABLE_CHK, NULL).GetString ()); + _r_ctrl_settext (hwnd, IDC_ENABLE_CHK, app.LocaleString (IDS_ENABLE_CHK)); - SetDlgItemText (hwnd, IDC_SAVE, app.LocaleString (IDS_SAVE, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_CLOSE, app.LocaleString (IDS_CLOSE, NULL).GetString ()); + _r_ctrl_settext (hwnd, IDC_SAVE, app.LocaleString (IDS_SAVE)); + _r_ctrl_settext (hwnd, IDC_CLOSE, app.LocaleString (IDS_CLOSE)); _r_wnd_addstyle (hwnd, IDC_SAVE, app.IsClassicUI () ? WS_EX_STATICEDGE : 0, WS_EX_STATICEDGE, GWL_EXSTYLE); _r_wnd_addstyle (hwnd, IDC_CLOSE, app.IsClassicUI () ? WS_EX_STATICEDGE : 0, WS_EX_STATICEDGE, GWL_EXSTYLE); @@ -858,6 +924,7 @@ INT_PTR CALLBACK EditorProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) _r_tab_adjustchild (hwnd, IDC_TAB, hpage); ShowWindow (hpage, SW_SHOW); + SetFocus (hpage); } break; @@ -883,6 +950,9 @@ INT_PTR CALLBACK EditorProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) if (!SendDlgItemMessage (hpage_general, IDC_RULE_NAME_ID, WM_GETTEXTLENGTH, 0, 0)) return FALSE; + PR_STRING buffer; + PR_STRING string; + ptr_rule->is_haveerrors = FALSE; // reset errors // do not change read-only rules @@ -890,56 +960,90 @@ INT_PTR CALLBACK EditorProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { // name { - rstring name = _r_ctrl_gettext (hpage_general, IDC_RULE_NAME_ID); + PR_STRING name = _r_ctrl_gettext (hpage_general, IDC_RULE_NAME_ID); + + if (_r_str_isempty (name)) + { + if (name) + _r_obj_dereference (name); + + return FALSE; + } _r_str_trim (name, DIVIDER_TRIM DIVIDER_RULE); - _r_str_alloc (&ptr_rule->pname, min (name.GetLength (), RULE_NAME_CCH_MAX), name.GetString ()); + _r_obj_movereference (&ptr_rule->name, name); } // rule (remote) { - rstring buffer; + if (ptr_rule->rule_remote) + _r_obj_clearreference (&ptr_rule->rule_remote); + + buffer = _r_obj_createstringbuilder (RULE_RULE_CCH_MAX * sizeof (WCHAR)); for (INT i = 0; i < _r_listview_getitemcount (hpage_rule, IDC_RULE_REMOTE_ID, FALSE); i++) { - rstring rule = _r_listview_getitemtext (hpage_rule, IDC_RULE_REMOTE_ID, i, 0); - _r_str_trim (rule, DIVIDER_TRIM DIVIDER_RULE); + string = _r_listview_getitemtext (hpage_rule, IDC_RULE_REMOTE_ID, i, 0); - if (!rule.IsEmpty ()) + if (string) { - // check maximum length of one rule - if ((buffer.GetLength () + rule.GetLength ()) > RULE_RULE_CCH_MAX) - break; + _r_str_trim (string, DIVIDER_TRIM DIVIDER_RULE); - buffer.AppendFormat (L"%s" DIVIDER_RULE, rule.GetString ()); + if (!_r_str_isempty (string)) + { + // check maximum length of one rule + if ((_r_obj_getstringlength (buffer) + _r_obj_getstringlength (string)) > RULE_RULE_CCH_MAX) + break; + + _r_string_appendformat (&buffer, L"%s" DIVIDER_RULE, _r_obj_getstring (string)); + } + + _r_obj_dereference (string); } } _r_str_trim (buffer, DIVIDER_TRIM DIVIDER_RULE); - _r_str_alloc (&ptr_rule->prule_remote, buffer.GetLength (), buffer.GetString ()); + + if (!_r_str_isempty (buffer)) + _r_obj_movereference (&ptr_rule->rule_remote, buffer); + else + _r_obj_clearreference (&buffer); } // rule (local) { - rstring buffer; + if (ptr_rule->rule_local) + _r_obj_clearreference (&ptr_rule->rule_local); + + buffer = _r_obj_createstringbuilder (RULE_RULE_CCH_MAX * sizeof (WCHAR)); for (INT i = 0; i < _r_listview_getitemcount (hpage_rule, IDC_RULE_LOCAL_ID, FALSE); i++) { - rstring rule = _r_listview_getitemtext (hpage_rule, IDC_RULE_LOCAL_ID, i, 0); - _r_str_trim (rule, DIVIDER_TRIM DIVIDER_RULE); + string = _r_listview_getitemtext (hpage_rule, IDC_RULE_LOCAL_ID, i, 0); - if (!rule.IsEmpty ()) + if (string) { - // check maximum length of one rule - if ((buffer.GetLength () + rule.GetLength ()) > RULE_RULE_CCH_MAX) - break; + _r_str_trim (string, DIVIDER_TRIM DIVIDER_RULE); - buffer.AppendFormat (L"%s" DIVIDER_RULE, rule.GetString ()); + if (!_r_str_isempty (string)) + { + // check maximum length of one rule + if ((_r_obj_getstringlength (buffer) + _r_obj_getstringlength (string)) > RULE_RULE_CCH_MAX) + break; + + _r_string_appendformat (&buffer, L"%s" DIVIDER_RULE, _r_obj_getstring (string)); + } + + _r_obj_dereference (string); } } _r_str_trim (buffer, DIVIDER_TRIM DIVIDER_RULE); - _r_str_alloc (&ptr_rule->prule_local, buffer.GetLength (), buffer.GetString ()); + + if (!_r_str_isempty (buffer)) + _r_obj_movereference (&ptr_rule->rule_local, buffer); + else + _r_obj_clearreference (&buffer); } ptr_rule->protocol = (UINT8)SendDlgItemMessage (hpage_general, IDC_RULE_PROTOCOL_ID, CB_GETITEMDATA, SendDlgItemMessage (hpage_general, IDC_RULE_PROTOCOL_ID, CB_GETCURSEL, 0, 0), 0); @@ -954,7 +1058,7 @@ INT_PTR CALLBACK EditorProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) // save rule apps if (ptr_rule->type == DataRuleCustom) { - ptr_rule->apps.clear (); + ptr_rule->apps->clear (); for (INT i = 0; i < _r_listview_getitemcount (hpage_apps, IDC_RULE_APPS_ID, FALSE); i++) { @@ -966,7 +1070,7 @@ INT_PTR CALLBACK EditorProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) if (_app_isappfound (app_hash)) { if (_r_listview_isitemchecked (hpage_apps, IDC_RULE_APPS_ID, i)) - ptr_rule->apps[app_hash] = TRUE; + ptr_rule->apps->emplace (app_hash, TRUE); } } } @@ -975,11 +1079,14 @@ INT_PTR CALLBACK EditorProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) _app_ruleenable (ptr_rule, (IsDlgButtonChecked (hwnd, IDC_ENABLE_CHK) == BST_CHECKED)); // apply filter - { - OBJECTS_VEC rules; - rules.push_back (ptr_rule_object); + HANDLE hengine = _wfp_getenginehandle (); - _wfp_create4filters (_wfp_getenginehandle (), rules, __LINE__); + if (hengine) + { + OBJECTS_RULE_VECTOR rules; + rules.emplace_back (ptr_rule); + + _wfp_create4filters (hengine, &rules, __LINE__); // note: do not needed! //_app_dereferenceobjects (rules, &_app_dereferencerule); diff --git a/src/main.cpp b/src/main.cpp index 3037522d..1a278915 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -55,55 +55,67 @@ THREAD_FN NetworkMonitorThread (PVOID lparam) if (network_timeout && network_timeout != INFINITE) { - HWND hwnd = (HWND)lparam; - INT network_listview_id = IDC_NETWORK; - 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); + _app_generate_connections (&network_map, &checker_map); - BOOLEAN is_highlighting_enabled = app.ConfigGetBoolean (L"IsEnableHighlighting", TRUE) && app.ConfigGetBoolean (L"IsHighlightConnection", TRUE, L"colors"); - INT current_listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); - BOOLEAN is_refresh = FALSE; + is_highlighting_enabled = app.ConfigGetBoolean (L"IsEnableHighlighting", TRUE) && app.ConfigGetBoolean (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 &p : network_map) + for (auto it = network_map.begin (); it != network_map.end (); ++it) { - if (checker_map.find (p.first) == checker_map.end () || !checker_map[p.first]) + if (!it->second) continue; - PITEM_NETWORK ptr_network = (PITEM_NETWORK)_r_obj_reference (p.second); - - if (!ptr_network) + if (checker_map.find (it->first) == checker_map.end () || !checker_map.at (it->first)) continue; - LPWSTR local_fmt = NULL; - LPWSTR remote_fmt = NULL; + ptr_network = (PITEM_NETWORK)_r_obj_reference (it->second); - _app_formataddress (ptr_network->af, 0, &ptr_network->local_addr, 0, &local_fmt, 0); - _app_formataddress (ptr_network->af, 0, &ptr_network->remote_addr, 0, &remote_fmt, 0); + 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); - INT item_id = _r_listview_getitemcount (hwnd, network_listview_id, FALSE); + item_id = _r_listview_getitemcount (hwnd, network_listview_id, FALSE); - _r_listview_additem (hwnd, network_listview_id, item_id, 0, _r_path_getfilename (ptr_network->path), ptr_network->icon_id, I_GROUPIDNONE, p.first); + _r_listview_additem (hwnd, network_listview_id, item_id, 0, _r_path_getbasename (_r_obj_getstring (ptr_network->path)), ptr_network->icon_id, I_GROUPIDNONE, it->first); - _r_listview_setitem (hwnd, network_listview_id, item_id, 1, !_r_str_isempty (local_fmt) ? local_fmt : SZ_EMPTY); - _r_listview_setitem (hwnd, network_listview_id, item_id, 3, !_r_str_isempty (remote_fmt) ? remote_fmt : SZ_EMPTY); - _r_listview_setitem (hwnd, network_listview_id, item_id, 5, _app_getprotoname (ptr_network->protocol, ptr_network->af, NULL).GetString ()); - _r_listview_setitem (hwnd, network_listview_id, item_id, 6, _app_getconnectionstatusname (ptr_network->state, NULL).GetString ()); + _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 (ptr_network->local_port) - _r_listview_setitem (hwnd, network_listview_id, item_id, 2, _app_formatport (ptr_network->local_port, TRUE).GetString ()); + if (localPortString) + _r_listview_setitem (hwnd, network_listview_id, item_id, 2, _r_obj_getstringorempty (localPortString)); - if (ptr_network->remote_port) - _r_listview_setitem (hwnd, network_listview_id, item_id, 4, _app_formatport (ptr_network->remote_port, TRUE).GetString ()); + if (remotePortString) + _r_listview_setitem (hwnd, network_listview_id, item_id, 4, _r_obj_getstringorempty (remotePortString)); - SAFE_DELETE_MEMORY (local_fmt); - SAFE_DELETE_MEMORY (remote_fmt); + SAFE_DELETE_REFERENCE (localAddressString); + SAFE_DELETE_REFERENCE (localPortString); + SAFE_DELETE_REFERENCE (remoteAddressString); + SAFE_DELETE_REFERENCE (remotePortString); // redraw listview item if (is_highlighting_enabled) @@ -197,7 +209,7 @@ BOOLEAN _app_changefilters (HWND hwnd, BOOLEAN is_install, BOOLEAN is_forced) { _app_initinterfacestate (hwnd, TRUE); - _app_freethreadpool (threads_pool); + _app_freethreadpool (&threads_pool); PITEM_CONTEXT pcontext = (PITEM_CONTEXT)_r_mem_allocatezero (sizeof (ITEM_CONTEXT)); @@ -212,7 +224,7 @@ BOOLEAN _app_changefilters (HWND hwnd, BOOLEAN is_install, BOOLEAN is_forced) return FALSE; } - threads_pool.push_back (hthread); + threads_pool.emplace_back (hthread); _r_sys_resumethread (hthread); return TRUE; @@ -225,26 +237,26 @@ BOOLEAN _app_changefilters (HWND hwnd, BOOLEAN is_install, BOOLEAN is_forced) return FALSE; } -VOID addcolor (UINT locale_id, LPCWSTR config_name, BOOLEAN is_enabled, LPCWSTR config_value, COLORREF default_clr) +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 (config_name)) - _r_str_alloc (&ptr_clr->pcfg_name, _r_str_length (config_name), config_name); + if (!_r_str_isempty (configName)) + ptr_clr->configName = _r_obj_createstring (configName); - if (!_r_str_isempty (config_value)) + if (!_r_str_isempty (configValue)) { - _r_str_alloc (&ptr_clr->pcfg_value, _r_str_length (config_value), config_value); + ptr_clr->configValue = _r_obj_createstring (configValue); - ptr_clr->clr_hash = _r_str_hash (config_value); - ptr_clr->new_clr = app.ConfigGetUlong (config_value, default_clr, L"colors"); + ptr_clr->hash = _r_str_hash (configValue); + ptr_clr->new_clr = app.ConfigGetUlong (configValue, default_clr, L"colors"); } ptr_clr->default_clr = default_clr; ptr_clr->locale_id = locale_id; ptr_clr->is_enabled = is_enabled; - colors.push_back (ptr_clr); + colors.emplace_back (ptr_clr); } BOOLEAN _app_installmessage (HWND hwnd, BOOLEAN is_install) @@ -286,13 +298,13 @@ BOOLEAN _app_installmessage (HWND hwnd, BOOLEAN is_install) 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), app.LocaleString (is_install ? IDS_TRAY_START : IDS_TRAY_STOP, NULL).GetString ()); - _r_str_copy (str_button_text_2, RTL_NUMBER_OF (str_button_text_2), app.LocaleString (IDS_CLOSE, NULL).GetString ()); + _r_str_copy (str_button_text_1, RTL_NUMBER_OF (str_button_text_1), app.LocaleString (is_install ? IDS_TRAY_START : IDS_TRAY_STOP)); + _r_str_copy (str_button_text_2, RTL_NUMBER_OF (str_button_text_2), app.LocaleString (IDS_CLOSE)); if (is_install) { - _r_str_copy (str_main, RTL_NUMBER_OF (str_main), app.LocaleString (IDS_QUESTION_START, NULL).GetString ()); - _r_str_copy (str_flag, RTL_NUMBER_OF (str_flag), app.LocaleString (IDS_DISABLEWINDOWSFIREWALL_CHK, NULL).GetString ()); + _r_str_copy (str_main, RTL_NUMBER_OF (str_main), app.LocaleString (IDS_QUESTION_START)); + _r_str_copy (str_flag, RTL_NUMBER_OF (str_flag), app.LocaleString (IDS_DISABLEWINDOWSFIREWALL_CHK)); tdc.pRadioButtons = td_radios; tdc.cRadioButtons = RTL_NUMBER_OF (td_radios); @@ -305,16 +317,16 @@ BOOLEAN _app_installmessage (HWND hwnd, BOOLEAN is_install) td_radios[1].nButtonID = IDNO; td_radios[1].pszButtonText = radio_text_2; - _r_str_copy (radio_text_1, RTL_NUMBER_OF (radio_text_1), app.LocaleString (IDS_INSTALL_PERMANENT, NULL).GetString ()); - _r_str_copy (radio_text_2, RTL_NUMBER_OF (radio_text_2), app.LocaleString (IDS_INSTALL_TEMPORARY, NULL).GetString ()); + _r_str_copy (radio_text_1, RTL_NUMBER_OF (radio_text_1), app.LocaleString (IDS_INSTALL_PERMANENT)); + _r_str_copy (radio_text_2, RTL_NUMBER_OF (radio_text_2), app.LocaleString (IDS_INSTALL_TEMPORARY)); if (app.ConfigGetBoolean (L"IsDisableWindowsFirewallChecked", TRUE)) tdc.dwFlags |= TDF_VERIFICATION_FLAG_CHECKED; } else { - _r_str_copy (str_main, RTL_NUMBER_OF (str_main), app.LocaleString (IDS_QUESTION_STOP, NULL).GetString ()); - _r_str_copy (str_flag, RTL_NUMBER_OF (str_flag), app.LocaleString (IDS_ENABLEWINDOWSFIREWALL_CHK, NULL).GetString ()); + _r_str_copy (str_main, RTL_NUMBER_OF (str_main), app.LocaleString (IDS_QUESTION_STOP)); + _r_str_copy (str_flag, RTL_NUMBER_OF (str_flag), app.LocaleString (IDS_ENABLEWINDOWSFIREWALL_CHK)); if (app.ConfigGetBoolean (L"IsEnableWindowsFirewallChecked", TRUE)) tdc.dwFlags |= TDF_VERIFICATION_FLAG_CHECKED; @@ -500,8 +512,8 @@ VOID _app_config_apply (HWND hwnd, INT ctrl_id) if (_wfp_dumpfilters (hengine, &GUID_WfpProvider, &filter_all)) { - for (auto &filter_id : filter_all) - _app_setsecurityinfoforfilter (hengine, &filter_id, new_val, __LINE__); + for (auto it = filter_all.begin (); it != filter_all.end (); ++it) + _app_setsecurityinfoforfilter (hengine, &(*it), new_val, __LINE__); } } @@ -534,24 +546,23 @@ VOID _app_config_apply (HWND hwnd, INT ctrl_id) if (new_val) { - for (auto &p : apps) - { - PR_OBJECT ptr_app_object = _r_obj2_reference (p.second); + PR_STRING signatureString; + PITEM_APP ptr_app; + SIZE_T app_hash; - if (!ptr_app_object) + for (auto it = apps.begin (); it != apps.end (); ++it) + { + if (!it->second) continue; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + app_hash = it->first; + ptr_app = (PITEM_APP)_r_obj_reference (it->second); - if (ptr_app) - { - PR_OBJECT ptr_signature_object = _app_getsignatureinfo (p.first, ptr_app); + signatureString = _app_getsignatureinfo (app_hash, ptr_app); - if (ptr_signature_object) - _r_obj2_dereference (ptr_signature_object); - } + SAFE_DELETE_REFERENCE (signatureString); - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } } @@ -661,14 +672,14 @@ INT_PTR CALLBACK SettingsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam if (htip) { - _r_ctrl_settip (htip, hwnd, IDC_RULE_BLOCKOUTBOUND, LPSTR_TEXTCALLBACK); - _r_ctrl_settip (htip, hwnd, IDC_RULE_BLOCKINBOUND, LPSTR_TEXTCALLBACK); - _r_ctrl_settip (htip, hwnd, IDC_RULE_ALLOWLOOPBACK, LPSTR_TEXTCALLBACK); - _r_ctrl_settip (htip, hwnd, IDC_RULE_ALLOW6TO4, LPSTR_TEXTCALLBACK); + _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_settip (htip, hwnd, IDC_USESTEALTHMODE_CHK, LPSTR_TEXTCALLBACK); - _r_ctrl_settip (htip, hwnd, IDC_INSTALLBOOTTIMEFILTERS_CHK, LPSTR_TEXTCALLBACK); - _r_ctrl_settip (htip, hwnd, IDC_SECUREFILTERS_CHK, 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; @@ -708,15 +719,17 @@ INT_PTR CALLBACK SettingsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam _r_listview_addcolumn (hwnd, IDC_COLORS, 0, L"", 0, LVCFMT_LEFT); INT item = 0; + PITEM_COLOR ptr_clr; - for (auto &ptr_clr : colors) + for (auto it = colors.begin (); it != colors.end (); ++it) { - ptr_clr->new_clr = app.ConfigGetUlong (ptr_clr->pcfg_value, ptr_clr->default_clr, L"colors"); + ptr_clr = *it; + ptr_clr->new_clr = app.ConfigGetUlong (_r_obj_getstring (ptr_clr->configValue), ptr_clr->default_clr, L"colors"); _r_fastlock_acquireshared (&lock_checkbox); - _r_listview_additem (hwnd, IDC_COLORS, item, 0, app.LocaleString (ptr_clr->locale_id, NULL).GetString (), config.icon_id, I_GROUPIDNONE, (LPARAM)ptr_clr); - _r_listview_setitemcheck (hwnd, IDC_COLORS, item, app.ConfigGetBoolean (ptr_clr->pcfg_name, ptr_clr->is_enabled, L"colors")); + _r_listview_additem (hwnd, IDC_COLORS, item, 0, app.LocaleString (ptr_clr->locale_id), config.icon_id, I_GROUPIDNONE, (LPARAM)ptr_clr); + _r_listview_setitemcheck (hwnd, IDC_COLORS, item, app.ConfigGetBoolean (_r_obj_getstring (ptr_clr->configName), ptr_clr->is_enabled, L"colors")); _r_fastlock_releaseshared (&lock_checkbox); @@ -747,8 +760,8 @@ INT_PTR CALLBACK SettingsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam { CheckDlgButton (hwnd, IDC_ENABLELOG_CHK, app.ConfigGetBoolean (L"IsLogEnabled", FALSE) ? BST_CHECKED : BST_UNCHECKED); - SetDlgItemText (hwnd, IDC_LOGPATH, app.ConfigGetString (L"LogPath", LOG_PATH_DEFAULT).GetString ()); - SetDlgItemText (hwnd, IDC_LOGVIEWER, app.ConfigGetString (L"LogViewer", LOG_VIEWER_DEFAULT).GetString ()); + _r_ctrl_settext (hwnd, IDC_LOGPATH, app.ConfigGetString (L"LogPath", LOG_PATH_DEFAULT)); + _r_ctrl_settext (hwnd, IDC_LOGVIEWER, app.ConfigGetString (L"LogViewer", LOG_VIEWER_DEFAULT)); UDACCEL ud = {0}; ud.nInc = 64; // set step to 64kb @@ -780,83 +793,88 @@ INT_PTR CALLBACK SettingsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam case RM_LOCALIZE: { INT dialog_id = (INT)wparam; - rstring recommended = app.LocaleString (IDS_RECOMMENDED, NULL); // localize titles - SetDlgItemText (hwnd, IDC_TITLE_GENERAL, app.LocaleString (IDS_TITLE_GENERAL, L":").GetString ()); - SetDlgItemText (hwnd, IDC_TITLE_LANGUAGE, app.LocaleString (IDS_TITLE_LANGUAGE, L": (Language)").GetString ()); - SetDlgItemText (hwnd, IDC_TITLE_BLOCKLIST_SPY, app.LocaleString (IDS_BLOCKLIST_SPY, L":").GetString ()); - SetDlgItemText (hwnd, IDC_TITLE_BLOCKLIST_UPDATE, app.LocaleString (IDS_BLOCKLIST_UPDATE, L":").GetString ()); - SetDlgItemText (hwnd, IDC_TITLE_BLOCKLIST_EXTRA, app.LocaleString (IDS_BLOCKLIST_EXTRA, L": (Skype, Bing, Live, Outlook, etc.)").GetString ()); - SetDlgItemText (hwnd, IDC_TITLE_CONNECTIONS, app.LocaleString (IDS_TAB_NETWORK, L":").GetString ()); - SetDlgItemText (hwnd, IDC_TITLE_SECURITY, app.LocaleString (IDS_TITLE_SECURITY, L":").GetString ()); - SetDlgItemText (hwnd, IDC_TITLE_CONFIRMATIONS, app.LocaleString (IDS_TITLE_CONFIRMATIONS, L":").GetString ()); - SetDlgItemText (hwnd, IDC_TITLE_HIGHLIGHTING, app.LocaleString (IDS_TITLE_HIGHLIGHTING, L":").GetString ()); - SetDlgItemText (hwnd, IDC_TITLE_NOTIFICATIONS, app.LocaleString (IDS_TITLE_NOTIFICATIONS, L":").GetString ()); - SetDlgItemText (hwnd, IDC_TITLE_LOGGING, app.LocaleString (IDS_TITLE_LOGGING, L":").GetString ()); - SetDlgItemText (hwnd, IDC_TITLE_INTERFACE, app.LocaleString (IDS_TITLE_INTERFACE, L":").GetString ()); - SetDlgItemText (hwnd, IDC_TITLE_EXCLUDE, app.LocaleString (IDS_TITLE_EXCLUDE, L":").GetString ()); - SetDlgItemText (hwnd, IDC_TITLE_ADVANCED, app.LocaleString (IDS_TITLE_ADVANCED, L":").GetString ()); + _r_ctrl_settextformat (hwnd, IDC_TITLE_GENERAL, L"%s:", app.LocaleString (IDS_TITLE_GENERAL)); + _r_ctrl_settextformat (hwnd, IDC_TITLE_LANGUAGE, L"%s: (Language)", app.LocaleString (IDS_TITLE_LANGUAGE)); + _r_ctrl_settextformat (hwnd, IDC_TITLE_BLOCKLIST_SPY, L"%s:", app.LocaleString (IDS_BLOCKLIST_SPY)); + _r_ctrl_settextformat (hwnd, IDC_TITLE_BLOCKLIST_UPDATE, L"%s:", app.LocaleString (IDS_BLOCKLIST_UPDATE)); + _r_ctrl_settextformat (hwnd, IDC_TITLE_BLOCKLIST_EXTRA, L"%s: (Skype, Bing, Live, Outlook, etc.)", app.LocaleString (IDS_BLOCKLIST_EXTRA)); + _r_ctrl_settextformat (hwnd, IDC_TITLE_CONNECTIONS, L"%s:", app.LocaleString (IDS_TAB_NETWORK)); + _r_ctrl_settextformat (hwnd, IDC_TITLE_SECURITY, L"%s:", app.LocaleString (IDS_TITLE_SECURITY)); + _r_ctrl_settextformat (hwnd, IDC_TITLE_CONFIRMATIONS, L"%s:", app.LocaleString (IDS_TITLE_CONFIRMATIONS)); + _r_ctrl_settextformat (hwnd, IDC_TITLE_HIGHLIGHTING, L"%s:", app.LocaleString (IDS_TITLE_HIGHLIGHTING)); + _r_ctrl_settextformat (hwnd, IDC_TITLE_NOTIFICATIONS, L"%s:", app.LocaleString (IDS_TITLE_NOTIFICATIONS)); + _r_ctrl_settextformat (hwnd, IDC_TITLE_LOGGING, L"%s:", app.LocaleString (IDS_TITLE_LOGGING)); + _r_ctrl_settextformat (hwnd, IDC_TITLE_INTERFACE, L"%s:", app.LocaleString (IDS_TITLE_INTERFACE)); + _r_ctrl_settextformat (hwnd, IDC_TITLE_EXCLUDE, L"%s:", app.LocaleString (IDS_TITLE_EXCLUDE)); + _r_ctrl_settextformat (hwnd, IDC_TITLE_ADVANCED, L"%s:", app.LocaleString (IDS_TITLE_ADVANCED)); switch (dialog_id) { case IDD_SETTINGS_GENERAL: { - SetDlgItemText (hwnd, IDC_ALWAYSONTOP_CHK, app.LocaleString (IDS_ALWAYSONTOP_CHK, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_LOADONSTARTUP_CHK, app.LocaleString (IDS_LOADONSTARTUP_CHK, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_STARTMINIMIZED_CHK, app.LocaleString (IDS_STARTMINIMIZED_CHK, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_SKIPUACWARNING_CHK, app.LocaleString (IDS_SKIPUACWARNING_CHK, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_CHECKUPDATES_CHK, app.LocaleString (IDS_CHECKUPDATES_CHK, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_CHECKUPDATESBETA_CHK, app.LocaleString (IDS_CHECKUPDATESBETA_CHK, NULL).GetString ()); + _r_ctrl_settext (hwnd, IDC_ALWAYSONTOP_CHK, app.LocaleString (IDS_ALWAYSONTOP_CHK)); + _r_ctrl_settext (hwnd, IDC_LOADONSTARTUP_CHK, app.LocaleString (IDS_LOADONSTARTUP_CHK)); + _r_ctrl_settext (hwnd, IDC_STARTMINIMIZED_CHK, app.LocaleString (IDS_STARTMINIMIZED_CHK)); + _r_ctrl_settext (hwnd, IDC_SKIPUACWARNING_CHK, app.LocaleString (IDS_SKIPUACWARNING_CHK)); + _r_ctrl_settext (hwnd, IDC_CHECKUPDATES_CHK, app.LocaleString (IDS_CHECKUPDATES_CHK)); + _r_ctrl_settext (hwnd, IDC_CHECKUPDATESBETA_CHK, app.LocaleString (IDS_CHECKUPDATESBETA_CHK)); - SetDlgItemText (hwnd, IDC_LANGUAGE_HINT, app.LocaleString (IDS_LANGUAGE_HINT, NULL).GetString ()); + _r_ctrl_settext (hwnd, IDC_LANGUAGE_HINT, app.LocaleString (IDS_LANGUAGE_HINT)); break; } case IDD_SETTINGS_RULES: { - SetDlgItemText (hwnd, IDC_RULE_BLOCKOUTBOUND, app.LocaleString (IDS_RULE_BLOCKOUTBOUND, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()).GetString ()); - SetDlgItemText (hwnd, IDC_RULE_BLOCKINBOUND, app.LocaleString (IDS_RULE_BLOCKINBOUND, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()).GetString ()); + LPCWSTR recommendedString = app.LocaleString (IDS_RECOMMENDED); - SetDlgItemText (hwnd, IDC_RULE_ALLOWLOOPBACK, app.LocaleString (IDS_RULE_ALLOWLOOPBACK, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()).GetString ()); - SetDlgItemText (hwnd, IDC_RULE_ALLOW6TO4, app.LocaleString (IDS_RULE_ALLOW6TO4, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()).GetString ()); + _r_ctrl_settextformat (hwnd, IDC_RULE_BLOCKOUTBOUND, L"%s (%s)", app.LocaleString (IDS_RULE_BLOCKOUTBOUND), recommendedString); + _r_ctrl_settextformat (hwnd, IDC_RULE_BLOCKINBOUND, L"%s (%s)", app.LocaleString (IDS_RULE_BLOCKINBOUND), recommendedString); - SetDlgItemText (hwnd, IDC_SECUREFILTERS_CHK, app.LocaleString (IDS_SECUREFILTERS_CHK, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()).GetString ()); - SetDlgItemText (hwnd, IDC_USESTEALTHMODE_CHK, app.LocaleString (IDS_USESTEALTHMODE_CHK, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()).GetString ()); - SetDlgItemText (hwnd, IDC_INSTALLBOOTTIMEFILTERS_CHK, app.LocaleString (IDS_INSTALLBOOTTIMEFILTERS_CHK, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()).GetString ()); + _r_ctrl_settextformat (hwnd, IDC_RULE_ALLOWLOOPBACK, L"%s (%s)", app.LocaleString (IDS_RULE_ALLOWLOOPBACK), recommendedString); + _r_ctrl_settextformat (hwnd, IDC_RULE_ALLOW6TO4, L"%s (%s)", app.LocaleString (IDS_RULE_ALLOW6TO4), recommendedString); - SetDlgItemText (hwnd, IDC_USENETWORKRESOLUTION_CHK, app.LocaleString (IDS_USENETWORKRESOLUTION_CHK, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_USECERTIFICATES_CHK, app.LocaleString (IDS_USECERTIFICATES_CHK, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_USEREFRESHDEVICES_CHK, app.LocaleString (IDS_USEREFRESHDEVICES_CHK, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()).GetString ()); + _r_ctrl_settextformat (hwnd, IDC_SECUREFILTERS_CHK, L"%s (%s)", app.LocaleString (IDS_SECUREFILTERS_CHK), recommendedString); + _r_ctrl_settextformat (hwnd, IDC_USESTEALTHMODE_CHK, L"%s (%s)", app.LocaleString (IDS_USESTEALTHMODE_CHK), recommendedString); + _r_ctrl_settextformat (hwnd, IDC_INSTALLBOOTTIMEFILTERS_CHK, L"%s (%s)", app.LocaleString (IDS_INSTALLBOOTTIMEFILTERS_CHK), recommendedString); + + _r_ctrl_settext (hwnd, IDC_USENETWORKRESOLUTION_CHK, app.LocaleString (IDS_USENETWORKRESOLUTION_CHK)); + _r_ctrl_settext (hwnd, IDC_USECERTIFICATES_CHK, app.LocaleString (IDS_USECERTIFICATES_CHK)); + _r_ctrl_settextformat (hwnd, IDC_USEREFRESHDEVICES_CHK, L"%s (%s)", app.LocaleString (IDS_USEREFRESHDEVICES_CHK), recommendedString); break; } case IDD_SETTINGS_BLOCKLIST: { - SetDlgItemText (hwnd, IDC_BLOCKLIST_SPY_DISABLE, app.LocaleString (IDS_DISABLE, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_BLOCKLIST_SPY_ALLOW, app.LocaleString (IDS_ACTION_ALLOW, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_BLOCKLIST_SPY_BLOCK, app.LocaleString (IDS_ACTION_BLOCK, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()).GetString ()); + LPCWSTR disableString = app.LocaleString (IDS_DISABLE); + LPCWSTR allowString = app.LocaleString (IDS_ACTION_ALLOW); + LPCWSTR blockString = app.LocaleString (IDS_ACTION_BLOCK); - SetDlgItemText (hwnd, IDC_BLOCKLIST_UPDATE_DISABLE, app.LocaleString (IDS_DISABLE, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()).GetString ()); - SetDlgItemText (hwnd, IDC_BLOCKLIST_UPDATE_ALLOW, app.LocaleString (IDS_ACTION_ALLOW, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_BLOCKLIST_UPDATE_BLOCK, app.LocaleString (IDS_ACTION_BLOCK, NULL).GetString ()); + _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 (default)", blockString); - SetDlgItemText (hwnd, IDC_BLOCKLIST_EXTRA_DISABLE, app.LocaleString (IDS_DISABLE, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()).GetString ()); - SetDlgItemText (hwnd, IDC_BLOCKLIST_EXTRA_ALLOW, app.LocaleString (IDS_ACTION_ALLOW, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_BLOCKLIST_EXTRA_BLOCK, app.LocaleString (IDS_ACTION_BLOCK, NULL).GetString ()); + _r_ctrl_settextformat (hwnd, IDC_BLOCKLIST_UPDATE_DISABLE, L"%s (default)", disableString); + _r_ctrl_settext (hwnd, IDC_BLOCKLIST_UPDATE_ALLOW, allowString); + _r_ctrl_settext (hwnd, IDC_BLOCKLIST_UPDATE_BLOCK, blockString); - _r_ctrl_settext (hwnd, IDC_BLOCKLIST_INFO, L"Author: WindowsSpyBlocker - block spying and tracking on Windows systems.", WINDOWSSPYBLOCKER_URL, WINDOWSSPYBLOCKER_URL); + _r_ctrl_settextformat (hwnd, IDC_BLOCKLIST_EXTRA_DISABLE, L"%s (default)", disableString); + _r_ctrl_settext (hwnd, IDC_BLOCKLIST_EXTRA_ALLOW, allowString); + _r_ctrl_settext (hwnd, IDC_BLOCKLIST_EXTRA_BLOCK, blockString); + + _r_ctrl_settextformat (hwnd, IDC_BLOCKLIST_INFO, L"Author: WindowsSpyBlocker - block spying and tracking on Windows systems.", WINDOWSSPYBLOCKER_URL); break; } case IDD_SETTINGS_INTERFACE: { - SetDlgItemText (hwnd, IDC_CONFIRMEXIT_CHK, app.LocaleString (IDS_CONFIRMEXIT_CHK, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_CONFIRMEXITTIMER_CHK, app.LocaleString (IDS_CONFIRMEXITTIMER_CHK, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_CONFIRMLOGCLEAR_CHK, app.LocaleString (IDS_CONFIRMLOGCLEAR_CHK, NULL).GetString ()); + _r_ctrl_settext (hwnd, IDC_CONFIRMEXIT_CHK, app.LocaleString (IDS_CONFIRMEXIT_CHK)); + _r_ctrl_settext (hwnd, IDC_CONFIRMEXITTIMER_CHK, app.LocaleString (IDS_CONFIRMEXITTIMER_CHK)); + _r_ctrl_settext (hwnd, IDC_CONFIRMLOGCLEAR_CHK, app.LocaleString (IDS_CONFIRMLOGCLEAR_CHK)); break; } @@ -872,46 +890,41 @@ INT_PTR CALLBACK SettingsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam if (ptr_clr) { _r_fastlock_acquireshared (&lock_checkbox); - _r_listview_setitem (hwnd, IDC_COLORS, i, 0, app.LocaleString (ptr_clr->locale_id, NULL).GetString ()); + _r_listview_setitem (hwnd, IDC_COLORS, i, 0, app.LocaleString (ptr_clr->locale_id)); _r_fastlock_releaseshared (&lock_checkbox); } } - SetDlgItemText (hwnd, IDC_COLORS_HINT, app.LocaleString (IDS_COLORS_HINT, NULL).GetString ()); + _r_ctrl_settext (hwnd, IDC_COLORS_HINT, app.LocaleString (IDS_COLORS_HINT)); break; } case IDD_SETTINGS_NOTIFICATIONS: { + _r_ctrl_settext (hwnd, IDC_ENABLENOTIFICATIONS_CHK, app.LocaleString (IDS_ENABLENOTIFICATIONS_CHK)); + _r_ctrl_settext (hwnd, IDC_NOTIFICATIONSOUND_CHK, app.LocaleString (IDS_NOTIFICATIONSOUND_CHK)); + _r_ctrl_settext (hwnd, IDC_NOTIFICATIONONTRAY_CHK, app.LocaleString (IDS_NOTIFICATIONONTRAY_CHK)); - SetDlgItemText (hwnd, IDC_ENABLENOTIFICATIONS_CHK, app.LocaleString (IDS_ENABLENOTIFICATIONS_CHK, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_NOTIFICATIONSOUND_CHK, app.LocaleString (IDS_NOTIFICATIONSOUND_CHK, NULL).GetString ()); - SetDlgItemText (hwnd, IDC_NOTIFICATIONONTRAY_CHK, app.LocaleString (IDS_NOTIFICATIONONTRAY_CHK, NULL).GetString ()); + _r_ctrl_settext (hwnd, IDC_NOTIFICATIONTIMEOUT_HINT, app.LocaleString (IDS_NOTIFICATIONTIMEOUT_HINT)); - SetDlgItemText (hwnd, IDC_NOTIFICATIONTIMEOUT_HINT, app.LocaleString (IDS_NOTIFICATIONTIMEOUT_HINT, NULL).GetString ()); - - rstring exclude = app.LocaleString (IDS_TITLE_EXCLUDE, NULL); - - SetDlgItemText (hwnd, IDC_EXCLUDEBLOCKLIST_CHK, _r_fmt (L"%s %s", exclude.GetString (), app.LocaleString (IDS_EXCLUDEBLOCKLIST_CHK, NULL).GetString ()).GetString ()); - SetDlgItemText (hwnd, IDC_EXCLUDECUSTOM_CHK, _r_fmt (L"%s %s", exclude.GetString (), app.LocaleString (IDS_EXCLUDECUSTOM_CHK, NULL).GetString ()).GetString ()); + _r_ctrl_settextformat (hwnd, IDC_EXCLUDEBLOCKLIST_CHK, L"%s %s", app.LocaleString (IDS_TITLE_EXCLUDE), app.LocaleString (IDS_EXCLUDEBLOCKLIST_CHK)); + _r_ctrl_settextformat (hwnd, IDC_EXCLUDECUSTOM_CHK, L"%s %s", app.LocaleString (IDS_TITLE_EXCLUDE), app.LocaleString (IDS_EXCLUDECUSTOM_CHK)); break; } case IDD_SETTINGS_LOGGING: { - SetDlgItemText (hwnd, IDC_ENABLELOG_CHK, app.LocaleString (IDS_ENABLELOG_CHK, NULL).GetString ()); + _r_ctrl_settext (hwnd, IDC_ENABLELOG_CHK, app.LocaleString (IDS_ENABLELOG_CHK)); - SetDlgItemText (hwnd, IDC_LOGVIEWER_HINT, app.LocaleString (IDS_LOGVIEWER_HINT, L":").GetString ()); - SetDlgItemText (hwnd, IDC_LOGSIZELIMIT_HINT, app.LocaleString (IDS_LOGSIZELIMIT_HINT, NULL).GetString ()); + _r_ctrl_settextformat (hwnd, IDC_LOGVIEWER_HINT, L"%s:", app.LocaleString (IDS_LOGVIEWER_HINT)); + _r_ctrl_settext (hwnd, IDC_LOGSIZELIMIT_HINT, app.LocaleString (IDS_LOGSIZELIMIT_HINT)); - SetDlgItemText (hwnd, IDC_ENABLEUILOG_CHK, app.LocaleString (IDS_ENABLEUILOG_CHK, L" (session only)").GetString ()); + _r_ctrl_settextformat (hwnd, IDC_ENABLEUILOG_CHK, L"%s (session only)", app.LocaleString (IDS_ENABLEUILOG_CHK)); - rstring exclude = app.LocaleString (IDS_TITLE_EXCLUDE, NULL); - - SetDlgItemText (hwnd, IDC_EXCLUDESTEALTH_CHK, _r_fmt (L"%s %s", exclude.GetString (), app.LocaleString (IDS_EXCLUDESTEALTH_CHK, NULL).GetString ()).GetString ()); - SetDlgItemText (hwnd, IDC_EXCLUDECLASSIFYALLOW_CHK, _r_fmt (L"%s %s", exclude.GetString (), app.LocaleString (IDS_EXCLUDECLASSIFYALLOW_CHK, (L" [win8+]")).GetString ()).GetString ()); + _r_ctrl_settextformat (hwnd, IDC_EXCLUDESTEALTH_CHK, L"%s %s", app.LocaleString (IDS_TITLE_EXCLUDE), app.LocaleString (IDS_EXCLUDESTEALTH_CHK)); + _r_ctrl_settextformat (hwnd, IDC_EXCLUDECLASSIFYALLOW_CHK, L"%s %s [win8+]", app.LocaleString (IDS_TITLE_EXCLUDE), app.LocaleString (IDS_EXCLUDECLASSIFYALLOW_CHK)); _r_wnd_addstyle (hwnd, IDC_LOGPATH_BTN, app.IsClassicUI () ? WS_EX_STATICEDGE : 0, WS_EX_STATICEDGE, GWL_EXSTYLE); _r_wnd_addstyle (hwnd, IDC_LOGVIEWER_BTN, app.IsClassicUI () ? WS_EX_STATICEDGE : 0, WS_EX_STATICEDGE, GWL_EXSTYLE); @@ -953,22 +966,22 @@ INT_PTR CALLBACK SettingsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam INT ctrl_id = GetDlgCtrlID ((HWND)(lpnmdi->hdr.idFrom)); if (ctrl_id == IDC_RULE_BLOCKOUTBOUND) - _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_RULE_BLOCKOUTBOUND, NULL).GetString ()); + _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_RULE_BLOCKOUTBOUND)); else if (ctrl_id == IDC_RULE_BLOCKINBOUND) - _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_RULE_BLOCKINBOUND, NULL).GetString ()); + _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_RULE_BLOCKINBOUND)); else if (ctrl_id == IDC_RULE_ALLOWLOOPBACK) - _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_RULE_ALLOWLOOPBACK_HINT, NULL).GetString ()); + _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_RULE_ALLOWLOOPBACK_HINT)); else if (ctrl_id == IDC_USESTEALTHMODE_CHK) - _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_USESTEALTHMODE_HINT, NULL).GetString ()); + _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_USESTEALTHMODE_HINT)); else if (ctrl_id == IDC_INSTALLBOOTTIMEFILTERS_CHK) - _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_INSTALLBOOTTIMEFILTERS_HINT, NULL).GetString ()); + _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_INSTALLBOOTTIMEFILTERS_HINT)); else if (ctrl_id == IDC_SECUREFILTERS_CHK) - _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_SECUREFILTERS_HINT, NULL).GetString ()); + _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_SECUREFILTERS_HINT)); if (!_r_str_isempty (buffer)) lpnmdi->lpszText = buffer; @@ -998,7 +1011,7 @@ INT_PTR CALLBACK SettingsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam if (ptr_clr) { - app.ConfigSetBoolean (ptr_clr->pcfg_name, is_enabled, L"colors"); + app.ConfigSetBoolean (_r_obj_getstring (ptr_clr->configName), is_enabled, L"colors"); _r_listview_redraw (app.GetHWND (), (INT)_r_tab_getlparam (app.GetHWND (), IDC_TAB, INVALID_INT), INVALID_INT); } @@ -1036,11 +1049,12 @@ INT_PTR CALLBACK SettingsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam COLORREF cust[16] = {0}; SIZE_T index = 0; + PITEM_COLOR ptr_clr; - for (auto &ptr_clr : colors) + for (auto it = colors.begin (); it != colors.end (); ++it) { - if (ptr_clr) - cust[index++] = ptr_clr->default_clr; + ptr_clr = *it; + cust[index++] = ptr_clr->default_clr; } cc.lStructSize = sizeof (cc); @@ -1052,7 +1066,7 @@ INT_PTR CALLBACK SettingsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam if (ChooseColor (&cc)) { ptr_clr_current->new_clr = cc.rgbResult; - app.ConfigSetUlong (ptr_clr_current->pcfg_value, cc.rgbResult, L"colors"); + app.ConfigSetUlong (_r_obj_getstring (ptr_clr_current->configValue), cc.rgbResult, L"colors"); _r_listview_redraw (hwnd, IDC_COLORS, INVALID_INT); _r_listview_redraw (app.GetHWND (), (INT)_r_tab_getlparam (app.GetHWND (), IDC_TAB, INVALID_INT), INVALID_INT); @@ -1079,7 +1093,7 @@ INT_PTR CALLBACK SettingsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam NMLVEMPTYMARKUP* lpnmlv = (NMLVEMPTYMARKUP*)lparam; lpnmlv->dwFlags = EMF_CENTERED; - _r_str_copy (lpnmlv->szMarkup, RTL_NUMBER_OF (lpnmlv->szMarkup), app.LocaleString (IDS_STATUS_EMPTY, NULL).GetString ()); + _r_str_copy (lpnmlv->szMarkup, RTL_NUMBER_OF (lpnmlv->szMarkup), app.LocaleString (IDS_STATUS_EMPTY)); SetWindowLongPtr (hwnd, DWLP_MSGRESULT, TRUE); return TRUE; @@ -1288,13 +1302,17 @@ INT_PTR CALLBACK SettingsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam { if (notify_code == EN_KILLFOCUS) { - rstring logpath = _r_ctrl_gettext (hwnd, ctrl_id); + PR_STRING logpath = _r_ctrl_gettext (hwnd, ctrl_id); - if (!logpath.IsEmpty ()) + if (logpath) { - app.ConfigSetString (L"LogPath", _r_path_unexpand (logpath.GetString ()).GetString ()); + _r_obj_movereference (&logpath, _r_path_unexpand (_r_obj_getstring (logpath))); + + app.ConfigSetString (L"LogPath", _r_obj_getstring (logpath)); _app_loginit (app.ConfigGetBoolean (L"IsLogEnabled", FALSE)); + + _r_obj_dereference (logpath); } } @@ -1305,9 +1323,13 @@ INT_PTR CALLBACK SettingsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam { OPENFILENAME ofn = {0}; - WCHAR path[MAX_PATH] = {0}; - GetDlgItemText (hwnd, IDC_LOGPATH, path, RTL_NUMBER_OF (path)); - _r_str_copy (path, RTL_NUMBER_OF (path), _r_path_expand (path).GetString ()); + WCHAR path[512]; + PR_STRING expandedPath = NULL; + + 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; @@ -1320,14 +1342,17 @@ INT_PTR CALLBACK SettingsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam if (GetSaveFileName (&ofn)) { - _r_str_copy (path, RTL_NUMBER_OF (path), _r_path_unexpand (path).GetString ()); + _r_obj_movereference (&expandedPath, _r_path_unexpand (path)); - app.ConfigSetString (L"LogPath", path); - SetDlgItemText (hwnd, IDC_LOGPATH, path); + app.ConfigSetString (L"LogPath", _r_obj_getstring (expandedPath)); + _r_ctrl_settext (hwnd, IDC_LOGPATH, _r_obj_getstringorempty (expandedPath)); _app_loginit (app.ConfigGetBoolean (L"IsLogEnabled", FALSE)); } + if (expandedPath) + _r_obj_dereference (expandedPath); + break; } @@ -1335,10 +1360,16 @@ INT_PTR CALLBACK SettingsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam { if (notify_code == EN_KILLFOCUS) { - rstring logviewer = _r_ctrl_gettext (hwnd, ctrl_id); + PR_STRING logviewer = _r_ctrl_gettext (hwnd, ctrl_id); - if (!logviewer.IsEmpty ()) - app.ConfigSetString (L"LogViewer", _r_path_unexpand (logviewer.GetString ()).GetString ()); + if (logviewer) + { + _r_obj_movereference (&logviewer, _r_path_unexpand (_r_obj_getstring (logviewer))); + + app.ConfigSetString (L"LogViewer", _r_obj_getstring (logviewer)); + + _r_obj_dereference (logviewer); + } } break; @@ -1348,9 +1379,13 @@ INT_PTR CALLBACK SettingsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam { OPENFILENAME ofn = {0}; - WCHAR path[MAX_PATH] = {0}; - GetDlgItemText (hwnd, IDC_LOGVIEWER, path, RTL_NUMBER_OF (path)); - _r_str_copy (path, RTL_NUMBER_OF (path), _r_path_expand (path).GetString ()); + WCHAR path[512]; + PR_STRING expandedPath = NULL; + + 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; @@ -1363,12 +1398,15 @@ INT_PTR CALLBACK SettingsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam if (GetOpenFileName (&ofn)) { - _r_str_copy (path, RTL_NUMBER_OF (path), _r_path_unexpand (path).GetString ()); + _r_obj_movereference (&expandedPath, _r_path_unexpand (path)); - app.ConfigSetString (L"LogViewer", path); - SetDlgItemText (hwnd, IDC_LOGVIEWER, path); + app.ConfigSetString (L"LogViewer", _r_obj_getstringorempty (expandedPath)); + _r_ctrl_settext (hwnd, IDC_LOGVIEWER, _r_obj_getstringorempty (expandedPath)); } + if (expandedPath) + _r_obj_dereference (expandedPath); + break; } @@ -1504,20 +1542,20 @@ VOID _app_imagelist_init (HWND hwnd) SAFE_DELETE_ICON (config.hicon_large); SAFE_DELETE_ICON (config.hicon_small); - SAFE_DELETE_ICON (config.hicon_package); + SAFE_DELETE_ICON (config.hicon_uwp); // get default icon for executable - _app_getfileicon (_r_path_expand (PATH_NTOSKRNL).GetString (), FALSE, &config.icon_id, &config.hicon_large); - _app_getfileicon (_r_path_expand (PATH_NTOSKRNL).GetString (), TRUE, NULL, &config.hicon_small); - _app_getfileicon (_r_path_expand (PATH_SHELL32).GetString (), FALSE, &config.icon_service_id, NULL); + _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_validversion (6, 2)) { - if (!_app_getfileicon (_r_path_expand (PATH_WINSTORE).GetString (), TRUE, &config.icon_uwp_id, &config.hicon_package)) + 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_package = CopyIcon (config.hicon_small); + config.hicon_uwp = CopyIcon (config.hicon_small); } } @@ -1555,9 +1593,13 @@ VOID _app_imagelist_init (HWND hwnd) // 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) { @@ -1567,9 +1609,13 @@ VOID _app_imagelist_init (HWND hwnd) // 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) { @@ -1648,41 +1694,42 @@ VOID _app_tabs_init (HWND hwnd) SetWindowPos (GetDlgItem (hwnd, IDC_TAB), NULL, 0, 0, _r_calc_rectwidth (INT, &rc), _r_calc_rectheight (INT, &rc), SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOOWNERZORDER); + PR_STRING localizedString = NULL; HINSTANCE hinst = app.GetHINSTANCE (); 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++, app.LocaleString (IDS_TAB_APPS, NULL).GetString (), I_IMAGENONE, IDC_APPS_PROFILE); + _r_tab_additem (hwnd, IDC_TAB, tabs_count++, app.LocaleString (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++, app.LocaleString (IDS_TAB_SERVICES, NULL).GetString (), I_IMAGENONE, IDC_APPS_SERVICE); + _r_tab_additem (hwnd, IDC_TAB, tabs_count++, app.LocaleString (IDS_TAB_SERVICES), I_IMAGENONE, IDC_APPS_SERVICE); // uwp apps (win8+) if (_r_sys_validversion (6, 2)) { 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++, app.LocaleString (IDS_TAB_PACKAGES, NULL).GetString (), I_IMAGENONE, IDC_APPS_UWP); + _r_tab_additem (hwnd, IDC_TAB, tabs_count++, app.LocaleString (IDS_TAB_PACKAGES), I_IMAGENONE, IDC_APPS_UWP); } if (!app.ConfigGetBoolean (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++, app.LocaleString (IDS_TRAY_BLOCKLIST_RULES, NULL).GetString (), I_IMAGENONE, IDC_RULES_BLOCKLIST); + _r_tab_additem (hwnd, IDC_TAB, tabs_count++, app.LocaleString (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++, app.LocaleString (IDS_TRAY_SYSTEM_RULES, NULL).GetString (), I_IMAGENONE, IDC_RULES_SYSTEM); + _r_tab_additem (hwnd, IDC_TAB, tabs_count++, app.LocaleString (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++, app.LocaleString (IDS_TRAY_USER_RULES, NULL).GetString (), I_IMAGENONE, IDC_RULES_CUSTOM); + _r_tab_additem (hwnd, IDC_TAB, tabs_count++, app.LocaleString (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++, app.LocaleString (IDS_TAB_NETWORK, NULL).GetString (), I_IMAGENONE, IDC_NETWORK); + _r_tab_additem (hwnd, IDC_TAB, tabs_count++, app.LocaleString (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++, app.LocaleString (IDS_TITLE_LOGGING, NULL).GetString (), I_IMAGENONE, IDC_LOG); + _r_tab_additem (hwnd, IDC_TAB, tabs_count++, app.LocaleString (IDS_TITLE_LOGGING), I_IMAGENONE, IDC_LOG); for (INT i = 0; i < tabs_count; i++) { @@ -1704,14 +1751,14 @@ VOID _app_tabs_init (HWND hwnd) if (listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_APPS_UWP) { - _r_listview_addcolumn (hwnd, listview_id, 0, app.LocaleString (IDS_NAME, NULL).GetString (), 0, LVCFMT_LEFT); - _r_listview_addcolumn (hwnd, listview_id, 1, app.LocaleString (IDS_ADDED, NULL).GetString (), 0, LVCFMT_RIGHT); + _r_listview_addcolumn (hwnd, listview_id, 0, app.LocaleString (IDS_NAME), 0, LVCFMT_LEFT); + _r_listview_addcolumn (hwnd, listview_id, 1, app.LocaleString (IDS_ADDED), 0, LVCFMT_RIGHT); } else { - _r_listview_addcolumn (hwnd, listview_id, 0, app.LocaleString (IDS_NAME, NULL).GetString (), 0, LVCFMT_LEFT); - _r_listview_addcolumn (hwnd, listview_id, 1, app.LocaleString (IDS_PROTOCOL, NULL).GetString (), 0, LVCFMT_RIGHT); - _r_listview_addcolumn (hwnd, listview_id, 2, app.LocaleString (IDS_DIRECTION, NULL).GetString (), 0, LVCFMT_RIGHT); + _r_listview_addcolumn (hwnd, listview_id, 0, app.LocaleString (IDS_NAME), 0, LVCFMT_LEFT); + _r_listview_addcolumn (hwnd, listview_id, 1, app.LocaleString (IDS_PROTOCOL), 0, LVCFMT_RIGHT); + _r_listview_addcolumn (hwnd, listview_id, 2, app.LocaleString (IDS_DIRECTION), 0, LVCFMT_RIGHT); } _r_listview_addgroup (hwnd, listview_id, 0, L"", 0, LVGS_COLLAPSIBLE, LVGS_COLLAPSIBLE); @@ -1722,22 +1769,31 @@ VOID _app_tabs_init (HWND hwnd) { _r_listview_setstyle (hwnd, listview_id, listview_ex_style & ~LVS_EX_CHECKBOXES, FALSE); // no checkboxes - _r_listview_addcolumn (hwnd, listview_id, 0, app.LocaleString (IDS_NAME, NULL).GetString (), 0, LVCFMT_LEFT); - _r_listview_addcolumn (hwnd, listview_id, 1, app.LocaleString (IDS_ADDRESS, _r_fmt (L" (%s)", SZ_DIRECTION_LOCAL).GetString ()).GetString (), 0, LVCFMT_LEFT); - _r_listview_addcolumn (hwnd, listview_id, 2, app.LocaleString (IDS_PORT, _r_fmt (L" (%s)", SZ_DIRECTION_LOCAL).GetString ()).GetString (), 0, LVCFMT_RIGHT); - _r_listview_addcolumn (hwnd, listview_id, 3, app.LocaleString (IDS_ADDRESS, _r_fmt (L" (%s)", SZ_DIRECTION_REMOTE).GetString ()).GetString (), 0, LVCFMT_LEFT); - _r_listview_addcolumn (hwnd, listview_id, 4, app.LocaleString (IDS_PORT, _r_fmt (L" (%s)", SZ_DIRECTION_REMOTE).GetString ()).GetString (), 0, LVCFMT_RIGHT); - _r_listview_addcolumn (hwnd, listview_id, 5, app.LocaleString (IDS_PROTOCOL, NULL).GetString (), 0, LVCFMT_RIGHT); + _r_listview_addcolumn (hwnd, listview_id, 0, app.LocaleString (IDS_NAME), 0, LVCFMT_LEFT); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s (" SZ_DIRECTION_LOCAL L")", app.LocaleString (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")", app.LocaleString (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")", app.LocaleString (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")", app.LocaleString (IDS_PORT))); + _r_listview_addcolumn (hwnd, listview_id, 4, _r_obj_getstringorempty (localizedString), 0, LVCFMT_RIGHT); + + _r_listview_addcolumn (hwnd, listview_id, 5, app.LocaleString (IDS_PROTOCOL), 0, LVCFMT_RIGHT); if (listview_id == IDC_NETWORK) { - _r_listview_addcolumn (hwnd, listview_id, 6, app.LocaleString (IDS_STATE, NULL).GetString (), 0, LVCFMT_RIGHT); + _r_listview_addcolumn (hwnd, listview_id, 6, app.LocaleString (IDS_STATE), 0, LVCFMT_RIGHT); } else if (listview_id == IDC_LOG) { - _r_listview_addcolumn (hwnd, listview_id, 6, app.LocaleString (IDS_FILTER, NULL).GetString (), 0, LVCFMT_LEFT); - _r_listview_addcolumn (hwnd, listview_id, 7, app.LocaleString (IDS_DIRECTION, NULL).GetString (), 0, LVCFMT_RIGHT); - _r_listview_addcolumn (hwnd, listview_id, 8, app.LocaleString (IDS_STATE, NULL).GetString (), 0, LVCFMT_RIGHT); + _r_listview_addcolumn (hwnd, listview_id, 6, app.LocaleString (IDS_FILTER), 0, LVCFMT_LEFT); + _r_listview_addcolumn (hwnd, listview_id, 7, app.LocaleString (IDS_DIRECTION), 0, LVCFMT_RIGHT); + _r_listview_addcolumn (hwnd, listview_id, 8, app.LocaleString (IDS_STATE), 0, LVCFMT_RIGHT); } } @@ -1745,16 +1801,14 @@ VOID _app_tabs_init (HWND hwnd) BringWindowToTop (hlistview); // HACK!!! } -} -PVOID allocate_pugixml (size_t size) -{ - return _r_mem_allocatezero (size); + if (localizedString) + _r_obj_dereference (localizedString); } VOID _app_initialize () { - pugi::set_memory_management_functions (&allocate_pugixml, &_r_mem_free); // set allocation routine + pugi::set_memory_management_functions ((pugi::allocation_function)_r_mem_allocatezero, _r_mem_free); // set allocation routine // initialize spinlocks _r_fastlock_initialize (&lock_apply); @@ -1765,7 +1819,7 @@ VOID _app_initialize () // set privileges { - DWORD privileges[] = { + ULONG privileges[] = { SE_SECURITY_PRIVILEGE, SE_TAKE_OWNERSHIP_PRIVILEGE, SE_BACKUP_PRIVILEGE, @@ -1782,14 +1836,18 @@ VOID _app_initialize () // 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, app.GetProfileDirectory ()); - _r_str_printf (config.profile_internal_path, RTL_NUMBER_OF (config.profile_internal_path), L"%s\\" XML_PROFILE_INTERNAL, app.GetProfileDirectory ()); + _r_str_printf (config.profile_path, RTL_NUMBER_OF (config.profile_path), L"%s\\" XML_PROFILE, app.GetAppProfileDirectory ()); + _r_str_printf (config.profile_path_backup, RTL_NUMBER_OF (config.profile_path_backup), L"%s\\" XML_PROFILE L".bak", app.GetAppProfileDirectory ()); + _r_str_printf (config.profile_internal_path, RTL_NUMBER_OF (config.profile_internal_path), L"%s\\" XML_PROFILE_INTERNAL, app.GetAppProfileDirectory ()); - _r_str_copy (config.profile_path_backup, RTL_NUMBER_OF (config.profile_path_backup), _r_fmt (L"%s.bak", config.profile_path).GetString ()); + 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 (app.GetAppBinaryPath ()); config.ntoskrnl_hash = _r_str_hash (PROC_SYSTEM_NAME); - config.svchost_hash = _r_str_hash (_r_path_expand (PATH_SVCHOST).GetString ()); - config.my_hash = _r_str_hash (app.GetBinaryPath ()); + config.svchost_hash = _r_str_hash (config.svchost_path); // initialize timers { @@ -1800,13 +1858,13 @@ VOID _app_initialize () timers.clear (); - timers.push_back (_r_calc_minutes2seconds (time_t, 2)); - timers.push_back (_r_calc_minutes2seconds (time_t, 5)); - timers.push_back (_r_calc_minutes2seconds (time_t, 10)); - timers.push_back (_r_calc_hours2seconds (time_t, 1)); - timers.push_back (_r_calc_hours2seconds (time_t, 2)); - timers.push_back (_r_calc_hours2seconds (time_t, 4)); - timers.push_back (_r_calc_hours2seconds (time_t, 6)); + 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 @@ -1864,15 +1922,19 @@ find_wrap: for (; current_item < last_item; current_item++) { - rstring item_text = _r_listview_getitemtext (hwnd, listview_id, current_item, 0); + PR_STRING item_text = _r_listview_getitemtext (hwnd, listview_id, current_item, 0); - if (item_text.IsEmpty ()) - continue; - - if (StrStrNIW (item_text.GetString (), lpfr->lpstrFindWhat, (UINT)item_text.GetLength ()) != NULL) + if (item_text) { - _app_showitem (hwnd, listview_id, current_item, INVALID_INT); - return FALSE; + 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); } } @@ -1898,6 +1960,8 @@ find_wrap: _app_initialize (); + _r_wnd_center (hwnd, NULL); + // init buffered paint BufferedPaintInit (); @@ -1951,7 +2015,12 @@ find_wrap: // add blocklist to update if (!app.ConfigGetBoolean (L"IsInternalRulesDisabled", FALSE)) - app.UpdateAddComponent (L"Internal rules", L"profile_internal", _r_fmt (L"%" TEXT (PR_LONG64), config.profile_internal_timestamp).GetString (), config.profile_internal_path, FALSE); + { + WCHAR internalProfileVersion[128]; + _r_str_printf (internalProfileVersion, RTL_NUMBER_OF (internalProfileVersion), L"%" TEXT (PR_LONG64), config.profile_internal_timestamp); + + app.UpdateAddComponent (L"Internal rules", L"profile_internal", internalProfileVersion, config.profile_internal_path, FALSE); + } // initialize tab _app_settab_id (hwnd, app.ConfigGetInteger (L"CurrentTab", IDC_APPS_PROFILE)); @@ -1982,7 +2051,7 @@ find_wrap: } else { - _r_status_settext (hwnd, IDC_STATUSBAR, 0, app.LocaleString (_app_getinterfacestatelocale (install_type), NULL).GetString ()); + _r_status_settext (hwnd, IDC_STATUSBAR, 0, app.LocaleString (_app_getinterfacestatelocale (install_type))); } } @@ -2090,102 +2159,138 @@ find_wrap: case RM_LOCALIZE: { + PR_STRING localizedString = NULL; HMENU hmenu = GetMenu (hwnd); if (hmenu) { - app.LocaleMenu (hmenu, IDS_FILE, 0, TRUE, NULL); - app.LocaleMenu (hmenu, IDS_SETTINGS, IDM_SETTINGS, FALSE, L"...\tF2"); - app.LocaleMenu (hmenu, IDS_ADD_FILE, IDM_ADD_FILE, FALSE, L"..."); - app.LocaleMenu (GetSubMenu (hmenu, 0), IDS_EXPORT, 5, TRUE, NULL); - app.LocaleMenu (GetSubMenu (hmenu, 0), IDS_IMPORT, 6, TRUE, NULL); - app.LocaleMenu (hmenu, IDS_IMPORT, IDM_IMPORT, FALSE, L"...\tCtrl+O"); - app.LocaleMenu (hmenu, IDS_EXPORT, IDM_EXPORT, FALSE, L"...\tCtrl+S"); - app.LocaleMenu (hmenu, IDS_EXIT, IDM_EXIT, FALSE, NULL); + _r_menu_setitemtext (hmenu, 0, app.LocaleString (IDS_FILE), TRUE); + _r_menu_setitemtext (hmenu, 1, app.LocaleString (IDS_EDIT), TRUE); + _r_menu_setitemtext (hmenu, 2, app.LocaleString (IDS_VIEW), TRUE); + _r_menu_setitemtext (hmenu, 3, app.LocaleString (IDS_TRAY_RULES), TRUE); + _r_menu_setitemtext (hmenu, 4, app.LocaleString (IDS_TRAY_BLOCKLIST_RULES), TRUE); + _r_menu_setitemtext (hmenu, 5, app.LocaleString (IDS_HELP), TRUE); - app.LocaleMenu (hmenu, IDS_EDIT, 1, TRUE, NULL); + _r_obj_movereference (&localizedString, _r_format_string (L"%s...\tF2", app.LocaleString (IDS_SETTINGS))); + _r_menu_setitemtext (hmenu, IDM_SETTINGS, _r_obj_getstringorempty (localizedString), FALSE); - app.LocaleMenu (hmenu, IDS_PURGE_UNUSED, IDM_PURGE_UNUSED, FALSE, L"\tCtrl+Shift+X"); - app.LocaleMenu (hmenu, IDS_PURGE_TIMERS, IDM_PURGE_TIMERS, FALSE, L"\tCtrl+Shift+T"); + _r_obj_movereference (&localizedString, _r_format_string (L"%s...", app.LocaleString (IDS_ADD_FILE))); + _r_menu_setitemtext (hmenu, IDM_ADD_FILE, _r_obj_getstringorempty (localizedString), FALSE); - app.LocaleMenu (hmenu, IDS_FIND, IDM_FIND, FALSE, L"...\tCtrl+F"); - app.LocaleMenu (hmenu, IDS_FINDNEXT, IDM_FINDNEXT, FALSE, L"\tF3"); + _r_obj_movereference (&localizedString, _r_format_string (L"%s...\tCtrl+O", app.LocaleString (IDS_IMPORT))); + _r_menu_setitemtext (hmenu, IDM_IMPORT, _r_obj_getstringorempty (localizedString), FALSE); - app.LocaleMenu (hmenu, IDS_REFRESH, IDM_REFRESH, FALSE, L"\tF5"); + _r_obj_movereference (&localizedString, _r_format_string (L"%s...\tCtrl+S", app.LocaleString (IDS_EXPORT))); + _r_menu_setitemtext (hmenu, IDM_EXPORT, _r_obj_getstringorempty (localizedString), FALSE); - app.LocaleMenu (hmenu, IDS_VIEW, 2, TRUE, NULL); + _r_menu_setitemtext (hmenu, IDM_EXIT, app.LocaleString (IDS_EXIT), FALSE); - app.LocaleMenu (hmenu, IDS_ALWAYSONTOP_CHK, IDM_ALWAYSONTOP_CHK, FALSE, NULL); - app.LocaleMenu (hmenu, IDS_SHOWFILENAMESONLY_CHK, IDM_SHOWFILENAMESONLY_CHK, FALSE, NULL); - app.LocaleMenu (hmenu, IDS_AUTOSIZECOLUMNS_CHK, IDM_AUTOSIZECOLUMNS_CHK, FALSE, NULL); - app.LocaleMenu (hmenu, IDS_ENABLESPECIALGROUP_CHK, IDM_ENABLESPECIALGROUP_CHK, FALSE, NULL); + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+Shift+X", app.LocaleString (IDS_PURGE_UNUSED))); + _r_menu_setitemtext (hmenu, IDM_PURGE_UNUSED, _r_obj_getstringorempty (localizedString), FALSE); - app.LocaleMenu (GetSubMenu (hmenu, 2), IDS_ICONS, 5, TRUE, NULL); - app.LocaleMenu (hmenu, IDS_ICONSSMALL, IDM_SIZE_SMALL, FALSE, NULL); - app.LocaleMenu (hmenu, IDS_ICONSLARGE, IDM_SIZE_LARGE, FALSE, NULL); - app.LocaleMenu (hmenu, IDS_ICONSEXTRALARGE, IDM_SIZE_EXTRALARGE, FALSE, NULL); + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+Shift+T", app.LocaleString (IDS_PURGE_TIMERS))); + _r_menu_setitemtext (hmenu, IDM_PURGE_TIMERS, _r_obj_getstringorempty (localizedString), FALSE); - app.LocaleMenu (hmenu, IDS_VIEW_ICON, IDM_VIEW_ICON, FALSE, NULL); - app.LocaleMenu (hmenu, IDS_VIEW_DETAILS, IDM_VIEW_DETAILS, FALSE, NULL); - app.LocaleMenu (hmenu, IDS_VIEW_TILE, IDM_VIEW_TILE, FALSE, NULL); + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+F", app.LocaleString (IDS_FIND))); + _r_menu_setitemtext (hmenu, IDM_FIND, _r_obj_getstringorempty (localizedString), FALSE); - app.LocaleMenu (hmenu, IDS_ICONSISHIDDEN, IDM_ICONSISHIDDEN, FALSE, NULL); + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tF3", app.LocaleString (IDS_FINDNEXT))); + _r_menu_setitemtext (hmenu, IDM_FINDNEXT, _r_obj_getstringorempty (localizedString), FALSE); - app.LocaleMenu (GetSubMenu (hmenu, 2), IDS_LANGUAGE, LANG_MENU, TRUE, L" (Language)"); + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tF5", app.LocaleString (IDS_REFRESH))); + _r_menu_setitemtext (hmenu, IDM_REFRESH, _r_obj_getstringorempty (localizedString), FALSE); - app.LocaleMenu (hmenu, IDS_FONT, IDM_FONT, FALSE, L"..."); + _r_menu_setitemtext (hmenu, IDM_ALWAYSONTOP_CHK, app.LocaleString (IDS_ALWAYSONTOP_CHK), FALSE); + _r_menu_setitemtext (hmenu, IDM_SHOWFILENAMESONLY_CHK, app.LocaleString (IDS_SHOWFILENAMESONLY_CHK), FALSE); + _r_menu_setitemtext (hmenu, IDM_AUTOSIZECOLUMNS_CHK, app.LocaleString (IDS_AUTOSIZECOLUMNS_CHK), FALSE); + _r_menu_setitemtext (hmenu, IDM_ENABLESPECIALGROUP_CHK, app.LocaleString (IDS_ENABLESPECIALGROUP_CHK), FALSE); - rstring recommended = app.LocaleString (IDS_RECOMMENDED, NULL); + _r_menu_setitemtext (GetSubMenu (hmenu, 2), 5, app.LocaleString (IDS_ICONS), TRUE); - app.LocaleMenu (hmenu, IDS_TRAY_RULES, 3, TRUE, NULL); + _r_menu_setitemtext (hmenu, IDM_SIZE_SMALL, app.LocaleString (IDS_ICONSSMALL), FALSE); + _r_menu_setitemtext (hmenu, IDM_SIZE_LARGE, app.LocaleString (IDS_ICONSLARGE), FALSE); + _r_menu_setitemtext (hmenu, IDM_SIZE_EXTRALARGE, app.LocaleString (IDS_ICONSEXTRALARGE), FALSE); - app.LocaleMenu (hmenu, IDS_TAB_NETWORK, IDM_CONNECTIONS_TITLE, FALSE, NULL); - app.LocaleMenu (hmenu, IDS_TITLE_SECURITY, IDM_SECURITY_TITLE, FALSE, NULL); - app.LocaleMenu (hmenu, IDS_TITLE_ADVANCED, IDM_ADVANCED_TITLE, FALSE, NULL); + _r_menu_setitemtext (hmenu, IDM_VIEW_ICON, app.LocaleString (IDS_VIEW_ICON), FALSE); + _r_menu_setitemtext (hmenu, IDM_VIEW_DETAILS, app.LocaleString (IDS_VIEW_DETAILS), FALSE); + _r_menu_setitemtext (hmenu, IDM_VIEW_TILE, app.LocaleString (IDS_VIEW_TILE), FALSE); + + _r_menu_setitemtext (hmenu, IDM_ICONSISHIDDEN, app.LocaleString (IDS_ICONSISHIDDEN), FALSE); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s (Language)", app.LocaleString (IDS_LANGUAGE))); + _r_menu_setitemtext (GetSubMenu (hmenu, 2), LANG_MENU, _r_obj_getstringorempty (localizedString), TRUE); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s...", app.LocaleString (IDS_FONT))); + _r_menu_setitemtext (hmenu, IDM_FONT, _r_obj_getstringorempty (localizedString), FALSE); + + LPCWSTR recommendedString = app.LocaleString (IDS_RECOMMENDED); + + _r_menu_setitemtext (hmenu, IDM_CONNECTIONS_TITLE, app.LocaleString (IDS_TAB_NETWORK), FALSE); + _r_menu_setitemtext (hmenu, IDM_SECURITY_TITLE, app.LocaleString (IDS_TITLE_SECURITY), FALSE); + _r_menu_setitemtext (hmenu, IDM_ADVANCED_TITLE, app.LocaleString (IDS_TITLE_ADVANCED), FALSE); _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); - app.LocaleMenu (hmenu, IDS_RULE_BLOCKOUTBOUND, IDM_RULE_BLOCKOUTBOUND, FALSE, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()); - app.LocaleMenu (hmenu, IDS_RULE_BLOCKINBOUND, IDM_RULE_BLOCKINBOUND, FALSE, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()); - app.LocaleMenu (hmenu, IDS_RULE_ALLOWLOOPBACK, IDM_RULE_ALLOWLOOPBACK, FALSE, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()); - app.LocaleMenu (hmenu, IDS_RULE_ALLOW6TO4, IDM_RULE_ALLOW6TO4, FALSE, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()); + _r_obj_movereference (&localizedString, _r_format_string (L"%s (%s)", app.LocaleString (IDS_RULE_BLOCKOUTBOUND), recommendedString)); + _r_menu_setitemtext (hmenu, IDM_RULE_BLOCKOUTBOUND, _r_obj_getstringorempty (localizedString), FALSE); - app.LocaleMenu (hmenu, IDS_SECUREFILTERS_CHK, IDM_SECUREFILTERS_CHK, FALSE, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()); - app.LocaleMenu (hmenu, IDS_USESTEALTHMODE_CHK, IDM_USESTEALTHMODE_CHK, FALSE, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()); - app.LocaleMenu (hmenu, IDS_INSTALLBOOTTIMEFILTERS_CHK, IDM_INSTALLBOOTTIMEFILTERS_CHK, FALSE, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()); + _r_obj_movereference (&localizedString, _r_format_string (L"%s (%s)", app.LocaleString (IDS_RULE_BLOCKINBOUND), recommendedString)); + _r_menu_setitemtext (hmenu, IDM_RULE_BLOCKINBOUND, _r_obj_getstringorempty (localizedString), FALSE); - app.LocaleMenu (hmenu, IDS_USENETWORKRESOLUTION_CHK, IDM_USENETWORKRESOLUTION_CHK, FALSE, NULL); - app.LocaleMenu (hmenu, IDS_USECERTIFICATES_CHK, IDM_USECERTIFICATES_CHK, FALSE, NULL); - app.LocaleMenu (hmenu, IDS_USEREFRESHDEVICES_CHK, IDM_USEREFRESHDEVICES_CHK, FALSE, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()); + _r_obj_movereference (&localizedString, _r_format_string (L"%s (%s)", app.LocaleString (IDS_RULE_ALLOWLOOPBACK), recommendedString)); + _r_menu_setitemtext (hmenu, IDM_RULE_ALLOWLOOPBACK, _r_obj_getstringorempty (localizedString), FALSE); - app.LocaleMenu (hmenu, IDS_TRAY_BLOCKLIST_RULES, 4, TRUE, NULL); + _r_obj_movereference (&localizedString, _r_format_string (L"%s (%s)", app.LocaleString (IDS_RULE_ALLOW6TO4), recommendedString)); + _r_menu_setitemtext (hmenu, IDM_RULE_ALLOW6TO4, _r_obj_getstringorempty (localizedString), FALSE); - app.LocaleMenu (hmenu, IDS_BLOCKLIST_SPY, IDM_BLOCKLIST_SPY_TITLE, FALSE, NULL); - app.LocaleMenu (hmenu, IDS_BLOCKLIST_UPDATE, IDM_BLOCKLIST_UPDATE_TITLE, FALSE, NULL); - app.LocaleMenu (hmenu, IDS_BLOCKLIST_EXTRA, IDM_BLOCKLIST_EXTRA_TITLE, FALSE, NULL); + _r_obj_movereference (&localizedString, _r_format_string (L"%s (%s)", app.LocaleString (IDS_SECUREFILTERS_CHK), recommendedString)); + _r_menu_setitemtext (hmenu, IDM_SECUREFILTERS_CHK, _r_obj_getstringorempty (localizedString), FALSE); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s (%s)", app.LocaleString (IDS_USESTEALTHMODE_CHK), recommendedString)); + _r_menu_setitemtext (hmenu, IDM_USESTEALTHMODE_CHK, _r_obj_getstringorempty (localizedString), FALSE); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s (%s)", app.LocaleString (IDS_INSTALLBOOTTIMEFILTERS_CHK), recommendedString)); + _r_menu_setitemtext (hmenu, IDM_INSTALLBOOTTIMEFILTERS_CHK, _r_obj_getstringorempty (localizedString), FALSE); + + _r_menu_setitemtext (hmenu, IDM_USENETWORKRESOLUTION_CHK, app.LocaleString (IDS_USENETWORKRESOLUTION_CHK), FALSE); + _r_menu_setitemtext (hmenu, IDM_USECERTIFICATES_CHK, app.LocaleString (IDS_USECERTIFICATES_CHK), FALSE); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s (%s)", app.LocaleString (IDS_USEREFRESHDEVICES_CHK), recommendedString)); + _r_menu_setitemtext (hmenu, IDM_USEREFRESHDEVICES_CHK, _r_obj_getstringorempty (localizedString), FALSE); + + _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_SPY_TITLE, app.LocaleString (IDS_BLOCKLIST_SPY), FALSE); + _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_UPDATE_TITLE, app.LocaleString (IDS_BLOCKLIST_UPDATE), FALSE); + _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_EXTRA_TITLE, app.LocaleString (IDS_BLOCKLIST_EXTRA), FALSE); _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); - app.LocaleMenu (hmenu, IDS_DISABLE, IDM_BLOCKLIST_SPY_DISABLE, FALSE, NULL); - app.LocaleMenu (hmenu, IDS_ACTION_ALLOW, IDM_BLOCKLIST_SPY_ALLOW, FALSE, NULL); - app.LocaleMenu (hmenu, IDS_ACTION_BLOCK, IDM_BLOCKLIST_SPY_BLOCK, FALSE, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()); + _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_SPY_DISABLE, app.LocaleString (IDS_DISABLE), FALSE); + _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_SPY_ALLOW, app.LocaleString (IDS_ACTION_ALLOW), FALSE); - app.LocaleMenu (hmenu, IDS_DISABLE, IDM_BLOCKLIST_UPDATE_DISABLE, FALSE, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()); - app.LocaleMenu (hmenu, IDS_ACTION_ALLOW, IDM_BLOCKLIST_UPDATE_ALLOW, FALSE, NULL); - app.LocaleMenu (hmenu, IDS_ACTION_BLOCK, IDM_BLOCKLIST_UPDATE_BLOCK, FALSE, NULL); + _r_obj_movereference (&localizedString, _r_format_string (L"%s (default)", app.LocaleString (IDS_ACTION_BLOCK))); + _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_SPY_BLOCK, _r_obj_getstringorempty (localizedString), FALSE); - app.LocaleMenu (hmenu, IDS_DISABLE, IDM_BLOCKLIST_EXTRA_DISABLE, FALSE, _r_fmt (L" (%s)", recommended.GetString ()).GetString ()); - app.LocaleMenu (hmenu, IDS_ACTION_ALLOW, IDM_BLOCKLIST_EXTRA_ALLOW, FALSE, NULL); - app.LocaleMenu (hmenu, IDS_ACTION_BLOCK, IDM_BLOCKLIST_EXTRA_BLOCK, FALSE, NULL); + _r_obj_movereference (&localizedString, _r_format_string (L"%s (default)", app.LocaleString (IDS_DISABLE))); + _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_UPDATE_DISABLE, _r_obj_getstringorempty (localizedString), FALSE); - app.LocaleMenu (hmenu, IDS_HELP, 5, TRUE, NULL); - app.LocaleMenu (hmenu, IDS_WEBSITE, IDM_WEBSITE, FALSE, NULL); - app.LocaleMenu (hmenu, IDS_CHECKUPDATES, IDM_CHECKUPDATES, FALSE, NULL); - app.LocaleMenu (hmenu, IDS_ABOUT, IDM_ABOUT, FALSE, L"\tF1"); + _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_UPDATE_ALLOW, app.LocaleString (IDS_ACTION_ALLOW), FALSE); + _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_UPDATE_BLOCK, app.LocaleString (IDS_ACTION_BLOCK), FALSE); + + //_r_obj_movereference (&localizedString, app.LocaleString2 (IDS_DISABLE, L" (default)")); + _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_EXTRA_DISABLE, _r_obj_getstringorempty (localizedString), FALSE); + + _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_EXTRA_ALLOW, app.LocaleString (IDS_ACTION_ALLOW), FALSE); + _r_menu_setitemtext (hmenu, IDM_BLOCKLIST_EXTRA_BLOCK, app.LocaleString (IDS_ACTION_BLOCK), FALSE); + + _r_menu_setitemtext (hmenu, IDM_WEBSITE, app.LocaleString (IDS_WEBSITE), FALSE); + _r_menu_setitemtext (hmenu, IDM_CHECKUPDATES, app.LocaleString (IDS_CHECKUPDATES), FALSE); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tF1", app.LocaleString (IDS_ABOUT))); + _r_menu_setitemtext (hmenu, IDM_ABOUT, _r_obj_getstringorempty (localizedString), FALSE); app.LocaleEnum ((HWND)GetSubMenu (hmenu, 2), LANG_MENU, TRUE, IDX_LANGUAGE); // enum localizations } @@ -2193,19 +2298,25 @@ find_wrap: // localize toolbar _app_setinterfacestate (hwnd); - _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_REFRESH, app.LocaleString (IDS_REFRESH, NULL).GetString (), BTNS_BUTTON | BTNS_AUTOSIZE | BTNS_SHOWTEXT, 0, I_IMAGENONE); - _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_SETTINGS, app.LocaleString (IDS_SETTINGS, NULL).GetString (), BTNS_BUTTON | BTNS_AUTOSIZE | BTNS_SHOWTEXT, 0, I_IMAGENONE); + _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_REFRESH, app.LocaleString (IDS_REFRESH), BTNS_BUTTON | BTNS_AUTOSIZE | BTNS_SHOWTEXT, 0, I_IMAGENONE); + _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_SETTINGS, app.LocaleString (IDS_SETTINGS), BTNS_BUTTON | BTNS_AUTOSIZE | BTNS_SHOWTEXT, 0, I_IMAGENONE); - _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_OPENRULESEDITOR, app.LocaleString (IDS_OPENRULESEDITOR, L"...").GetString (), BTNS_BUTTON | BTNS_AUTOSIZE, 0, I_IMAGENONE); + _r_obj_movereference (&localizedString, _r_format_string (L"%s...", app.LocaleString (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, app.LocaleString (IDS_ENABLENOTIFICATIONS_CHK, NULL).GetString (), BTNS_CHECK | BTNS_AUTOSIZE, 0, I_IMAGENONE); - _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_ENABLELOG_CHK, app.LocaleString (IDS_ENABLELOG_CHK, NULL).GetString (), BTNS_CHECK | BTNS_AUTOSIZE, 0, I_IMAGENONE); - _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_ENABLEUILOG_CHK, app.LocaleString (IDS_ENABLEUILOG_CHK, L" (session only)").GetString (), BTNS_CHECK | BTNS_AUTOSIZE, 0, I_IMAGENONE); + _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_ENABLENOTIFICATIONS_CHK, app.LocaleString (IDS_ENABLENOTIFICATIONS_CHK), BTNS_CHECK | BTNS_AUTOSIZE, 0, I_IMAGENONE); + _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_ENABLELOG_CHK, app.LocaleString (IDS_ENABLELOG_CHK), BTNS_CHECK | BTNS_AUTOSIZE, 0, I_IMAGENONE); - _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_LOGSHOW, app.LocaleString (IDS_LOGSHOW, L" (Ctrl+I)").GetString (), BTNS_BUTTON | BTNS_AUTOSIZE, 0, I_IMAGENONE); - _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_LOGCLEAR, app.LocaleString (IDS_LOGCLEAR, L" (Ctrl+X)").GetString (), BTNS_BUTTON | BTNS_AUTOSIZE, 0, I_IMAGENONE); + _r_obj_movereference (&localizedString, _r_format_string (L"%s (session only)", app.LocaleString (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_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_DONATE, app.LocaleString (IDS_DONATE, NULL).GetString (), BTNS_BUTTON | BTNS_AUTOSIZE, 0, I_IMAGENONE); + _r_obj_movereference (&localizedString, _r_format_string (L"%s (Ctrl+I)", app.LocaleString (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)", app.LocaleString (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, app.LocaleString (IDS_DONATE), BTNS_BUTTON | BTNS_AUTOSIZE, 0, I_IMAGENONE); // set rebar size _app_toolbar_resize (); @@ -2244,40 +2355,58 @@ find_wrap: else continue; - _r_tab_setitem (hwnd, IDC_TAB, i, app.LocaleString (locale_id, NULL).GetString (), I_IMAGENONE, 0); + _r_tab_setitem (hwnd, IDC_TAB, i, app.LocaleString (locale_id), I_IMAGENONE, 0); if (listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_APPS_UWP) { - _r_listview_setcolumn (hwnd, listview_id, 0, app.LocaleString (IDS_NAME, NULL).GetString (), 0); - _r_listview_setcolumn (hwnd, listview_id, 1, app.LocaleString (IDS_ADDED, NULL).GetString (), 0); + _r_listview_setcolumn (hwnd, listview_id, 0, app.LocaleString (IDS_NAME), 0); + _r_listview_setcolumn (hwnd, listview_id, 1, app.LocaleString (IDS_ADDED), 0); } else if (listview_id >= IDC_RULES_BLOCKLIST && listview_id <= IDC_RULES_CUSTOM) { - _r_listview_setcolumn (hwnd, listview_id, 0, app.LocaleString (IDS_NAME, NULL).GetString (), 0); - _r_listview_setcolumn (hwnd, listview_id, 1, app.LocaleString (IDS_PROTOCOL, NULL).GetString (), 0); - _r_listview_setcolumn (hwnd, listview_id, 2, app.LocaleString (IDS_DIRECTION, NULL).GetString (), 0); + _r_listview_setcolumn (hwnd, listview_id, 0, app.LocaleString (IDS_NAME), 0); + _r_listview_setcolumn (hwnd, listview_id, 1, app.LocaleString (IDS_PROTOCOL), 0); + _r_listview_setcolumn (hwnd, listview_id, 2, app.LocaleString (IDS_DIRECTION), 0); } else if (listview_id == IDC_NETWORK) { - _r_listview_setcolumn (hwnd, listview_id, 0, app.LocaleString (IDS_NAME, NULL).GetString (), 0); - _r_listview_setcolumn (hwnd, listview_id, 1, app.LocaleString (IDS_ADDRESS, _r_fmt (L" (%s)", SZ_DIRECTION_LOCAL).GetString ()).GetString (), 0); - _r_listview_setcolumn (hwnd, listview_id, 2, app.LocaleString (IDS_PORT, _r_fmt (L" (%s)", SZ_DIRECTION_LOCAL).GetString ()).GetString (), 0); - _r_listview_setcolumn (hwnd, listview_id, 3, app.LocaleString (IDS_ADDRESS, _r_fmt (L" (%s)", SZ_DIRECTION_REMOTE).GetString ()).GetString (), 0); - _r_listview_setcolumn (hwnd, listview_id, 4, app.LocaleString (IDS_PORT, _r_fmt (L" (%s)", SZ_DIRECTION_REMOTE).GetString ()).GetString (), 0); - _r_listview_setcolumn (hwnd, listview_id, 5, app.LocaleString (IDS_PROTOCOL, NULL).GetString (), 0); - _r_listview_setcolumn (hwnd, listview_id, 6, app.LocaleString (IDS_STATE, NULL).GetString (), 0); + _r_listview_setcolumn (hwnd, listview_id, 0, app.LocaleString (IDS_NAME), 0); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s (" SZ_DIRECTION_LOCAL L")", app.LocaleString (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")", app.LocaleString (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")", app.LocaleString (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")", app.LocaleString (IDS_PORT))); + _r_listview_setcolumn (hwnd, listview_id, 4, _r_obj_getstringorempty (localizedString), 0); + + _r_listview_setcolumn (hwnd, listview_id, 5, app.LocaleString (IDS_PROTOCOL), 0); + _r_listview_setcolumn (hwnd, listview_id, 6, app.LocaleString (IDS_STATE), 0); } else if (listview_id == IDC_LOG) { - _r_listview_setcolumn (hwnd, listview_id, 0, app.LocaleString (IDS_NAME, NULL).GetString (), 0); - _r_listview_setcolumn (hwnd, listview_id, 1, app.LocaleString (IDS_ADDRESS, _r_fmt (L" (%s)", SZ_DIRECTION_LOCAL).GetString ()).GetString (), 0); - _r_listview_setcolumn (hwnd, listview_id, 2, app.LocaleString (IDS_PORT, _r_fmt (L" (%s)", SZ_DIRECTION_LOCAL).GetString ()).GetString (), 0); - _r_listview_setcolumn (hwnd, listview_id, 3, app.LocaleString (IDS_ADDRESS, _r_fmt (L" (%s)", SZ_DIRECTION_REMOTE).GetString ()).GetString (), 0); - _r_listview_setcolumn (hwnd, listview_id, 4, app.LocaleString (IDS_PORT, _r_fmt (L" (%s)", SZ_DIRECTION_REMOTE).GetString ()).GetString (), 0); - _r_listview_setcolumn (hwnd, listview_id, 5, app.LocaleString (IDS_PROTOCOL, NULL).GetString (), 0); - _r_listview_setcolumn (hwnd, listview_id, 6, app.LocaleString (IDS_FILTER, NULL).GetString (), 0); - _r_listview_setcolumn (hwnd, listview_id, 7, app.LocaleString (IDS_DIRECTION, NULL).GetString (), 0); - _r_listview_setcolumn (hwnd, listview_id, 8, app.LocaleString (IDS_STATE, NULL).GetString (), 0); + _r_listview_setcolumn (hwnd, listview_id, 0, app.LocaleString (IDS_NAME), 0); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s (" SZ_DIRECTION_LOCAL L")", app.LocaleString (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")", app.LocaleString (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")", app.LocaleString (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")", app.LocaleString (IDS_PORT))); + _r_listview_setcolumn (hwnd, listview_id, 4, _r_obj_getstringorempty (localizedString), 0); + + _r_listview_setcolumn (hwnd, listview_id, 5, app.LocaleString (IDS_PROTOCOL), 0); + _r_listview_setcolumn (hwnd, listview_id, 6, app.LocaleString (IDS_FILTER), 0); + _r_listview_setcolumn (hwnd, listview_id, 7, app.LocaleString (IDS_DIRECTION), 0); + _r_listview_setcolumn (hwnd, listview_id, 8, app.LocaleString (IDS_STATE), 0); } SendDlgItemMessage (hwnd, listview_id, LVM_RESETEMPTYTEXT, 0, 0); @@ -2299,6 +2428,8 @@ find_wrap: _app_notifyrefresh (config.hnotification, FALSE); + SAFE_DELETE_REFERENCE (localizedString); + break; } @@ -2313,6 +2444,8 @@ find_wrap: case RM_DPICHANGED: { + PR_STRING localizedString = NULL; + _app_imagelist_init (hwnd); SendDlgItemMessage (config.hrebar, IDC_TOOLBAR, TB_SETIMAGELIST, 0, (LPARAM)config.himg_toolbar); @@ -2320,19 +2453,23 @@ find_wrap: // reset toolbar information _app_setinterfacestate (hwnd); - _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_REFRESH, app.LocaleString (IDS_REFRESH, NULL).GetString (), BTNS_BUTTON | BTNS_AUTOSIZE | BTNS_SHOWTEXT, 0, I_IMAGENONE); - _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_SETTINGS, app.LocaleString (IDS_SETTINGS, NULL).GetString (), BTNS_BUTTON | BTNS_AUTOSIZE | BTNS_SHOWTEXT, 0, I_IMAGENONE); + _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_REFRESH, app.LocaleString (IDS_REFRESH), BTNS_BUTTON | BTNS_AUTOSIZE | BTNS_SHOWTEXT, 0, I_IMAGENONE); + _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_SETTINGS, app.LocaleString (IDS_SETTINGS), BTNS_BUTTON | BTNS_AUTOSIZE | BTNS_SHOWTEXT, 0, I_IMAGENONE); - _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_OPENRULESEDITOR, app.LocaleString (IDS_OPENRULESEDITOR, L"...").GetString (), BTNS_BUTTON | BTNS_AUTOSIZE, 0, I_IMAGENONE); + _r_obj_movereference (&localizedString, _r_format_string (L"%s...", app.LocaleString (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, app.LocaleString (IDS_ENABLENOTIFICATIONS_CHK, NULL).GetString (), BTNS_CHECK | BTNS_AUTOSIZE, 0, I_IMAGENONE); - _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_ENABLELOG_CHK, app.LocaleString (IDS_ENABLELOG_CHK, NULL).GetString (), BTNS_CHECK | BTNS_AUTOSIZE, 0, I_IMAGENONE); - _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_ENABLEUILOG_CHK, app.LocaleString (IDS_ENABLEUILOG_CHK, NULL).GetString (), BTNS_CHECK | BTNS_AUTOSIZE, 0, I_IMAGENONE); + _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_ENABLENOTIFICATIONS_CHK, app.LocaleString (IDS_ENABLENOTIFICATIONS_CHK), BTNS_CHECK | BTNS_AUTOSIZE, 0, I_IMAGENONE); + _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_ENABLELOG_CHK, app.LocaleString (IDS_ENABLELOG_CHK), BTNS_CHECK | BTNS_AUTOSIZE, 0, I_IMAGENONE); + _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_ENABLEUILOG_CHK, app.LocaleString (IDS_ENABLEUILOG_CHK), BTNS_CHECK | BTNS_AUTOSIZE, 0, I_IMAGENONE); - _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_LOGSHOW, app.LocaleString (IDS_LOGSHOW, L" (Ctrl+I)").GetString (), BTNS_BUTTON | BTNS_AUTOSIZE, 0, I_IMAGENONE); - _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_LOGCLEAR, app.LocaleString (IDS_LOGCLEAR, L" (Ctrl+X)").GetString (), BTNS_BUTTON | BTNS_AUTOSIZE, 0, I_IMAGENONE); + _r_obj_movereference (&localizedString, _r_format_string (L"%s (Ctrl+I)", app.LocaleString (IDS_LOGSHOW))); + _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_TRAY_LOGSHOW, _r_obj_getstringorempty (localizedString), BTNS_BUTTON | BTNS_AUTOSIZE, 0, I_IMAGENONE); - _r_toolbar_setbutton (config.hrebar, IDC_TOOLBAR, IDM_DONATE, app.LocaleString (IDS_DONATE, NULL).GetString (), BTNS_BUTTON | BTNS_AUTOSIZE, 0, I_IMAGENONE); + _r_obj_movereference (&localizedString, _r_format_string (L"%s (Ctrl+X)", app.LocaleString (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, app.LocaleString (IDS_DONATE), BTNS_BUTTON | BTNS_AUTOSIZE, 0, I_IMAGENONE); _app_toolbar_resize (); @@ -2347,6 +2484,8 @@ find_wrap: _app_refreshstatus (hwnd, 0); + SAFE_DELETE_REFERENCE (localizedString); + break; } @@ -2366,12 +2505,9 @@ find_wrap: { time_t current_timestamp = (time_t)lparam; - _app_freerulesconfig_map (rules_config); + _app_freerulesconfig_map (&rules_config); - _r_fs_makebackup (config.profile_path, current_timestamp); - - _r_fs_remove (config.profile_path, _R_FLAG_REMOVE_FORCE); - _r_fs_remove (config.profile_path_backup, _R_FLAG_REMOVE_FORCE); + _r_fs_makebackup (config.profile_path, current_timestamp, TRUE); _app_profile_load (hwnd, NULL); @@ -2387,8 +2523,8 @@ find_wrap: if (_wfp_isfiltersinstalled ()) { if (_app_istimersactive () ? - !app.ShowConfirmMessage (hwnd, NULL, app.LocaleString (IDS_QUESTION_TIMER, NULL).GetString (), L"ConfirmExitTimer") : - !app.ShowConfirmMessage (hwnd, NULL, app.LocaleString (IDS_QUESTION_EXIT, NULL).GetString (), L"ConfirmExit2")) + !app.ShowConfirmMessage (hwnd, NULL, app.LocaleString (IDS_QUESTION_TIMER), L"ConfirmExitTimer") : + !app.ShowConfirmMessage (hwnd, NULL, app.LocaleString (IDS_QUESTION_EXIT), L"ConfirmExit2")) { SetWindowLongPtr (hwnd, DWLP_MSGRESULT, TRUE); return TRUE; @@ -2441,20 +2577,22 @@ find_wrap: case WM_DROPFILES: { - UINT numfiles = DragQueryFile ((HDROP)wparam, UINT32_MAX, NULL, 0); + 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++) { - UINT length = DragQueryFile ((HDROP)wparam, i, NULL, 0) + 1; + length = DragQueryFile ((HDROP)wparam, i, NULL, 0); + string = _r_obj_createstringex (NULL, length * sizeof (WCHAR)); - LPWSTR file = (LPWSTR)_r_mem_allocatezero (length * sizeof (WCHAR)); + if (DragQueryFile ((HDROP)wparam, i, string->Buffer, length + 1)) + app_hash = _app_addapplication (hwnd, string->Buffer, 0, 0, 0, FALSE, FALSE); - DragQueryFile ((HDROP)wparam, i, file, length); - - app_hash = _app_addapplication (hwnd, file, 0, 0, 0, FALSE, FALSE); - - _r_mem_free (file); + _r_obj_dereference (string); } DragFinish ((HDROP)wparam); @@ -2571,8 +2709,13 @@ find_wrap: case LVN_GETINFOTIP: { LPNMLVGETINFOTIP lpnmlv = (LPNMLVGETINFOTIP)lparam; + PR_STRING string = _app_gettooltip (hwnd, lpnmlv); - _r_str_copy (lpnmlv->pszText, lpnmlv->cchTextMax, _app_gettooltip (hwnd, lpnmlv).GetString ()); + if (string) + { + _r_str_copy (lpnmlv->pszText, lpnmlv->cchTextMax, string->Buffer); + _r_obj_dereference (string); + } break; } @@ -2596,79 +2739,69 @@ find_wrap: if (listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_APPS_UWP) { SIZE_T app_hash = lpnmlv->lParam; - PR_OBJECT ptr_app_object = _app_getappitem (app_hash); + PITEM_APP ptr_app = _app_getappitem (app_hash); - if (!ptr_app_object) + if (!ptr_app) break; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + OBJECTS_APP_VECTOR rules; - OBJECTS_VEC rules; - - if (ptr_app) + if (ptr_app->is_enabled != is_enabled) { - if (ptr_app->is_enabled != is_enabled) - { - 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); + _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_freenotify (app_hash, ptr_app); - if (!is_enabled && _app_istimeractive (ptr_app)) - _app_timer_reset (hwnd, ptr_app); + if (!is_enabled && _app_istimeractive (ptr_app)) + _app_timer_reset (hwnd, ptr_app); - rules.push_back (ptr_app_object); + rules.emplace_back (ptr_app); - HANDLE hengine = _wfp_getenginehandle (); + HANDLE hengine = _wfp_getenginehandle (); - if (hengine) - _wfp_create3filters (hengine, rules, __LINE__); + if (hengine) + _wfp_create3filters (hengine, &rules, __LINE__); - is_changed = TRUE; - } + is_changed = TRUE; } - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } else if (listview_id >= IDC_RULES_BLOCKLIST && listview_id <= IDC_RULES_CUSTOM) { - OBJECTS_VEC rules; + OBJECTS_RULE_VECTOR rules; SIZE_T rule_idx = lpnmlv->lParam; - PR_OBJECT ptr_rule_object = _app_getrulebyid (rule_idx); + PITEM_RULE ptr_rule = _app_getrulebyid (rule_idx); - if (!ptr_rule_object) + if (!ptr_rule) break; - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; - - if (ptr_rule) + if (ptr_rule->is_enabled != is_enabled) { - if (ptr_rule->is_enabled != is_enabled) - { - _r_fastlock_acquireshared (&lock_checkbox); + _r_fastlock_acquireshared (&lock_checkbox); - _app_ruleenable (ptr_rule, is_enabled); - _app_setruleiteminfo (hwnd, listview_id, lpnmlv->iItem, ptr_rule, TRUE); + _app_ruleenable (ptr_rule, is_enabled); + _app_setruleiteminfo (hwnd, listview_id, lpnmlv->iItem, ptr_rule, TRUE); - _r_fastlock_releaseshared (&lock_checkbox); + _r_fastlock_releaseshared (&lock_checkbox); - rules.push_back (ptr_rule_object); + rules.emplace_back (ptr_rule); - HANDLE hengine = _wfp_getenginehandle (); + HANDLE hengine = _wfp_getenginehandle (); - if (hengine) - _wfp_create4filters (hengine, rules, __LINE__); + if (hengine) + _wfp_create4filters (hengine, &rules, __LINE__); - is_changed = TRUE; - } + is_changed = TRUE; } - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); } if (is_changed) @@ -2689,7 +2822,7 @@ find_wrap: NMLVEMPTYMARKUP* lpnmlv = (NMLVEMPTYMARKUP*)lparam; lpnmlv->dwFlags = EMF_CENTERED; - _r_str_copy (lpnmlv->szMarkup, RTL_NUMBER_OF (lpnmlv->szMarkup), app.LocaleString (IDS_STATUS_EMPTY, NULL).GetString ()); + _r_str_copy (lpnmlv->szMarkup, RTL_NUMBER_OF (lpnmlv->szMarkup), app.LocaleString (IDS_STATUS_EMPTY)); SetWindowLongPtr (hwnd, DWLP_MSGRESULT, TRUE); return TRUE; @@ -2746,6 +2879,9 @@ find_wrap: if (!hmenu) break; + PR_STRING localizedString = NULL; + PR_STRING columnText = NULL; + HMENU hsubmenu1 = NULL; HMENU hsubmenu2 = NULL; @@ -2758,34 +2894,53 @@ find_wrap: hsubmenu2 = CreatePopupMenu (); // show rules - AppendMenu (hsubmenu1, MF_STRING, IDM_DISABLENOTIFICATIONS, app.LocaleString (IDS_DISABLENOTIFICATIONS, NULL).GetString ()); + AppendMenu (hsubmenu1, MF_STRING, IDM_DISABLENOTIFICATIONS, app.LocaleString (IDS_DISABLENOTIFICATIONS)); _app_generate_rulesmenu (hsubmenu1, hash_item); // show timers - AppendMenu (hsubmenu2, MF_STRING, IDM_DISABLETIMER, app.LocaleString (IDS_DISABLETIMER, NULL).GetString ()); + AppendMenu (hsubmenu2, MF_STRING, IDM_DISABLETIMER, app.LocaleString (IDS_DISABLETIMER)); AppendMenu (hsubmenu2, MF_SEPARATOR, 0, NULL); _app_generate_timermenu (hsubmenu2, hash_item); - AppendMenu (hmenu, MF_STRING, IDM_PROPERTIES, app.LocaleString (IDS_EXPLORE, L"\tEnter").GetString ()); + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tEnter", app.LocaleString (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, app.LocaleString (IDS_TRAY_RULES, NULL).GetString ()); - AppendMenu (hmenu, MF_POPUP, (UINT_PTR)hsubmenu2, app.LocaleString (IDS_TIMER, NULL).GetString ()); + AppendMenu (hmenu, MF_POPUP, (UINT_PTR)hsubmenu1, app.LocaleString (IDS_TRAY_RULES)); + AppendMenu (hmenu, MF_POPUP, (UINT_PTR)hsubmenu2, app.LocaleString (IDS_TIMER)); AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); - AppendMenu (hmenu, MF_STRING, IDM_DELETE, app.LocaleString (IDS_DELETE, L"\tDel").GetString ()); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tDel", app.LocaleString (IDS_DELETE))); + AppendMenu (hmenu, MF_STRING, IDM_DELETE, _r_obj_getstringorempty (localizedString)); + AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); - AppendMenu (hmenu, MF_STRING, IDM_CHECK, app.LocaleString (IDS_CHECK, NULL).GetString ()); - AppendMenu (hmenu, MF_STRING, IDM_UNCHECK, app.LocaleString (IDS_UNCHECK, NULL).GetString ()); + AppendMenu (hmenu, MF_STRING, IDM_CHECK, app.LocaleString (IDS_CHECK)); + AppendMenu (hmenu, MF_STRING, IDM_UNCHECK, app.LocaleString (IDS_UNCHECK)); AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); - AppendMenu (hmenu, MF_STRING, IDM_SELECT_ALL, app.LocaleString (IDS_SELECT_ALL, L"\tCtrl+A").GetString ()); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+A", app.LocaleString (IDS_SELECT_ALL))); + AppendMenu (hmenu, MF_STRING, IDM_SELECT_ALL, _r_obj_getstringorempty (localizedString)); + AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); - AppendMenu (hmenu, MF_STRING, IDM_COPY, app.LocaleString (IDS_COPY, L"\tCtrl+C").GetString ()); - AppendMenu (hmenu, MF_STRING, IDM_COPY2, app.LocaleString (IDS_COPY, _r_fmt (L" \"%s\"", _r_listview_getcolumntext (hwnd, listview_id, lv_column_current).GetString ()).GetString ()).GetString ()); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+C", app.LocaleString (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\"", app.LocaleString (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, (BOOL)_app_getappinfo (hash_item, InfoIsSilent) != FALSE); + _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); @@ -2793,49 +2948,84 @@ find_wrap: else if (listview_id >= IDC_RULES_BLOCKLIST && listview_id <= IDC_RULES_CUSTOM) { if (listview_id == IDC_RULES_CUSTOM) - AppendMenu (hmenu, MF_STRING, IDM_OPENRULESEDITOR, app.LocaleString (IDS_ADD, L"...").GetString ()); + { + _r_obj_movereference (&localizedString, _r_format_string (L"%s...", app.LocaleString (IDS_ADD))); + AppendMenu (hmenu, MF_STRING, IDM_OPENRULESEDITOR, _r_obj_getstringorempty (localizedString)); + } - AppendMenu (hmenu, MF_STRING, IDM_PROPERTIES, app.LocaleString (IDS_EDIT2, L"...\tEnter").GetString ()); + _r_obj_movereference (&localizedString, _r_format_string (L"%s...\tEnter", app.LocaleString (IDS_EDIT2))); + AppendMenu (hmenu, MF_STRING, IDM_PROPERTIES, _r_obj_getstringorempty (localizedString)); if (listview_id == IDC_RULES_CUSTOM) { - AppendMenu (hmenu, MF_STRING, IDM_DELETE, app.LocaleString (IDS_DELETE, L"\tDel").GetString ()); + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tDel", app.LocaleString (IDS_DELETE))); + AppendMenu (hmenu, MF_STRING, IDM_DELETE, _r_obj_getstringorempty (localizedString)); - PR_OBJECT ptr_rule_object = _app_getrulebyid (hash_item); + PITEM_RULE ptr_rule = _app_getrulebyid (hash_item); - if (ptr_rule_object) + if (ptr_rule) { - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; - - if (ptr_rule && ptr_rule->is_readonly) + if (ptr_rule->is_readonly) _r_menu_enableitem (hmenu, IDM_DELETE, MF_BYCOMMAND, FALSE); - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); } } AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); - AppendMenu (hmenu, MF_STRING, IDM_CHECK, app.LocaleString (IDS_CHECK, NULL).GetString ()); - AppendMenu (hmenu, MF_STRING, IDM_UNCHECK, app.LocaleString (IDS_UNCHECK, NULL).GetString ()); + AppendMenu (hmenu, MF_STRING, IDM_CHECK, app.LocaleString (IDS_CHECK)); + AppendMenu (hmenu, MF_STRING, IDM_UNCHECK, app.LocaleString (IDS_UNCHECK)); AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); - AppendMenu (hmenu, MF_STRING, IDM_SELECT_ALL, app.LocaleString (IDS_SELECT_ALL, L"\tCtrl+A").GetString ()); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+A", app.LocaleString (IDS_SELECT_ALL))); + AppendMenu (hmenu, MF_STRING, IDM_SELECT_ALL, _r_obj_getstringorempty (localizedString)); + AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); - AppendMenu (hmenu, MF_STRING, IDM_COPY, app.LocaleString (IDS_COPY, L"\tCtrl+C").GetString ()); - AppendMenu (hmenu, MF_STRING, IDM_COPY2, app.LocaleString (IDS_COPY, _r_fmt (L" \"%s\"", _r_listview_getcolumntext (hwnd, listview_id, lv_column_current).GetString ()).GetString ()).GetString ()); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+C", app.LocaleString (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\"", app.LocaleString (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) { - AppendMenu (hmenu, MF_STRING, IDM_PROPERTIES, app.LocaleString (IDS_SHOWINLIST, L"\tEnter").GetString ()); - AppendMenu (hmenu, MF_STRING, IDM_OPENRULESEDITOR, app.LocaleString (IDS_OPENRULESEDITOR, L"...").GetString ()); + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tEnter", app.LocaleString (IDS_SHOWINLIST))); + AppendMenu (hmenu, MF_STRING, IDM_PROPERTIES, _r_obj_getstringorempty (localizedString)); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s...", app.LocaleString (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, app.LocaleString (IDS_NETWORK_CLOSE, NULL).GetString ()); + AppendMenu (hmenu, MF_STRING, IDM_NETWORK_CLOSE, app.LocaleString (IDS_NETWORK_CLOSE)); AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); - AppendMenu (hmenu, MF_STRING, IDM_SELECT_ALL, app.LocaleString (IDS_SELECT_ALL, L"\tCtrl+A").GetString ()); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+A", app.LocaleString (IDS_SELECT_ALL))); + AppendMenu (hmenu, MF_STRING, IDM_SELECT_ALL, _r_obj_getstringorempty (localizedString)); + AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); - AppendMenu (hmenu, MF_STRING, IDM_COPY, app.LocaleString (IDS_COPY, L"\tCtrl+C").GetString ()); - AppendMenu (hmenu, MF_STRING, IDM_COPY2, app.LocaleString (IDS_COPY, _r_fmt (L" \"%s\"", _r_listview_getcolumntext (hwnd, listview_id, lv_column_current).GetString ()).GetString ()).GetString ()); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+C", app.LocaleString (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\"", app.LocaleString (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); @@ -2852,14 +3042,34 @@ find_wrap: } else if (listview_id == IDC_LOG) { - AppendMenu (hmenu, MF_STRING, IDM_PROPERTIES, app.LocaleString (IDS_SHOWINLIST, L"\tEnter").GetString ()); - AppendMenu (hmenu, MF_STRING, IDM_OPENRULESEDITOR, app.LocaleString (IDS_OPENRULESEDITOR, L"...").GetString ()); - AppendMenu (hmenu, MF_STRING, IDM_TRAY_LOGCLEAR, app.LocaleString (IDS_LOGCLEAR, L"\tCtrl+X").GetString ()); + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tEnter", app.LocaleString (IDS_SHOWINLIST))); + AppendMenu (hmenu, MF_STRING, IDM_PROPERTIES, _r_obj_getstringorempty (localizedString)); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s...", app.LocaleString (IDS_OPENRULESEDITOR))); + AppendMenu (hmenu, MF_STRING, IDM_OPENRULESEDITOR, _r_obj_getstringorempty (localizedString)); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+X", app.LocaleString (IDS_LOGCLEAR))); + AppendMenu (hmenu, MF_STRING, IDM_TRAY_LOGCLEAR, _r_obj_getstringorempty (localizedString)); + AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); - AppendMenu (hmenu, MF_STRING, IDM_SELECT_ALL, app.LocaleString (IDS_SELECT_ALL, L"\tCtrl+A").GetString ()); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+A", app.LocaleString (IDS_SELECT_ALL))); + AppendMenu (hmenu, MF_STRING, IDM_SELECT_ALL, _r_obj_getstringorempty (localizedString)); + AppendMenu (hmenu, MF_SEPARATOR, 0, NULL); - AppendMenu (hmenu, MF_STRING, IDM_COPY, app.LocaleString (IDS_COPY, L"\tCtrl+C").GetString ()); - AppendMenu (hmenu, MF_STRING, IDM_COPY2, app.LocaleString (IDS_COPY, _r_fmt (L" \"%s\"", _r_listview_getcolumntext (hwnd, listview_id, lv_column_current).GetString ()).GetString ()).GetString ()); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s\tCtrl+C", app.LocaleString (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\"", app.LocaleString (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); } @@ -2877,6 +3087,8 @@ find_wrap: if (command_id) PostMessage (hwnd, WM_COMMAND, MAKEWPARAM (command_id, 0), (LPARAM)lv_column_current); + SAFE_DELETE_REFERENCE (localizedString); + break; } } @@ -2933,54 +3145,52 @@ find_wrap: #define NOTIFICATIONS_ID 4 #define LOGGING_ID 5 #define ERRLOG_ID 6 - - BOOLEAN is_filtersinstalled = (_wfp_isfiltersinstalled () != InstallDisabled); + PR_STRING localizedString = NULL; HMENU hmenu = LoadMenu (NULL, MAKEINTRESOURCE (IDM_TRAY)); HMENU hsubmenu = GetSubMenu (hmenu, 0); - { - MENUITEMINFO mii = {0}; + BOOLEAN is_filtersinstalled = (_wfp_isfiltersinstalled () != InstallDisabled); - mii.cbSize = sizeof (mii); - mii.fMask = MIIM_BITMAP; - - mii.hbmpItem = is_filtersinstalled ? config.hbmp_disable : config.hbmp_enable; - SetMenuItemInfo (hsubmenu, IDM_TRAY_START, FALSE, &mii); - } + _r_menu_setitembitmap (hsubmenu, IDM_TRAY_START, is_filtersinstalled ? config.hbmp_disable : config.hbmp_enable, FALSE); // localize - app.LocaleMenu (hsubmenu, IDS_TRAY_SHOW, IDM_TRAY_SHOW, FALSE, NULL); - app.LocaleMenu (hsubmenu, is_filtersinstalled ? IDS_TRAY_STOP : IDS_TRAY_START, IDM_TRAY_START, FALSE, NULL); + _r_menu_setitemtext (hsubmenu, IDM_TRAY_SHOW, app.LocaleString (IDS_TRAY_SHOW), FALSE); + _r_menu_setitemtext (hsubmenu, IDM_TRAY_START, app.LocaleString (is_filtersinstalled ? IDS_TRAY_STOP : IDS_TRAY_START), FALSE); - app.LocaleMenu (hsubmenu, IDS_TITLE_NOTIFICATIONS, NOTIFICATIONS_ID, TRUE, NULL); - app.LocaleMenu (hsubmenu, IDS_TITLE_LOGGING, LOGGING_ID, TRUE, NULL); + _r_menu_setitemtext (hsubmenu, NOTIFICATIONS_ID, app.LocaleString (IDS_TITLE_NOTIFICATIONS), TRUE); + _r_menu_setitemtext (hsubmenu, LOGGING_ID, app.LocaleString (IDS_TITLE_LOGGING), TRUE); - app.LocaleMenu (hsubmenu, IDS_ENABLENOTIFICATIONS_CHK, IDM_TRAY_ENABLENOTIFICATIONS_CHK, FALSE, NULL); - app.LocaleMenu (hsubmenu, IDS_NOTIFICATIONSOUND_CHK, IDM_TRAY_ENABLENOTIFICATIONSSOUND_CHK, FALSE, NULL); - app.LocaleMenu (hsubmenu, IDS_NOTIFICATIONONTRAY_CHK, IDM_TRAY_NOTIFICATIONONTRAY_CHK, FALSE, NULL); + _r_menu_setitemtext (hsubmenu, IDM_TRAY_ENABLENOTIFICATIONS_CHK, app.LocaleString (IDS_ENABLENOTIFICATIONS_CHK), FALSE); + _r_menu_setitemtext (hsubmenu, IDM_TRAY_ENABLENOTIFICATIONSSOUND_CHK, app.LocaleString (IDS_NOTIFICATIONSOUND_CHK), FALSE); + _r_menu_setitemtext (hsubmenu, IDM_TRAY_NOTIFICATIONONTRAY_CHK, app.LocaleString (IDS_NOTIFICATIONONTRAY_CHK), FALSE); - app.LocaleMenu (hsubmenu, IDS_ENABLELOG_CHK, IDM_TRAY_ENABLELOG_CHK, FALSE, NULL); - app.LocaleMenu (hsubmenu, IDS_ENABLEUILOG_CHK, IDM_TRAY_ENABLEUILOG_CHK, FALSE, L" (session only)"); - app.LocaleMenu (hsubmenu, IDS_LOGSHOW, IDM_TRAY_LOGSHOW, FALSE, NULL); - app.LocaleMenu (hsubmenu, IDS_LOGCLEAR, IDM_TRAY_LOGCLEAR, FALSE, NULL); + _r_menu_setitemtext (hsubmenu, IDM_TRAY_ENABLELOG_CHK, app.LocaleString (IDS_ENABLELOG_CHK), FALSE); - if (_r_fs_exists (app.GetLogPath ())) + _r_obj_movereference (&localizedString, _r_format_string (L"%s (session only)", app.LocaleString (IDS_ENABLEUILOG_CHK))); + _r_menu_setitemtext (hsubmenu, IDM_TRAY_ENABLEUILOG_CHK, _r_obj_getstringorempty (localizedString), FALSE); + + _r_menu_setitemtext (hsubmenu, IDM_TRAY_LOGSHOW, app.LocaleString (IDS_LOGSHOW), FALSE); + _r_menu_setitemtext (hsubmenu, IDM_TRAY_LOGCLEAR, app.LocaleString (IDS_LOGCLEAR), FALSE); + + if (_r_fs_exists (app.GetDebugLogPath ())) { - app.LocaleMenu (hsubmenu, IDS_TRAY_LOGERR, ERRLOG_ID, TRUE, NULL); + _r_menu_setitemtext (hsubmenu, ERRLOG_ID, app.LocaleString (IDS_TRAY_LOGERR), TRUE); - app.LocaleMenu (hsubmenu, IDS_LOGSHOW, IDM_TRAY_LOGSHOW_ERR, FALSE, NULL); - app.LocaleMenu (hsubmenu, IDS_LOGCLEAR, IDM_TRAY_LOGCLEAR_ERR, FALSE, NULL); + _r_menu_setitemtext (hsubmenu, IDM_TRAY_LOGSHOW_ERR, app.LocaleString (IDS_LOGSHOW), FALSE); + _r_menu_setitemtext (hsubmenu, IDM_TRAY_LOGCLEAR_ERR, app.LocaleString (IDS_LOGCLEAR), FALSE); } else { DeleteMenu (hsubmenu, ERRLOG_ID, MF_BYPOSITION); } - app.LocaleMenu (hsubmenu, IDS_SETTINGS, IDM_TRAY_SETTINGS, FALSE, L"..."); - app.LocaleMenu (hsubmenu, IDS_WEBSITE, IDM_TRAY_WEBSITE, FALSE, NULL); - app.LocaleMenu (hsubmenu, IDS_ABOUT, IDM_TRAY_ABOUT, FALSE, NULL); - app.LocaleMenu (hsubmenu, IDS_EXIT, IDM_TRAY_EXIT, FALSE, NULL); + _r_obj_movereference (&localizedString, _r_format_string (L"%s...", app.LocaleString (IDS_SETTINGS))); + _r_menu_setitemtext (hsubmenu, IDM_TRAY_SETTINGS, _r_obj_getstringorempty (localizedString), FALSE); + + _r_menu_setitemtext (hsubmenu, IDM_TRAY_WEBSITE, app.LocaleString (IDS_WEBSITE), FALSE); + _r_menu_setitemtext (hsubmenu, IDM_TRAY_ABOUT, app.LocaleString (IDS_ABOUT), FALSE); + _r_menu_setitemtext (hsubmenu, IDM_TRAY_EXIT, app.LocaleString (IDS_EXIT), FALSE); _r_menu_checkitem (hsubmenu, IDM_TRAY_ENABLENOTIFICATIONS_CHK, 0, MF_BYCOMMAND, app.ConfigGetBoolean (L"IsNotificationsEnabled", TRUE)); _r_menu_checkitem (hsubmenu, IDM_TRAY_ENABLENOTIFICATIONSSOUND_CHK, 0, MF_BYCOMMAND, app.ConfigGetBoolean (L"IsNotificationsSound", TRUE)); @@ -3002,6 +3212,8 @@ find_wrap: DestroyMenu (hmenu); + SAFE_DELETE_REFERENCE (localizedString); + break; } } @@ -3114,82 +3326,72 @@ find_wrap: BOOL is_remove = INVALID_INT; SIZE_T rule_idx = (ctrl_id - IDX_RULES_SPECIAL); - PR_OBJECT ptr_rule_object = _app_getrulebyid (rule_idx); + PITEM_RULE ptr_rule = _app_getrulebyid (rule_idx); - if (!ptr_rule_object) + if (!ptr_rule) return FALSE; - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; - - if (ptr_rule) + while ((item = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETNEXTITEM, (WPARAM)item, LVNI_SELECTED)) != 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 (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) { - SIZE_T app_hash = _r_listview_getitemlparam (hwnd, listview_id, item); + ptr_rule->apps->erase (app_hash); - if (ptr_rule->is_forservices && (app_hash == config.ntoskrnl_hash || app_hash == config.svchost_hash)) - continue; + if (ptr_rule->apps->empty ()) + _app_ruleenable (ptr_rule, FALSE); + } + else + { + ptr_rule->apps->emplace (app_hash, TRUE); - PR_OBJECT ptr_app_object = _app_getappitem (app_hash); - - if (!ptr_app_object) - continue; - - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; - - if (ptr_app) - { - _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[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_obj2_dereference (ptr_app_object); + _app_ruleenable (ptr_rule, TRUE); } - INT rule_listview_id = _app_getlistview_id (ptr_rule->type); + _r_fastlock_acquireshared (&lock_checkbox); + _app_setappiteminfo (hwnd, listview_id, item, app_hash, ptr_app); + _r_fastlock_releaseshared (&lock_checkbox); - 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_VEC rules; - rules.push_back (ptr_rule_object); - - HANDLE hengine = _wfp_getenginehandle (); - - if (hengine) - _wfp_create4filters (hengine, rules, __LINE__); + _r_obj_dereference (ptr_app); } - _r_obj2_dereference (ptr_rule_object); + 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); + + 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); @@ -3208,35 +3410,27 @@ find_wrap: SIZE_T timer_idx = (ctrl_id - IDX_TIMER); time_t seconds = timers.at (timer_idx); INT item = INVALID_INT; - OBJECTS_VEC rules; + 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); - PR_OBJECT ptr_app_object = _app_getappitem (app_hash); + PITEM_APP ptr_app = _app_getappitem (app_hash); - if (!ptr_app_object) + if (!ptr_app) continue; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + _app_timer_set (hwnd, ptr_app, seconds); - if (ptr_app) - { - _app_timer_set (hwnd, ptr_app, seconds); - rules.push_back (ptr_app_object); - } - else - { - _r_obj2_dereference (ptr_app_object); - } + rules.emplace_back (ptr_app); } HANDLE hengine = _wfp_getenginehandle (); if (hengine) - _wfp_create3filters (hengine, rules, __LINE__); + _wfp_create3filters (hengine, &rules, __LINE__); - _app_freeobjects_vec (rules); + _app_freeapps_vec (&rules); _app_listviewsort (hwnd, listview_id, INVALID_INT, FALSE); _app_refreshstatus (hwnd, listview_id); @@ -3284,7 +3478,7 @@ find_wrap: case IDM_DONATE: { - ShellExecute (hwnd, NULL, _r_fmt (_APP_DONATE_URL, APP_NAME_SHORT).GetString (), NULL, NULL, SW_SHOWDEFAULT); + ShellExecute (hwnd, NULL, _APP_DONATE_NEWURL, NULL, NULL, SW_SHOWDEFAULT); break; } @@ -3297,11 +3491,11 @@ find_wrap: case IDM_IMPORT: { - WCHAR path[MAX_PATH] = {0}; + WCHAR path[MAX_PATH]; _r_str_copy (path, RTL_NUMBER_OF (path), XML_PROFILE); - WCHAR title[MAX_PATH] = {0}; - _r_str_printf (title, RTL_NUMBER_OF (title), L"%s %s...", app.LocaleString (IDS_IMPORT, NULL).GetString (), path); + WCHAR title[MAX_PATH]; + _r_str_printf (title, RTL_NUMBER_OF (title), L"%s %s...", app.LocaleString (IDS_IMPORT), path); OPENFILENAME ofn = {0}; @@ -3336,11 +3530,11 @@ find_wrap: case IDM_EXPORT: { - WCHAR path[MAX_PATH] = {0}; + WCHAR path[MAX_PATH]; _r_str_copy (path, RTL_NUMBER_OF (path), XML_PROFILE); - WCHAR title[MAX_PATH] = {0}; - _r_str_printf (title, RTL_NUMBER_OF (title), L"%s %s...", app.LocaleString (IDS_EXPORT, NULL).GetString (), path); + WCHAR title[MAX_PATH]; + _r_str_printf (title, RTL_NUMBER_OF (title), L"%s %s...", app.LocaleString (IDS_EXPORT), path); OPENFILENAME ofn = {0}; @@ -3394,36 +3588,31 @@ find_wrap: app.ConfigSetBoolean (L"ShowFilenames", new_val); // regroup apps - for (auto &p : apps) + for (auto it = apps.begin (); it != apps.end (); ++it) { - PR_OBJECT ptr_app_object = _r_obj2_reference (p.second); - - if (!ptr_app_object) + if (!it->second) continue; - SIZE_T app_hash = p.first; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + SIZE_T app_hash = it->first; + PITEM_APP ptr_app = (PITEM_APP)_r_obj_reference (it->second); - if (ptr_app) + _r_obj_movereference (&ptr_app->display_name, _app_getdisplayname (app_hash, ptr_app)); + + INT listview_id = _app_getlistview_id (ptr_app->type); + + if (listview_id) { - _app_getdisplayname (app_hash, ptr_app, &ptr_app->display_name); + INT item_pos = _app_getposition (hwnd, listview_id, app_hash); - INT listview_id = _app_getlistview_id (ptr_app->type); - - if (listview_id) + if (item_pos != INVALID_INT) { - 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_fastlock_acquireshared (&lock_checkbox); + _app_setappiteminfo (hwnd, listview_id, item_pos, app_hash, ptr_app); + _r_fastlock_releaseshared (&lock_checkbox); } } - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } _app_listviewsort (hwnd, (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT), INVALID_INT, FALSE); @@ -3439,34 +3628,29 @@ find_wrap: app.ConfigSetBoolean (L"IsEnableSpecialGroup", new_val); // regroup apps - for (auto &p : apps) + for (auto it = apps.begin (); it != apps.end (); ++it) { - PR_OBJECT ptr_app_object = _r_obj2_reference (p.second); - - if (!ptr_app_object) + if (!it->second) continue; - SIZE_T app_hash = p.first; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + SIZE_T app_hash = it->first; + PITEM_APP ptr_app = (PITEM_APP)_r_obj_reference (it->second); - if (ptr_app) + INT listview_id = _app_getlistview_id (ptr_app->type); + + if (listview_id) { - INT listview_id = _app_getlistview_id (ptr_app->type); + INT item_pos = _app_getposition (hwnd, listview_id, app_hash); - if (listview_id) + if (item_pos != INVALID_INT) { - 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_fastlock_acquireshared (&lock_checkbox); + _app_setappiteminfo (hwnd, listview_id, item_pos, app_hash, ptr_app); + _r_fastlock_releaseshared (&lock_checkbox); } } - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); @@ -3549,34 +3733,29 @@ find_wrap: _r_menu_checkitem (GetMenu (hwnd), ctrl_id, 0, MF_BYCOMMAND, new_val); app.ConfigSetBoolean (L"IsIconsHidden", new_val); - for (auto &p : apps) + for (auto it = apps.begin (); it != apps.end (); ++it) { - PR_OBJECT ptr_app_object = _r_obj2_reference (p.second); - - if (!ptr_app_object) + if (!it->second) continue; - SIZE_T app_hash = p.first; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + SIZE_T app_hash = it->first; + PITEM_APP ptr_app = (PITEM_APP)_r_obj_reference (it->second); - if (ptr_app) + INT listview_id = _app_getlistview_id (ptr_app->type); + + if (listview_id) { - INT listview_id = _app_getlistview_id (ptr_app->type); + INT item_pos = _app_getposition (hwnd, listview_id, app_hash); - if (listview_id) + if (item_pos != INVALID_INT) { - 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_fastlock_acquireshared (&lock_checkbox); + _app_setappiteminfo (hwnd, listview_id, item_pos, app_hash, ptr_app); + _r_fastlock_releaseshared (&lock_checkbox); } } - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } break; @@ -3595,11 +3774,11 @@ find_wrap: cf.nSizeMin = 8; cf.lpLogFont = &lf; - _app_listviewinitfont (hwnd, &lf); + app.ConfigGetFont (L"Font", hwnd, &lf); if (ChooseFont (&cf)) { - app.ConfigSetString (L"Font", !_r_str_isempty (lf.lfFaceName) ? _r_fmt (L"%s;%d;%d", lf.lfFaceName, _r_dc_fontheighttosize (hwnd, lf.lfHeight), lf.lfWeight).GetString () : UI_FONT_DEFAULT); + app.ConfigSetFont (L"Font", hwnd, &lf); SAFE_DELETE_OBJECT (config.hfont); @@ -3618,7 +3797,6 @@ find_wrap: } } - RedrawWindow (hwnd, NULL, NULL, RDW_NOFRAME | RDW_NOINTERNALPAINT | RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); } @@ -3814,15 +3992,36 @@ find_wrap: } else { - rstring path = _r_path_expand (app.ConfigGetString (L"LogPath", LOG_PATH_DEFAULT).GetString ()); + PR_STRING logPath; + PR_STRING viewerPath; + PR_STRING processPath; + + logPath = _r_path_expand (app.ConfigGetString (L"LogPath", LOG_PATH_DEFAULT)); + + if (!logPath || !_r_fs_exists (logPath->Buffer)) + { + if (logPath) + _r_obj_dereference (logPath); - if (!_r_fs_exists (path.GetString ())) return FALSE; + } if (_r_fs_isvalidhandle (config.hlogfile)) FlushFileBuffers (config.hlogfile); - _r_sys_createprocess (NULL, _r_fmt (L"%s \"%s\"", _app_getlogviewer ().GetString (), path.GetString ()).GetString (), NULL); + viewerPath = _app_getlogviewer (); + + if (viewerPath) + { + processPath = _r_format_string (L"%s \"%s\"", _r_obj_getstring (viewerPath), logPath->Buffer); + + _r_sys_createprocess (NULL, _r_obj_getstring (processPath), NULL); + + _r_obj_dereference (viewerPath); + _r_obj_dereference (processPath); + } + + _r_obj_dereference (logPath); } break; @@ -3830,39 +4029,56 @@ find_wrap: case IDM_TRAY_LOGCLEAR: { - rstring path = _r_path_expand (app.ConfigGetString (L"LogPath", LOG_PATH_DEFAULT).GetString ()); - BOOLEAN is_validhandle = _r_fs_isvalidhandle (config.hlogfile); + PR_STRING path = _r_path_expand (app.ConfigGetString (L"LogPath", LOG_PATH_DEFAULT)); - if (is_validhandle || _r_fs_exists (path.GetString ()) || !log_arr.empty ()) + if (_r_fs_isvalidhandle (config.hlogfile) || (path && _r_fs_exists (path->Buffer)) || !log_arr.empty ()) { - if (!app.ShowConfirmMessage (hwnd, NULL, app.LocaleString (IDS_QUESTION, NULL).GetString (), L"ConfirmLogClear")) - break; + if (app.ShowConfirmMessage (hwnd, NULL, app.LocaleString (IDS_QUESTION), L"ConfirmLogClear")) + { + _app_freelogstack (); - _app_freelogstack (); - - _app_logclear (); - _app_logclear_ui (hwnd); + _app_logclear (); + _app_logclear_ui (hwnd); + } } + SAFE_DELETE_REFERENCE (path); + break; } case IDM_TRAY_LOGSHOW_ERR: { - LPCWSTR path = app.GetLogPath (); + PR_STRING viewerPath; + PR_STRING processPath; + LPCWSTR logPath; - if (_r_fs_exists (path)) - _r_sys_createprocess (NULL, _r_fmt (L"%s \"%s\"", _app_getlogviewer ().GetString (), path).GetString (), NULL); + logPath = app.GetDebugLogPath (); + + if (_r_fs_exists (logPath)) + { + viewerPath = _app_getlogviewer (); + + if (viewerPath) + { + processPath = _r_format_string (L"%s \"%s\"", viewerPath->Buffer, logPath); + + _r_sys_createprocess (NULL, processPath->Buffer, NULL); + + _r_obj_dereference (processPath); + _r_obj_dereference (viewerPath); + } + } break; } case IDM_TRAY_LOGCLEAR_ERR: { - if (!app.ShowConfirmMessage (hwnd, NULL, app.LocaleString (IDS_QUESTION, NULL).GetString (), L"ConfirmLogClear")) + if (!app.ShowConfirmMessage (hwnd, NULL, app.LocaleString (IDS_QUESTION), L"ConfirmLogClear")) break; - LPCWSTR path = app.GetLogPath (); + LPCWSTR path = app.GetDebugLogPath (); if (!_r_fs_exists (path)) break; @@ -3908,7 +4124,10 @@ find_wrap: else { LPWSTR p = files; + WCHAR dir[MAX_PATH] = {0}; + WCHAR full_path[512]; + GetCurrentDirectory (RTL_NUMBER_OF (dir), dir); while (*p) @@ -3917,7 +4136,8 @@ find_wrap: if (*p) { - app_hash = _app_addapplication (hwnd, _r_fmt (L"%s\\%s", dir, p).GetString (), 0, 0, 0, FALSE, FALSE); + _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); } } } @@ -3956,32 +4176,27 @@ find_wrap: 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); - PR_OBJECT ptr_app_object = _app_getappitem (app_hash); + PITEM_APP ptr_app = _app_getappitem (app_hash); - if (!ptr_app_object) + if (!ptr_app) continue; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; - - if (ptr_app) + if (ctrl_id == IDM_DISABLENOTIFICATIONS) { - if (ctrl_id == IDM_DISABLENOTIFICATIONS) - { - if (new_val == INVALID_INT) - new_val = !ptr_app->is_silent; + if (new_val == INVALID_INT) + new_val = !ptr_app->is_silent; - ptr_app->is_silent = new_val; + 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); - } + if (new_val) + _app_freenotify (app_hash, ptr_app); + } + else if (ctrl_id == IDM_DISABLETIMER) + { + _app_timer_reset (hwnd, ptr_app); } - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } _app_listviewsort (hwnd, listview_id, INVALID_INT, FALSE); @@ -3995,34 +4210,64 @@ find_wrap: case IDM_COPY: case IDM_COPY2: { - INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); - INT item = INVALID_INT; + INT listview_id; + INT item; - INT column_count = _r_listview_getcolumncount (hwnd, listview_id); - INT column_current = (INT)lparam; - rstring divider = _r_fmt (L"%c ", DIVIDER_COPY); + INT column_count; + INT column_current; - rstring buffer; + 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 (512 * sizeof (WCHAR)); 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++) - buffer.Append (_r_listview_getitemtext (hwnd, listview_id, item, column_id)).Append (divider); + { + 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 { - buffer.Append (_r_listview_getitemtext (hwnd, listview_id, item, column_current)).Append (divider); + 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_str_trim (buffer, divider.GetString ()); - buffer.Append (L"\r\n"); + _r_string_append (&buffer, L"\r\n"); } _r_str_trim (buffer, DIVIDER_TRIM); - _r_clipboard_set (hwnd, buffer.GetString (), buffer.GetLength ()); + if (!_r_str_isempty (buffer)) + _r_clipboard_set (hwnd, buffer->Buffer, _r_obj_getstringlength (buffer)); + + _r_obj_dereference (buffer); break; } @@ -4037,20 +4282,18 @@ find_wrap: if (listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_APPS_UWP) { - OBJECTS_VEC rules; + 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); - PR_OBJECT ptr_app_object = _app_getappitem (app_hash); + PITEM_APP ptr_app = _app_getappitem (app_hash); - if (!ptr_app_object) + if (!ptr_app) continue; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; - - if (ptr_app && ptr_app->is_enabled != new_val) + if (ptr_app->is_enabled != new_val) { if (!new_val) _app_timer_reset (hwnd, ptr_app); @@ -4064,7 +4307,7 @@ find_wrap: _app_setappiteminfo (hwnd, listview_id, item, app_hash, ptr_app); _r_fastlock_releaseshared (&lock_checkbox); - rules.push_back (ptr_app_object); + rules.emplace_back (ptr_app); is_changed = TRUE; @@ -4072,7 +4315,7 @@ find_wrap: } else { - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } } @@ -4081,27 +4324,25 @@ find_wrap: HANDLE hengine = _wfp_getenginehandle (); if (hengine) - _wfp_create3filters (hengine, rules, __LINE__); + _wfp_create3filters (hengine, &rules, __LINE__); - _app_freeobjects_vec (rules); + _app_freeapps_vec (&rules); } } else if (listview_id >= IDC_RULES_BLOCKLIST && listview_id <= IDC_RULES_CUSTOM) { - OBJECTS_VEC rules; + 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); - PR_OBJECT ptr_rule_object = _app_getrulebyid (rule_idx); + PITEM_RULE ptr_rule = _app_getrulebyid (rule_idx); - if (!ptr_rule_object) + if (!ptr_rule) continue; - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; - - if (ptr_rule && ptr_rule->is_enabled != new_val) + if (ptr_rule->is_enabled != new_val) { _app_ruleenable (ptr_rule, new_val); @@ -4109,7 +4350,7 @@ find_wrap: _app_setruleiteminfo (hwnd, listview_id, item, ptr_rule, TRUE); _r_fastlock_releaseshared (&lock_checkbox); - rules.push_back (ptr_rule_object); + rules.emplace_back (ptr_rule); is_changed = TRUE; @@ -4117,7 +4358,7 @@ find_wrap: } else { - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); } } @@ -4126,9 +4367,9 @@ find_wrap: HANDLE hengine = _wfp_getenginehandle (); if (hengine) - _wfp_create4filters (hengine, rules, __LINE__); + _wfp_create4filters (hengine, &rules, __LINE__); - _app_freeobjects_vec (rules); + _app_freerules_vec (&rules); } } @@ -4151,8 +4392,11 @@ find_wrap: case IDM_OPENRULESEDITOR: { - PITEM_RULE ptr_rule = new ITEM_RULE; - PR_OBJECT ptr_rule_object = _r_obj2_allocateex (ptr_rule, &_app_dereferencerule); + 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); @@ -4170,7 +4414,7 @@ find_wrap: SIZE_T app_hash = _r_listview_getitemlparam (hwnd, listview_id, item); if (_app_isappfound (app_hash)) - ptr_rule->apps[app_hash] = TRUE; + ptr_rule->apps->emplace (app_hash, TRUE); } } else if (listview_id == IDC_NETWORK) @@ -4186,30 +4430,25 @@ find_wrap: if (ptr_network) { - if (_r_str_isempty (ptr_rule->pname)) - { - rstring item_text = _r_listview_getitemtext (hwnd, listview_id, item, 0); - - _r_str_alloc (&ptr_rule->pname, item_text.GetLength (), item_text.GetString ()); - } + _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, 0, 0, 0, FALSE, FALSE); + _app_addapplication (hwnd, ptr_network->path->Buffer, 0, 0, 0, FALSE, FALSE); _app_refreshstatus (hwnd, listview_id); _app_profile_save (NULL); } - ptr_rule->apps[ptr_network->app_hash] = TRUE; + ptr_rule->apps->emplace (ptr_network->app_hash, TRUE); } ptr_rule->protocol = ptr_network->protocol; - _app_formataddress (ptr_network->af, 0, &ptr_network->remote_addr, ptr_network->remote_port, &ptr_rule->prule_remote, FMTADDR_AS_RULE); - _app_formataddress (ptr_network->af, 0, &ptr_network->local_addr, ptr_network->local_port, &ptr_rule->prule_local, FMTADDR_AS_RULE); + _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); } @@ -4228,41 +4467,42 @@ find_wrap: if (ptr_log) { - if (_r_str_isempty (ptr_rule->pname)) + if (_r_str_isempty (ptr_rule->name)) { - rstring item_text = _r_listview_getitemtext (hwnd, listview_id, item, 0); + PR_STRING itemText = _r_listview_getitemtext (hwnd, listview_id, item, 0); - _r_str_alloc (&ptr_rule->pname, item_text.GetLength (), item_text.GetString ()); + 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, 0, 0, 0, FALSE, FALSE); + _app_addapplication (hwnd, ptr_log->path->Buffer, 0, 0, 0, FALSE, FALSE); _app_refreshstatus (hwnd, listview_id); _app_profile_save (NULL); } - ptr_rule->apps[ptr_log->app_hash] = TRUE; + ptr_rule->apps->emplace (ptr_log->app_hash, TRUE); } ptr_rule->protocol = ptr_log->protocol; ptr_rule->direction = ptr_log->direction; - _app_formataddress (ptr_log->af, 0, &ptr_log->remote_addr, ptr_log->remote_port, &ptr_rule->prule_remote, FMTADDR_AS_RULE); - _app_formataddress (ptr_log->af, 0, &ptr_log->local_addr, ptr_log->local_port, &ptr_rule->prule_local, FMTADDR_AS_RULE); + _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_object)) + if (DialogBoxParam (NULL, MAKEINTRESOURCE (IDD_EDITOR), hwnd, &EditorProc, (LPARAM)ptr_rule)) { SIZE_T rule_idx = rules_arr.size (); - rules_arr.push_back (_r_obj2_reference (ptr_rule_object)); + rules_arr.emplace_back ((PITEM_RULE)_r_obj_reference (ptr_rule)); INT listview_rules_id = _app_getlistview_id (DataRuleCustom); @@ -4272,7 +4512,7 @@ find_wrap: _r_fastlock_acquireshared (&lock_checkbox); - _r_listview_additem (hwnd, listview_rules_id, item_id, 0, ptr_rule->pname, _app_getruleicon (ptr_rule), _app_getrulegroup (ptr_rule), rule_idx); + _r_listview_additem (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); @@ -4284,7 +4524,7 @@ find_wrap: _app_profile_save (NULL); } - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); break; } @@ -4313,17 +4553,14 @@ find_wrap: else if (listview_id >= IDC_RULES_BLOCKLIST && listview_id <= IDC_RULES_CUSTOM) { SIZE_T rule_idx = _r_listview_getitemlparam (hwnd, listview_id, item); - PR_OBJECT ptr_rule_object = _app_getrulebyid (rule_idx); + PITEM_RULE ptr_rule = _app_getrulebyid (rule_idx); - if (!ptr_rule_object) + if (!ptr_rule) break; - if (DialogBoxParam (NULL, MAKEINTRESOURCE (IDD_EDITOR), hwnd, &EditorProc, (LPARAM)ptr_rule_object)) + if (DialogBoxParam (NULL, MAKEINTRESOURCE (IDD_EDITOR), hwnd, &EditorProc, (LPARAM)ptr_rule)) { - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; - - if (ptr_rule) - _app_setruleiteminfo (hwnd, listview_id, item, ptr_rule, TRUE); + _app_setruleiteminfo (hwnd, listview_id, item, ptr_rule, TRUE); _app_listviewsort (hwnd, listview_id, INVALID_INT, FALSE); _app_refreshstatus (hwnd, listview_id); @@ -4331,7 +4568,7 @@ find_wrap: _app_profile_save (NULL); } - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); } else if (listview_id == IDC_NETWORK) { @@ -4345,7 +4582,7 @@ find_wrap: { if (!_app_isappfound (ptr_network->app_hash)) { - _app_addapplication (hwnd, ptr_network->path, 0, 0, 0, FALSE, FALSE); + _app_addapplication (hwnd, ptr_network->path->Buffer, 0, 0, 0, FALSE, FALSE); _app_refreshstatus (hwnd, listview_id); _app_profile_save (NULL); @@ -4374,7 +4611,7 @@ find_wrap: { if (!_app_isappfound (ptr_log->app_hash)) { - _app_addapplication (hwnd, ptr_log->path, 0, 0, 0, FALSE, FALSE); + _app_addapplication (hwnd, ptr_log->path->Buffer, 0, 0, 0, FALSE, FALSE); _app_refreshstatus (hwnd, listview_id); _app_profile_save (NULL); @@ -4448,17 +4685,25 @@ find_wrap: case IDM_DELETE: { - INT listview_id = (INT)_r_tab_getlparam (hwnd, IDC_TAB, INVALID_INT); + 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; - INT selected = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETSELECTEDCOUNT, 0, 0); - - if (!selected || app.ShowMessage (hwnd, MB_YESNO | MB_ICONEXCLAMATION, NULL, NULL, _r_fmt (app.LocaleString (IDS_QUESTION_DELETE, NULL).GetString (), selected).GetString ()) != IDYES) + if (!(selected = (INT)SendDlgItemMessage (hwnd, listview_id, LVM_GETSELECTEDCOUNT, 0, 0))) break; - INT count = _r_listview_getitemcount (hwnd, listview_id, FALSE) - 1; + _r_str_printf (messageText, RTL_NUMBER_OF (messageText), app.LocaleString (IDS_QUESTION_DELETE), selected); + + if (app.ShowMessage (hwnd, MB_YESNO | MB_ICONEXCLAMATION, NULL, NULL, messageText) != IDYES) + break; + + count = _r_listview_getitemcount (hwnd, listview_id, FALSE) - 1; GUIDS_VEC guids; @@ -4469,16 +4714,14 @@ find_wrap: if (listview_id == IDC_APPS_PROFILE) { SIZE_T app_hash = _r_listview_getitemlparam (hwnd, listview_id, i); - PR_OBJECT ptr_app_object = _app_getappitem (app_hash); + PITEM_APP ptr_app = _app_getappitem (app_hash); - if (!ptr_app_object) + if (!ptr_app) continue; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; - - if (ptr_app && !ptr_app->is_undeletable) // skip "undeletable" apps + if (!ptr_app->is_undeletable) // skip "undeletable" apps { - guids.insert (guids.end (), ptr_app->guids.begin (), ptr_app->guids.end ()); + guids.insert (guids.end (), ptr_app->guids->begin (), ptr_app->guids->end ()); SendDlgItemMessage (hwnd, listview_id, LVM_DELETEITEM, (WPARAM)i, 0); @@ -4487,71 +4730,64 @@ find_wrap: _app_freeapplication (app_hash); - _r_obj2_dereferenceex (ptr_app_object, 2); + _r_obj_dereferenceex (ptr_app, 2); } else { - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } } else if (listview_id == IDC_RULES_CUSTOM) { SIZE_T rule_idx = _r_listview_getitemlparam (hwnd, listview_id, i); - PR_OBJECT ptr_rule_object = _app_getrulebyid (rule_idx); + PITEM_RULE ptr_rule = _app_getrulebyid (rule_idx); - if (!ptr_rule_object) + if (!ptr_rule) continue; - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; - HASHER_MAP apps_checker; - if (ptr_rule && !ptr_rule->is_readonly) // skip "read-only" rules + if (!ptr_rule->is_readonly) // skip "read-only" rules { - guids.insert (guids.end (), ptr_rule->guids.begin (), ptr_rule->guids.end ()); + guids.insert (guids.end (), ptr_rule->guids->begin (), ptr_rule->guids->end ()); - for (auto &p : ptr_rule->apps) - apps_checker[p.first] = TRUE; + 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_obj2_dereferenceex (ptr_rule_object, 2); + _r_obj_dereferenceex (ptr_rule, 2); } else { - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); } - for (auto &p : apps_checker) + for (auto it = apps_checker.begin (); it != apps_checker.end (); ++it) { - SIZE_T app_hash = p.first; - PR_OBJECT ptr_app_object = _app_getappitem (app_hash); + SIZE_T app_hash = it->first; + PITEM_APP ptr_app = _app_getappitem (app_hash); - if (!ptr_app_object) + if (!ptr_app) continue; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + INT app_listview_id = _app_getlistview_id (ptr_app->type); - if (ptr_app) + if (app_listview_id) { - INT app_listview_id = _app_getlistview_id (ptr_app->type); + INT item_pos = _app_getposition (hwnd, app_listview_id, app_hash); - if (app_listview_id) + if (item_pos != INVALID_INT) { - 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_fastlock_acquireshared (&lock_checkbox); + _app_setappiteminfo (hwnd, app_listview_id, item_pos, app_hash, ptr_app); + _r_fastlock_releaseshared (&lock_checkbox); } } - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } } } @@ -4560,7 +4796,7 @@ find_wrap: HANDLE hengine = _wfp_getenginehandle (); if (hengine) - _wfp_destroyfilters_array (hengine, guids, __LINE__); + _wfp_destroyfilters_array (hengine, &guids, __LINE__); _app_refreshstatus (hwnd, INVALID_INT); _app_profile_save (NULL); @@ -4573,19 +4809,17 @@ find_wrap: BOOLEAN is_deleted = FALSE; GUIDS_VEC guids; - std::vector apps_list; + HASH_VEC apps_list; - for (auto &p : apps) + for (auto it = apps.begin (); it != apps.end (); ++it) { - PR_OBJECT ptr_app_object = _r_obj2_reference (p.second); - - if (!ptr_app_object) + if (!it->second) continue; - SIZE_T app_hash = p.first; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + SIZE_T app_hash = it->first; + PITEM_APP ptr_app = (PITEM_APP)_r_obj_reference (it->second); - if (ptr_app && !ptr_app->is_undeletable && (!_app_isappexists (ptr_app) || ((ptr_app->type != DataAppService && ptr_app->type != DataAppUWP) && !_app_isappused (ptr_app, app_hash)))) + 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); @@ -4600,25 +4834,25 @@ find_wrap: _app_timer_reset (hwnd, ptr_app); _app_freenotify (app_hash, ptr_app); - guids.insert (guids.end (), ptr_app->guids.begin (), ptr_app->guids.end ()); + guids.insert (guids.end (), ptr_app->guids->begin (), ptr_app->guids->end ()); - apps_list.push_back (app_hash); + apps_list.emplace_back (app_hash); is_deleted = TRUE; } - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } - for (auto &p : apps_list) - _app_freeapplication (p); + for (auto it = apps_list.begin (); it != apps_list.end (); ++it) + _app_freeapplication (*it); if (is_deleted) { HANDLE hengine = _wfp_getenginehandle (); if (hengine) - _wfp_destroyfilters_array (hengine, guids, __LINE__); + _wfp_destroyfilters_array (hengine, &guids, __LINE__); _app_refreshstatus (hwnd, INVALID_INT); _app_profile_save (NULL); @@ -4629,38 +4863,36 @@ find_wrap: case IDM_PURGE_TIMERS: { - if (!_app_istimersactive () || app.ShowMessage (hwnd, MB_YESNO | MB_ICONEXCLAMATION, NULL, NULL, app.LocaleString (IDS_QUESTION_TIMERS, NULL).GetString ()) != IDYES) + if (!_app_istimersactive () || app.ShowMessage (hwnd, MB_YESNO | MB_ICONEXCLAMATION, NULL, NULL, app.LocaleString (IDS_QUESTION_TIMERS)) != IDYES) break; - OBJECTS_VEC rules; + OBJECTS_APP_VECTOR rules; - for (auto &p : apps) + for (auto it = apps.begin (); it != apps.end (); ++it) { - PR_OBJECT ptr_app_object = _r_obj2_reference (p.second); - - if (!ptr_app_object) + if (!it->second) continue; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + PITEM_APP ptr_app = (PITEM_APP)_r_obj_reference (it->second); - if (ptr_app && _app_istimeractive (ptr_app)) + if (_app_istimeractive (ptr_app)) { _app_timer_reset (hwnd, ptr_app); - rules.push_back (ptr_app_object); + rules.emplace_back (ptr_app); } else { - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } } HANDLE hengine = _wfp_getenginehandle (); if (hengine) - _wfp_create3filters (hengine, rules, __LINE__); + _wfp_create3filters (hengine, &rules, __LINE__); - _app_freeobjects_vec (rules); + _app_freeapps_vec (&rules); _app_profile_save (NULL); @@ -4714,26 +4946,21 @@ find_wrap: InetPton (ptr_log->af, RM_AD, &ptr_log->remote_addr); ptr_log->remote_port = RP_AD; - _r_str_alloc (&ptr_log->path, _r_str_length (app.GetBinaryPath ()), app.GetBinaryPath ()); - _r_str_alloc (&ptr_log->filter_name, _r_str_length (FN_AD), FN_AD); + ptr_log->path = _r_obj_createstring (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); - PR_OBJECT ptr_app_object = _app_getappitem (config.my_hash); + PITEM_APP ptr_app = _app_getappitem (config.my_hash); - if (ptr_app_object) + if (ptr_app) { - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + ptr_app->last_notify = 0; - if (ptr_app) - { - ptr_app->last_notify = 0; + _app_notifyadd (config.hnotification, ptr_log, ptr_app); - _app_notifyadd (config.hnotification, ptr_log, ptr_app); - } - - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } break; @@ -4756,8 +4983,8 @@ find_wrap: IN_ADDR ipv4_remote = {0}; IN_ADDR ipv4_local = {0}; - rstring path = app.GetBinaryPath (); - _r_path_ntpathfromdos (path); + PR_STRING ntPath = NULL; + _r_path_ntpathfromdos (app.GetBinaryPath (), &ntPath); UINT16 layer_id = 0; UINT64 filter_id = 0; @@ -4789,15 +5016,23 @@ find_wrap: for (UINT i = 0; i < 255; i++) { - RtlIpv4StringToAddress (_r_fmt (RM_AD2, i + 1), TRUE, &terminator, &ipv4_remote); - RtlIpv4StringToAddress (_r_fmt (LM_AD2, i + 1), TRUE, &terminator, &ipv4_local); + 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*)path.GetString (), 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); + _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 @@ -4830,16 +5065,16 @@ INT APIENTRY wWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdL for (INT i = 0; i < numargs; i++) { - if (_r_str_compare_length (arga[i], L"/install", 8) == 0) + if (_r_str_compare (arga[i], L"/install") == 0) is_install = TRUE; - else if (_r_str_compare_length (arga[i], L"/uninstall", 10) == 0) + else if (_r_str_compare (arga[i], L"/uninstall") == 0) is_uninstall = TRUE; - else if (_r_str_compare_length (arga[i], L"/silent", 7) == 0) + else if (_r_str_compare (arga[i], L"/silent") == 0) is_silent = TRUE; - else if (_r_str_compare_length (arga[i], L"/temp", 5) == 0) + else if (_r_str_compare (arga[i], L"/temp") == 0) is_temporary = TRUE; } diff --git a/src/notifications.cpp b/src/notifications.cpp index 0fe1c4b6..6b68febf 100644 --- a/src/notifications.cpp +++ b/src/notifications.cpp @@ -15,22 +15,14 @@ VOID _app_notifycreatewindow () BOOLEAN _app_notifycommand (HWND hwnd, INT button_id, time_t seconds) { SIZE_T app_hash = _app_notifyget_id (hwnd, FALSE); - PR_OBJECT ptr_app_object = _app_getappitem (app_hash); - - if (!ptr_app_object) - return FALSE; - - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + PITEM_APP ptr_app = _app_getappitem (app_hash); if (!ptr_app) - { - _r_obj2_dereference (ptr_app_object); return FALSE; - } _app_freenotify (app_hash, ptr_app); - OBJECTS_VEC rules; + OBJECTS_APP_VECTOR rules; INT listview_id = _app_getlistview_id (ptr_app->type); INT item_pos = _app_getposition (app.GetHWND (), listview_id, app_hash); @@ -54,7 +46,7 @@ BOOLEAN _app_notifycommand (HWND hwnd, INT button_id, time_t seconds) } } - rules.push_back (ptr_app_object); + rules.emplace_back (ptr_app); } else if (button_id == IDC_LATER_BTN) { @@ -70,9 +62,9 @@ BOOLEAN _app_notifycommand (HWND hwnd, INT button_id, time_t seconds) HANDLE hengine = _wfp_getenginehandle (); if (hengine) - _wfp_create3filters (hengine, rules, __LINE__); + _wfp_create3filters (hengine, &rules, __LINE__); - _app_freeobjects_vec (rules); + _app_freeapps_vec (&rules); _app_refreshstatus (app.GetHWND (), listview_id); _app_profile_save (NULL); @@ -101,11 +93,7 @@ BOOLEAN _app_notifyadd (HWND hwnd, PITEM_LOG ptr_log, PITEM_APP ptr_app) _app_getappicon (ptr_app, FALSE, NULL, &ptr_log->hicon); // remove existing log item (if exists) - if (ptr_app->pnotification) - { - _r_obj_dereference (ptr_app->pnotification); - ptr_app->pnotification = NULL; - } + SAFE_DELETE_REFERENCE (ptr_app->pnotification); ptr_app->pnotification = (PITEM_LOG)_r_obj_reference (ptr_log); @@ -124,11 +112,7 @@ VOID _app_freenotify (SIZE_T app_hash, PITEM_APP ptr_app) if (ptr_app) { - if (ptr_app->pnotification) - { - _r_obj_dereference (ptr_app->pnotification); - ptr_app->pnotification = NULL; - } + SAFE_DELETE_REFERENCE (ptr_app->pnotification); } if (_app_notifyget_id (hwnd, FALSE) == app_hash) @@ -143,27 +127,24 @@ SIZE_T _app_notifyget_id (HWND hwnd, BOOLEAN is_nearest) if (is_nearest) { - for (auto &p : apps) + for (auto it = apps.begin (); it != apps.end (); ++it) { - if (p.first == app_hash_current) // exclude current app from enumeration + if (!it->second || it->first == app_hash_current) // exclude current app from enumeration continue; - PR_OBJECT ptr_app_object = _r_obj2_reference (p.second); + SIZE_T app_hash = it->first; + PITEM_APP ptr_app = (PITEM_APP)_r_obj_reference (it->second); - if (!ptr_app_object) - continue; - - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; - - if (ptr_app && ptr_app->pnotification) + if (ptr_app->pnotification) { - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); - SetWindowLongPtr (hwnd, GWLP_USERDATA, (LONG_PTR)p.first); - return p.first; + SetWindowLongPtr (hwnd, GWLP_USERDATA, (LONG_PTR)app_hash); + + return app_hash; } - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } SetWindowLongPtr (hwnd, GWLP_USERDATA, 0); @@ -175,22 +156,15 @@ SIZE_T _app_notifyget_id (HWND hwnd, BOOLEAN is_nearest) PITEM_LOG _app_notifyget_obj (SIZE_T app_hash) { - PR_OBJECT ptr_app_object = _app_getappitem (app_hash); + PITEM_APP ptr_app = _app_getappitem (app_hash); - if (ptr_app_object) + if (ptr_app) { - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + PITEM_LOG ptr_log = (PITEM_LOG)_r_obj_reference (ptr_app->pnotification); - if (ptr_app) - { - PITEM_LOG ptr_log = (PITEM_LOG)_r_obj_reference (ptr_app->pnotification); + _r_obj_dereference (ptr_app); - _r_obj2_dereference (ptr_app_object); - - return ptr_log; - } - - _r_obj2_dereference (ptr_app_object); + return ptr_log; } return NULL; @@ -201,73 +175,78 @@ BOOLEAN _app_notifyshow (HWND hwnd, PITEM_LOG ptr_log, BOOLEAN is_forced, BOOLEA if (!app.ConfigGetBoolean (L"IsNotificationsEnabled", TRUE)) return FALSE; - PR_OBJECT ptr_app_object = _app_getappitem (ptr_log->app_hash); - - if (!ptr_app_object) - return FALSE; - - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + PITEM_APP ptr_app = _app_getappitem (ptr_log->app_hash); if (!ptr_app) - { - _r_obj2_dereference (ptr_app_object); return FALSE; - } - rstring is_signed; - rstring empty_text = app.LocaleString (IDS_STATUS_EMPTY, NULL); + WCHAR windowTitle[128]; + WCHAR dateString[128]; + PR_STRING signatureString = NULL; + PR_STRING remoteAddressString; + PR_STRING remotePortString; + PR_STRING directionString; + PR_STRING localizedString = NULL; if (app.ConfigGetBoolean (L"IsCertificatesEnabled", FALSE)) { if (ptr_app->is_signed) { - PR_OBJECT ptr_signature_object = _app_getsignatureinfo (ptr_log->app_hash, ptr_app); + PR_STRING signatureCacheString = _app_getsignatureinfo (ptr_log->app_hash, ptr_app); - if (ptr_signature_object) + if (signatureCacheString) { - if (ptr_signature_object->pdata) - is_signed = (LPCWSTR)ptr_signature_object->pdata; - - else - is_signed = app.LocaleString (IDS_SIGN_SIGNED, NULL); - - _r_obj2_dereference (ptr_signature_object); + _r_obj_movereference (&signatureString, signatureCacheString); } else { - is_signed = app.LocaleString (IDS_SIGN_SIGNED, NULL); + signatureString = _r_obj_createstring (app.LocaleString (IDS_SIGN_UNSIGNED)); } } else { - is_signed = app.LocaleString (IDS_SIGN_UNSIGNED, NULL); + signatureString = _r_obj_createstring (app.LocaleString (IDS_SIGN_UNSIGNED)); } } - SetWindowText (hwnd, _r_fmt (L"%s - " APP_NAME, app.LocaleString (IDS_NOTIFY_TITLE, NULL).GetString ()).GetString ()); + _r_str_printf (windowTitle, RTL_NUMBER_OF (windowTitle), L"%s - " APP_NAME, app.LocaleString (IDS_NOTIFY_TITLE)); + + SetWindowText (hwnd, windowTitle); SetWindowLongPtr (hwnd, GWLP_USERDATA, (LONG_PTR)ptr_log->app_hash); SetWindowLongPtr (GetDlgItem (hwnd, IDC_HEADER_ID), GWLP_USERDATA, (LONG_PTR)ptr_log->hicon); // print table text - { - LPWSTR remote_fmt = NULL; - _app_formataddress (ptr_log->af, 0, &ptr_log->remote_addr, 0, &remote_fmt, FMTADDR_RESOLVE_HOST); + remoteAddressString = _app_formataddress (ptr_log->af, 0, &ptr_log->remote_addr, 0, FMTADDR_RESOLVE_HOST); + remotePortString = _app_formatport (ptr_log->remote_port, FALSE); + directionString = _app_getdirectionname (ptr_log->direction, ptr_log->is_loopback, TRUE); - _r_ctrl_settabletext (hwnd, IDC_FILE_ID, app.LocaleString (IDS_NAME, L":").GetString (), IDC_FILE_TEXT, !_r_str_isempty (ptr_app->display_name) ? _r_path_getfilename (ptr_app->display_name) : empty_text.GetString ()); - _r_ctrl_settabletext (hwnd, IDC_SIGNATURE_ID, app.LocaleString (IDS_SIGNATURE, L":").GetString (), IDC_SIGNATURE_TEXT, is_signed.IsEmpty () ? empty_text.GetString () : is_signed.GetString ()); - _r_ctrl_settabletext (hwnd, IDC_ADDRESS_ID, app.LocaleString (IDS_ADDRESS, L":").GetString (), IDC_ADDRESS_TEXT, !_r_str_isempty (remote_fmt) ? remote_fmt : empty_text.GetString ()); - _r_ctrl_settabletext (hwnd, IDC_PORT_ID, app.LocaleString (IDS_PORT, L":").GetString (), IDC_PORT_TEXT, ptr_log->remote_port ? _app_formatport (ptr_log->remote_port, FALSE).GetString () : empty_text.GetString ()); - _r_ctrl_settabletext (hwnd, IDC_DIRECTION_ID, app.LocaleString (IDS_DIRECTION, L":").GetString (), IDC_DIRECTION_TEXT, _app_getdirectionname (ptr_log->direction, ptr_log->is_loopback, TRUE).GetString ()); - _r_ctrl_settabletext (hwnd, IDC_FILTER_ID, app.LocaleString (IDS_FILTER, L":").GetString (), IDC_FILTER_TEXT, !_r_str_isempty (ptr_log->filter_name) ? ptr_log->filter_name : empty_text.GetString ()); - _r_ctrl_settabletext (hwnd, IDC_DATE_ID, app.LocaleString (IDS_DATE, L":").GetString (), IDC_DATE_TEXT, _r_fmt_dateex (ptr_log->timestamp, FDTF_SHORTDATE | FDTF_LONGTIME).GetString ()); + _r_format_dateex (dateString, RTL_NUMBER_OF (dateString), ptr_log->timestamp, FDTF_SHORTDATE | FDTF_LONGTIME); - SAFE_DELETE_MEMORY (remote_fmt); - } + _r_obj_movereference (&localizedString, _r_format_string (L"%s:", app.LocaleString (IDS_NAME))); + _r_ctrl_settabletext (hwnd, IDC_FILE_ID, _r_obj_getstring (localizedString), IDC_FILE_TEXT, _r_path_getbasename (_r_obj_getstring (ptr_app->display_name))); - _r_ctrl_settext (hwnd, IDC_RULES_BTN, app.LocaleString (IDS_TRAY_RULES, NULL).GetString ()); - _r_ctrl_settext (hwnd, IDC_ALLOW_BTN, app.LocaleString (IDS_ACTION_ALLOW, NULL).GetString ()); - _r_ctrl_settext (hwnd, IDC_BLOCK_BTN, app.LocaleString (IDS_ACTION_BLOCK, NULL).GetString ()); + _r_obj_movereference (&localizedString, _r_format_string (L"%s:", app.LocaleString (IDS_SIGNATURE))); + _r_ctrl_settabletext (hwnd, IDC_SIGNATURE_ID, _r_obj_getstring (localizedString), IDC_SIGNATURE_TEXT, _r_obj_getstringordefault (signatureString, SZ_EMPTY)); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s:", app.LocaleString (IDS_ADDRESS))); + _r_ctrl_settabletext (hwnd, IDC_ADDRESS_ID, _r_obj_getstring (localizedString), IDC_ADDRESS_TEXT, _r_obj_getstringordefault (remoteAddressString, SZ_EMPTY)); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s:", app.LocaleString (IDS_PORT))); + _r_ctrl_settabletext (hwnd, IDC_PORT_ID, _r_obj_getstring (localizedString), IDC_PORT_TEXT, _r_obj_getstringordefault (remotePortString, SZ_EMPTY)); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s:", app.LocaleString (IDS_DIRECTION))); + _r_ctrl_settabletext (hwnd, IDC_DIRECTION_ID, _r_obj_getstring (localizedString), IDC_DIRECTION_TEXT, _r_obj_getstringordefault (directionString, SZ_EMPTY)); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s:", app.LocaleString (IDS_FILTER))); + _r_ctrl_settabletext (hwnd, IDC_FILTER_ID, _r_obj_getstring (localizedString), IDC_FILTER_TEXT, _r_obj_getstringordefault (ptr_log->filter_name, SZ_EMPTY)); + + _r_obj_movereference (&localizedString, _r_format_string (L"%s:", app.LocaleString (IDS_DATE))); + _r_ctrl_settabletext (hwnd, IDC_DATE_ID, _r_obj_getstring (localizedString), IDC_DATE_TEXT, dateString); + + _r_ctrl_settext (hwnd, IDC_RULES_BTN, app.LocaleString (IDS_TRAY_RULES)); + _r_ctrl_settext (hwnd, IDC_ALLOW_BTN, app.LocaleString (IDS_ACTION_ALLOW)); + _r_ctrl_settext (hwnd, IDC_BLOCK_BTN, app.LocaleString (IDS_ACTION_BLOCK)); _r_ctrl_enable (hwnd, IDC_RULES_BTN, !is_safety); _r_ctrl_enable (hwnd, IDC_ALLOW_BTN, !is_safety); @@ -275,10 +254,13 @@ BOOLEAN _app_notifyshow (HWND hwnd, PITEM_LOG ptr_log, BOOLEAN is_forced, BOOLEA _r_ctrl_enable (hwnd, IDC_LATER_BTN, !is_safety); if (is_safety) + { SetTimer (hwnd, NOTIFY_TIMER_SAFETY_ID, NOTIFY_TIMER_SAFETY_TIMEOUT, NULL); - + } else + { KillTimer (hwnd, NOTIFY_TIMER_SAFETY_ID); + } _app_notifysetpos (hwnd, FALSE); @@ -295,6 +277,13 @@ BOOLEAN _app_notifyshow (HWND hwnd, PITEM_LOG ptr_log, BOOLEAN is_forced, BOOLEA ShowWindow (hwnd, is_forced ? SW_SHOW : SW_SHOWNA); + SAFE_DELETE_REFERENCE (signatureString); + SAFE_DELETE_REFERENCE (remoteAddressString); + SAFE_DELETE_REFERENCE (remotePortString); + SAFE_DELETE_REFERENCE (directionString); + SAFE_DELETE_REFERENCE (localizedString); + SAFE_DELETE_REFERENCE (ptr_app); + return TRUE; } @@ -319,17 +308,19 @@ VOID _app_notifyplaysound () if (RegOpenKeyEx (HKEY_CURRENT_USER, L"AppEvents\\Schemes\\Apps\\.Default\\" NOTIFY_SOUND_NAME L"\\.Default", 0, KEY_READ, &hkey) == ERROR_SUCCESS) { - rstring path = _r_reg_querystring (hkey, NULL); + PR_STRING path = _r_reg_querystring (hkey, NULL); - if (!path.IsEmpty ()) + if (path) { - path = _r_path_expand (path.GetString ()); + PR_STRING expandedString = _r_str_expandenvironmentstring (path); - if (_r_fs_exists (path.GetString ())) - { - _r_str_copy (notify_snd_path, RTL_NUMBER_OF (notify_snd_path), path.GetString ()); - result = TRUE; - } + if (expandedString) + _r_obj_movereference (&path, expandedString); + + _r_str_copy (notify_snd_path, RTL_NUMBER_OF (notify_snd_path), _r_obj_getstring (path)); + _r_obj_dereference (path); + + result = TRUE; } RegCloseKey (hkey); @@ -340,7 +331,7 @@ VOID _app_notifyplaysound () result = TRUE; } - if (!result || !_r_fs_exists (notify_snd_path) || !PlaySound (notify_snd_path, NULL, SND_ASYNC | SND_NODEFAULT | SND_NOWAIT | SND_FILENAME | SND_SENTRY)) + if (!result || !PlaySound (notify_snd_path, NULL, SND_ASYNC | SND_NODEFAULT | SND_NOWAIT | SND_FILENAME | SND_SENTRY)) PlaySound (NOTIFY_SOUND_NAME, NULL, SND_ASYNC | SND_NODEFAULT | SND_NOWAIT | SND_SENTRY); } @@ -395,7 +386,7 @@ VOID _app_notifysetpos (HWND hwnd, BOOLEAN is_forced) APPBARDATA abd; abd.cbSize = sizeof (abd); - if ((BOOL)SHAppBarMessage (ABM_GETTASKBARPOS, &abd)) + if (SHAppBarMessage (ABM_GETTASKBARPOS, &abd)) { INT border_x = _r_dc_getsystemmetrics (hwnd, SM_CXBORDER); @@ -535,11 +526,11 @@ INT_PTR CALLBACK NotificationProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lp if (htip) { - _r_ctrl_settip (htip, hwnd, IDC_FILE_TEXT, LPSTR_TEXTCALLBACK); - _r_ctrl_settip (htip, hwnd, IDC_RULES_BTN, LPSTR_TEXTCALLBACK); - _r_ctrl_settip (htip, hwnd, IDC_ALLOW_BTN, LPSTR_TEXTCALLBACK); - _r_ctrl_settip (htip, hwnd, IDC_BLOCK_BTN, LPSTR_TEXTCALLBACK); - _r_ctrl_settip (htip, hwnd, IDC_LATER_BTN, LPSTR_TEXTCALLBACK); + _r_ctrl_settiptext (htip, hwnd, IDC_FILE_TEXT, LPSTR_TEXTCALLBACK); + _r_ctrl_settiptext (htip, hwnd, IDC_RULES_BTN, LPSTR_TEXTCALLBACK); + _r_ctrl_settiptext (htip, hwnd, IDC_ALLOW_BTN, LPSTR_TEXTCALLBACK); + _r_ctrl_settiptext (htip, hwnd, IDC_BLOCK_BTN, LPSTR_TEXTCALLBACK); + _r_ctrl_settiptext (htip, hwnd, IDC_LATER_BTN, LPSTR_TEXTCALLBACK); } break; @@ -630,7 +621,7 @@ INT_PTR CALLBACK NotificationProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lp INT wnd_height = _r_calc_rectheight (INT, &clientRect); SetRect (&clientRect, 0, wnd_height - _r_dc_getdpi (hwnd, _R_SIZE_FOOTERHEIGHT), wnd_width, wnd_height); - _r_dc_fillrect (hdc, &clientRect, GetSysColor (COLOR_3DFACE)); + _r_dc_fillrect (hdc, &clientRect, GetSysColor (COLOR_BTNFACE)); for (INT i = 0; i < wnd_width; i++) SetPixelV (hdc, i, clientRect.top, GetSysColor (COLOR_APPWORKSPACE)); @@ -685,10 +676,10 @@ INT_PTR CALLBACK NotificationProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lp DrawGradient (drawInfo->hDC, &drawInfo->rcItem, app.ConfigGetUlong (L"NotificationBackground1", NOTIFY_GRADIENT_1), app.ConfigGetUlong (L"NotificationBackground2", NOTIFY_GRADIENT_2), GRADIENT_FILL_RECT_H); // draw title text - WCHAR text[128] = {0}; - _r_str_printf (text, RTL_NUMBER_OF (text), app.LocaleString (IDS_NOTIFY_HEADER, NULL).GetString (), APP_NAME); + WCHAR text[128]; + _r_str_printf (text, RTL_NUMBER_OF (text), app.LocaleString (IDS_NOTIFY_HEADER), APP_NAME); - COLORREF clr_prev = SetTextColor (drawInfo->hDC, GetSysColor (COLOR_WINDOW)); + COLORREF clr_prev = SetTextColor (drawInfo->hDC, RGB (255, 255, 255)); DrawTextEx (drawInfo->hDC, text, (INT)_r_str_length (text), &textRect, DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS | DT_NOCLIP | DT_NOPREFIX, NULL); SetTextColor (drawInfo->hDC, clr_prev); @@ -761,13 +752,13 @@ INT_PTR CALLBACK NotificationProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lp if (ctrl_id == IDC_RULES_BTN) { - AppendMenu (hsubmenu, MF_STRING, IDM_DISABLENOTIFICATIONS, app.LocaleString (IDS_DISABLENOTIFICATIONS, NULL).GetString ()); + AppendMenu (hsubmenu, MF_STRING, IDM_DISABLENOTIFICATIONS, app.LocaleString (IDS_DISABLENOTIFICATIONS)); _app_generate_rulesmenu (hsubmenu, _app_notifyget_id (hwnd, FALSE)); } else if (ctrl_id == IDC_ALLOW_BTN) { - AppendMenu (hsubmenu, MF_STRING, IDC_ALLOW_BTN, app.LocaleString (IDS_ACTION_ALLOW, NULL).GetString ()); + AppendMenu (hsubmenu, MF_STRING, IDC_ALLOW_BTN, app.LocaleString (IDS_ACTION_ALLOW)); AppendMenu (hsubmenu, MF_SEPARATOR, 0, NULL); _app_generate_timermenu (hsubmenu, 0); @@ -821,7 +812,13 @@ INT_PTR CALLBACK NotificationProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lp nmlvgit.iItem = item_id; nmlvgit.lParam = 0; - _r_str_copy (buffer, RTL_NUMBER_OF (buffer), _app_gettooltip (app.GetHWND (), &nmlvgit).GetString ()); + PR_STRING string = _app_gettooltip (app.GetHWND (), &nmlvgit); + + if (string) + { + _r_str_copy (buffer, RTL_NUMBER_OF (buffer), string->Buffer); + _r_obj_dereference (string); + } } } @@ -830,23 +827,29 @@ INT_PTR CALLBACK NotificationProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lp } else if (ctrl_id == IDC_RULES_BTN) { - _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_NOTIFY_TOOLTIP, NULL).GetString ()); + _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_NOTIFY_TOOLTIP)); } else if (ctrl_id == IDC_ALLOW_BTN) { - _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_ACTION_ALLOW_HINT, NULL).GetString ()); + _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_ACTION_ALLOW_HINT)); } else if (ctrl_id == IDC_BLOCK_BTN) { - _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_ACTION_BLOCK_HINT, NULL).GetString ()); + _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_ACTION_BLOCK_HINT)); } else if (ctrl_id == IDC_LATER_BTN) { - _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_ACTION_LATER_HINT, NULL).GetString ()); + _r_str_copy (buffer, RTL_NUMBER_OF (buffer), app.LocaleString (IDS_ACTION_LATER_HINT)); } else { - _r_str_copy (buffer, RTL_NUMBER_OF (buffer), _r_ctrl_gettext (hwnd, ctrl_id).GetString ()); + PR_STRING string = _r_ctrl_gettext (hwnd, ctrl_id); + + if (string) + { + _r_str_copy (buffer, RTL_NUMBER_OF (buffer), _r_obj_getstring (string)); + _r_obj_dereference (string); + } } if (!_r_str_isempty (buffer)) @@ -866,99 +869,89 @@ INT_PTR CALLBACK NotificationProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lp if ((LOWORD (wparam) >= IDX_RULES_SPECIAL && LOWORD (wparam) <= IDX_RULES_SPECIAL + (INT)rules_arr.size ())) { SIZE_T rule_idx = (LOWORD (wparam) - IDX_RULES_SPECIAL); - PR_OBJECT ptr_rule_object = _app_getrulebyid (rule_idx); + PITEM_RULE ptr_rule = _app_getrulebyid (rule_idx); - if (!ptr_rule_object) + if (!ptr_rule) return FALSE; - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; + PITEM_LOG ptr_log = _app_notifyget_obj (_app_notifyget_id (hwnd, FALSE)); - if (ptr_rule) + if (ptr_log) { - PITEM_LOG ptr_log = _app_notifyget_obj (_app_notifyget_id (hwnd, FALSE)); - - if (ptr_log) + if (ptr_log->app_hash && !(ptr_rule->is_forservices && (ptr_log->app_hash == config.ntoskrnl_hash || ptr_log->app_hash == config.svchost_hash))) { - if (ptr_log->app_hash && !(ptr_rule->is_forservices && (ptr_log->app_hash == config.ntoskrnl_hash || ptr_log->app_hash == config.svchost_hash))) + PITEM_APP ptr_app = _app_getappitem (ptr_log->app_hash); + + if (ptr_app) { - PR_OBJECT ptr_app_object = _app_getappitem (ptr_log->app_hash); + _app_freenotify (ptr_log->app_hash, ptr_app); - if (ptr_app_object) + BOOLEAN is_remove = ptr_rule->is_enabled && (ptr_rule->apps->find (ptr_log->app_hash) != ptr_rule->apps->end ()); + + if (is_remove) { - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + ptr_rule->apps->erase (ptr_log->app_hash); - if (ptr_app) - { - _app_freenotify (ptr_log->app_hash, ptr_app); - - BOOLEAN is_remove = ptr_rule->is_enabled && (ptr_rule->apps.find (ptr_log->app_hash) != ptr_rule->apps.end ()); - - if (is_remove) - { - ptr_rule->apps.erase (ptr_log->app_hash); - - if (ptr_rule->apps.empty ()) - _app_ruleenable (ptr_rule, FALSE); - } - else - { - ptr_rule->apps[ptr_log->app_hash] = TRUE; - _app_ruleenable (ptr_rule, TRUE); - } - - INT listview_id = (INT)_r_tab_getlparam (app.GetHWND (), IDC_TAB, INVALID_INT); - INT app_listview_id = _app_getlistview_id (ptr_app->type); - INT rule_listview_id = _app_getlistview_id (ptr_rule->type); - - { - INT item_pos = _app_getposition (app.GetHWND (), app_listview_id, ptr_log->app_hash); - - if (item_pos != INVALID_INT) - { - _r_fastlock_acquireshared (&lock_checkbox); - _app_setappiteminfo (app.GetHWND (), app_listview_id, item_pos, ptr_log->app_hash, ptr_app); - _r_fastlock_releaseshared (&lock_checkbox); - } - } - - { - INT item_pos = _app_getposition (app.GetHWND (), rule_listview_id, rule_idx); - - if (item_pos != INVALID_INT) - { - _r_fastlock_acquireshared (&lock_checkbox); - _app_setruleiteminfo (app.GetHWND (), rule_listview_id, item_pos, ptr_rule, FALSE); - _r_fastlock_releaseshared (&lock_checkbox); - } - } - - OBJECTS_VEC rules; - rules.push_back (ptr_rule_object); - - HANDLE hengine = _wfp_getenginehandle (); - - if (hengine) - _wfp_create4filters (hengine, rules, __LINE__); - - if (listview_id == app_listview_id || listview_id == rule_listview_id) - { - _app_listviewsort (app.GetHWND (), listview_id, INVALID_INT, FALSE); - _r_listview_redraw (app.GetHWND (), listview_id, INVALID_INT); - } - - _app_refreshstatus (app.GetHWND (), listview_id); - _app_profile_save (NULL); - } - - _r_obj2_dereference (ptr_app_object); + if (ptr_rule->apps->empty ()) + _app_ruleenable (ptr_rule, FALSE); + } + else + { + ptr_rule->apps->emplace (ptr_log->app_hash, TRUE); + _app_ruleenable (ptr_rule, TRUE); } - } - _r_obj_dereference (ptr_log); + INT listview_id = (INT)_r_tab_getlparam (app.GetHWND (), IDC_TAB, INVALID_INT); + INT app_listview_id = _app_getlistview_id (ptr_app->type); + INT rule_listview_id = _app_getlistview_id (ptr_rule->type); + + { + INT item_pos = _app_getposition (app.GetHWND (), app_listview_id, ptr_log->app_hash); + + if (item_pos != INVALID_INT) + { + _r_fastlock_acquireshared (&lock_checkbox); + _app_setappiteminfo (app.GetHWND (), app_listview_id, item_pos, ptr_log->app_hash, ptr_app); + _r_fastlock_releaseshared (&lock_checkbox); + } + } + + { + INT item_pos = _app_getposition (app.GetHWND (), rule_listview_id, rule_idx); + + if (item_pos != INVALID_INT) + { + _r_fastlock_acquireshared (&lock_checkbox); + _app_setruleiteminfo (app.GetHWND (), rule_listview_id, item_pos, ptr_rule, FALSE); + _r_fastlock_releaseshared (&lock_checkbox); + } + } + + OBJECTS_RULE_VECTOR rules; + rules.emplace_back (ptr_rule); + + HANDLE hengine = _wfp_getenginehandle (); + + if (hengine) + _wfp_create4filters (hengine, &rules, __LINE__); + + if (listview_id == app_listview_id || listview_id == rule_listview_id) + { + _app_listviewsort (app.GetHWND (), listview_id, INVALID_INT, FALSE); + _r_listview_redraw (app.GetHWND (), listview_id, INVALID_INT); + } + + _app_refreshstatus (app.GetHWND (), listview_id); + _app_profile_save (NULL); + + _r_obj_dereference (ptr_app); + } } + + _r_obj_dereference (ptr_log); } - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); return FALSE; } @@ -988,23 +981,18 @@ INT_PTR CALLBACK NotificationProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lp if (ptr_log) { - PR_OBJECT ptr_app_object = _app_getappitem (ptr_log->app_hash); + PITEM_APP ptr_app = _app_getappitem (ptr_log->app_hash); - if (ptr_app_object) + if (ptr_app) { - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + INT listview_id = _app_getlistview_id (ptr_app->type); - if (ptr_app) - { - INT listview_id = _app_getlistview_id (ptr_app->type); + if (listview_id) + _app_showitem (app.GetHWND (), listview_id, _app_getposition (app.GetHWND (), listview_id, ptr_log->app_hash), INVALID_INT); - if (listview_id) - _app_showitem (app.GetHWND (), listview_id, _app_getposition (app.GetHWND (), listview_id, ptr_log->app_hash), INVALID_INT); + _r_wnd_toggle (app.GetHWND (), TRUE); - _r_wnd_toggle (app.GetHWND (), TRUE); - } - - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } _r_obj_dereference (ptr_log); @@ -1058,49 +1046,51 @@ INT_PTR CALLBACK NotificationProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lp case IDM_OPENRULESEDITOR: { - PITEM_RULE ptr_rule = new ITEM_RULE; - PR_OBJECT ptr_rule_object = _r_obj2_allocateex (ptr_rule, &_app_dereferencerule); + PITEM_APP ptr_app; + PITEM_RULE ptr_rule; + PITEM_LOG ptr_log; + SIZE_T app_hash; - SIZE_T app_hash = 0; - PITEM_LOG ptr_log = _app_notifyget_obj (_app_notifyget_id (hwnd, FALSE)); + 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; + + ptr_log = _app_notifyget_obj (_app_notifyget_id (hwnd, FALSE)); if (ptr_log) { app_hash = ptr_log->app_hash; - ptr_rule->apps[app_hash] = TRUE; + ptr_rule->apps->emplace (app_hash, TRUE); ptr_rule->protocol = ptr_log->protocol; ptr_rule->direction = ptr_log->direction; - PR_OBJECT ptr_app_object = _app_getappitem (app_hash); + ptr_app = _app_getappitem (app_hash); - if (ptr_app_object) + if (ptr_app) { - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; - - if (ptr_app) - _app_freenotify (app_hash, ptr_app); - - _r_obj2_dereference (ptr_app_object); + _app_freenotify (app_hash, ptr_app); + _r_obj_dereference (ptr_app); } - LPWSTR rule = NULL; + PR_STRING remoteRuleString; - if (_app_formataddress (ptr_log->af, 0, &ptr_log->remote_addr, ptr_log->remote_port, &rule, FMTADDR_AS_RULE)) + remoteRuleString = _app_formataddress (ptr_log->af, 0, &ptr_log->remote_addr, ptr_log->remote_port, FMTADDR_AS_RULE); + + if (remoteRuleString) { - SIZE_T len = _r_str_length (rule); + ptr_rule->name = _r_obj_createstring2 (remoteRuleString); - _r_str_alloc (&ptr_rule->pname, len, rule); - _r_str_alloc (&ptr_rule->prule_remote, len, rule); + _r_obj_movereference (&ptr_rule->rule_remote, remoteRuleString); } - SAFE_DELETE_MEMORY (rule); - _r_obj_dereference (ptr_log); } else { - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); break; } @@ -1109,10 +1099,10 @@ INT_PTR CALLBACK NotificationProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lp _app_ruleenable (ptr_rule, TRUE); - if (DialogBoxParam (NULL, MAKEINTRESOURCE (IDD_EDITOR), app.GetHWND (), &EditorProc, (LPARAM)ptr_rule_object)) + if (DialogBoxParam (NULL, MAKEINTRESOURCE (IDD_EDITOR), app.GetHWND (), &EditorProc, (LPARAM)ptr_rule)) { SIZE_T rule_idx = rules_arr.size (); - rules_arr.push_back (_r_obj2_reference (ptr_rule_object)); + rules_arr.emplace_back ((PITEM_RULE)_r_obj_reference (ptr_rule)); INT listview_id = (INT)_r_tab_getlparam (app.GetHWND (), IDC_TAB, INVALID_INT); @@ -1125,7 +1115,7 @@ INT_PTR CALLBACK NotificationProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lp _r_fastlock_acquireshared (&lock_checkbox); - _r_listview_additem (app.GetHWND (), rules_listview_id, item_id, 0, ptr_rule->pname, _app_getruleicon (ptr_rule), _app_getrulegroup (ptr_rule), rule_idx); + _r_listview_additem (app.GetHWND (), rules_listview_id, item_id, 0, _r_obj_getstringorempty (ptr_rule->name), _app_getruleicon (ptr_rule), _app_getrulegroup (ptr_rule), rule_idx); _app_setruleiteminfo (app.GetHWND (), rules_listview_id, item_id, ptr_rule, TRUE); _r_fastlock_releaseshared (&lock_checkbox); @@ -1135,40 +1125,35 @@ INT_PTR CALLBACK NotificationProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lp } // set app information - PR_OBJECT ptr_app_object = _app_getappitem (app_hash); + ptr_app = _app_getappitem (app_hash); - if (ptr_app_object) + if (ptr_app) { - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + INT app_listview_id = _app_getlistview_id (ptr_app->type); - if (ptr_app) + if (app_listview_id) { - INT app_listview_id = _app_getlistview_id (ptr_app->type); + INT item_pos = _app_getposition (app.GetHWND (), app_listview_id, app_hash); - if (app_listview_id) + if (item_pos != INVALID_INT) { - INT item_pos = _app_getposition (app.GetHWND (), app_listview_id, app_hash); - - if (item_pos != INVALID_INT) - { - _r_fastlock_acquireshared (&lock_checkbox); - _app_setappiteminfo (app.GetHWND (), app_listview_id, item_pos, app_hash, ptr_app); - _r_fastlock_releaseshared (&lock_checkbox); - } - - if (app_listview_id == listview_id) - _app_listviewsort (app.GetHWND (), listview_id, INVALID_INT, FALSE); + _r_fastlock_acquireshared (&lock_checkbox); + _app_setappiteminfo (app.GetHWND (), app_listview_id, item_pos, app_hash, ptr_app); + _r_fastlock_releaseshared (&lock_checkbox); } + + if (app_listview_id == listview_id) + _app_listviewsort (app.GetHWND (), listview_id, INVALID_INT, FALSE); } - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } _app_refreshstatus (app.GetHWND (), listview_id); _app_profile_save (NULL); } - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); break; } diff --git a/src/profile.cpp b/src/profile.cpp index 9ec80915..e2ccb31b 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -5,78 +5,72 @@ LONG_PTR _app_getappinfo (SIZE_T app_hash, ENUM_INFO_DATA info_key) { - PR_OBJECT ptr_app_object = _app_getappitem (app_hash); + LONG_PTR result; + PITEM_APP ptr_app; - if (!ptr_app_object) + ptr_app = _app_getappitem (app_hash); + + if (!ptr_app) return 0; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; - LONG_PTR result = 0; + result = 0; - if (ptr_app) + if (info_key == InfoPath) { - if (info_key == InfoPath) - { - if (!_r_str_isempty (ptr_app->real_path)) - result = (LONG_PTR)ptr_app->real_path; - } - else if (info_key == InfoName) - { - if (!_r_str_isempty (ptr_app->display_name)) - result = (LONG_PTR)ptr_app->display_name; + if (!_r_str_isempty (ptr_app->real_path)) + result = (LONG_PTR)ptr_app->real_path->Buffer; + } + else if (info_key == InfoName) + { + if (!_r_str_isempty (ptr_app->display_name)) + result = (LONG_PTR)ptr_app->display_name->Buffer; - else if (!_r_str_isempty (ptr_app->original_path)) - result = (LONG_PTR)ptr_app->original_path; - } - else if (info_key == InfoTimestampPtr) - { - result = (LONG_PTR)&ptr_app->timestamp; - } - else if (info_key == InfoTimerPtr) - { - result = (LONG_PTR)&ptr_app->timer; - } - else if (info_key == InfoIconId) - { - result = (LONG_PTR)ptr_app->icon_id; - } - else if (info_key == InfoListviewId) - { - result = (LONG_PTR)_app_getlistview_id (ptr_app->type); - } - else if (info_key == InfoIsSilent) - { - result = ptr_app->is_silent ? TRUE : FALSE; - } - else if (info_key == InfoIsUndeletable) - { - result = ptr_app->is_undeletable ? TRUE : FALSE; - } + else if (!_r_str_isempty (ptr_app->original_path)) + result = (LONG_PTR)ptr_app->original_path->Buffer; + } + else if (info_key == InfoTimestampPtr) + { + result = (LONG_PTR)&ptr_app->timestamp; + } + else if (info_key == InfoTimerPtr) + { + result = (LONG_PTR)&ptr_app->timer; + } + else if (info_key == InfoIconId) + { + result = (LONG_PTR)ptr_app->icon_id; + } + else if (info_key == InfoListviewId) + { + result = (LONG_PTR)_app_getlistview_id (ptr_app->type); + } + else if (info_key == InfoIsSilent) + { + result = ptr_app->is_silent ? TRUE : FALSE; + } + else if (info_key == InfoIsUndeletable) + { + result = ptr_app->is_undeletable ? TRUE : FALSE; } - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); return result; } BOOLEAN _app_setappinfo (SIZE_T app_hash, ENUM_INFO_DATA info_key, LONG_PTR info_value) { - PR_OBJECT ptr_app_object = _app_getappitem (app_hash); + PITEM_APP ptr_app = _app_getappitem (app_hash); - if (!ptr_app_object) + if (!ptr_app) return FALSE; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; - - if (ptr_app) + if (info_key == InfoIsUndeletable) { - if (info_key == InfoIsUndeletable) - { - ptr_app->is_undeletable = info_value ? TRUE : FALSE; - } + ptr_app->is_undeletable = info_value ? TRUE : FALSE; } - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); return TRUE; } @@ -86,94 +80,108 @@ SIZE_T _app_addapplication (HWND hwnd, LPCWSTR path, time_t timestamp, time_t ti if (_r_str_isempty (path) || PathIsDirectory (path)) return 0; - // prevent possible duplicate apps entries with short path (issue #640) WCHAR path_full[1024]; + PITEM_APP ptr_app; + PR_STRING signatureString; + SIZE_T app_length; + SIZE_T app_hash; + BOOLEAN is_ntoskrnl; - if (_r_str_find (path, INVALID_SIZE_T, L'~', 0) != INVALID_SIZE_T) + app_length = _r_str_length (path); + + // prevent possible duplicate apps entries with short path (issue #640) + if (_r_str_findchar (path, app_length, L'~', TRUE) != INVALID_SIZE_T) { if (GetLongPathName (path, path_full, RTL_NUMBER_OF (path_full))) + { path = path_full; + app_length = _r_str_length (path_full); + } } - SIZE_T app_length = _r_str_length (path); - SIZE_T app_hash = _r_str_hash (path); + app_hash = _r_str_hash (path); if (_app_isappfound (app_hash)) return app_hash; // already exists - PITEM_APP ptr_app = new ITEM_APP; - - BOOLEAN is_ntoskrnl = (app_hash == config.ntoskrnl_hash); - - rstring real_path; + ptr_app = (PITEM_APP)_r_obj_allocateex (sizeof (ITEM_APP), &_app_dereferenceapp); + is_ntoskrnl = (app_hash == config.ntoskrnl_hash); if (_r_str_compare_length (path, L"\\device\\", 8) == 0) // device path { - real_path = path; - + ptr_app->real_path = _r_obj_createstring (path); ptr_app->type = DataAppDevice; } else if (_r_str_compare_length (path, L"S-1-", 4) == 0) // windows store (win8+) { + _app_item_get (DataAppUWP, app_hash, NULL, &ptr_app->real_path, timestamp ? NULL : ×tamp, NULL); ptr_app->type = DataAppUWP; - - _app_item_get (DataAppUWP, app_hash, NULL, &real_path, timestamp ? NULL : ×tamp, NULL); - } - else if (PathIsNetworkPath (path)) // network path - { - real_path = path; - - ptr_app->type = DataAppNetwork; } else { - real_path = path; - - if (!is_ntoskrnl && _r_str_find (real_path.GetString (), real_path.GetLength (), OBJ_NAME_PATH_SEPARATOR, 0) == INVALID_SIZE_T) + if (!is_ntoskrnl && _r_str_findchar (path, app_length, OBJ_NAME_PATH_SEPARATOR, TRUE) == INVALID_SIZE_T) { - if (_app_item_get (DataAppService, app_hash, NULL, &real_path, timestamp ? NULL : ×tamp, NULL)) + if (_app_item_get (DataAppService, app_hash, NULL, &ptr_app->real_path, timestamp ? NULL : ×tamp, NULL)) + { ptr_app->type = DataAppService; - + } else + { + ptr_app->real_path = _r_obj_createstring (path); ptr_app->type = DataAppPico; + } } else { - ptr_app->type = DataAppRegular; - if (is_ntoskrnl) // "System" process - real_path = _r_path_expand (PATH_NTOSKRNL); + { + ptr_app->real_path = _r_obj_createstring2 (config.ntoskrnl_path); + } + else + { + ptr_app->real_path = _r_obj_createstring (path); + } + + if (PathIsNetworkPath (path)) + { + ptr_app->type = DataAppNetwork; // network path + } + else + { + ptr_app->type = DataAppRegular; + } } } - if (!real_path.IsEmpty () && ptr_app->type == DataAppRegular) + if (!_r_str_isempty (ptr_app->real_path) && ptr_app->type == DataAppRegular) { - DWORD dwAttr = GetFileAttributes (real_path.GetString ()); + DWORD dwAttr = GetFileAttributes (_r_obj_getstring (ptr_app->real_path)); - ptr_app->is_system = is_ntoskrnl || (dwAttr & FILE_ATTRIBUTE_SYSTEM) == FILE_ATTRIBUTE_SYSTEM || (_r_str_compare_length (real_path.GetString (), config.windows_dir, config.wd_length) == 0); + ptr_app->is_system = is_ntoskrnl || (dwAttr & FILE_ATTRIBUTE_SYSTEM) != 0 || (_r_str_compare_length (_r_obj_getstring (ptr_app->real_path), config.windows_dir, config.wd_length) == 0); } - _r_str_alloc (&ptr_app->original_path, app_length, path); - _r_str_alloc (&ptr_app->real_path, real_path.GetLength (), real_path.GetString ()); + ptr_app->original_path = _r_obj_createstringex (path, app_length * sizeof (WCHAR)); if (is_ntoskrnl && !_r_str_isempty (ptr_app->original_path)) { _r_str_tolower (ptr_app->original_path); - ptr_app->original_path[0] = _r_str_upper (ptr_app->original_path[0]); // fix "System" lowercase + ptr_app->original_path->Buffer[0] = _r_str_upper (ptr_app->original_path->Buffer[0]); // fix "System" lowercase } // get display name - _app_getdisplayname (app_hash, ptr_app, &ptr_app->display_name); + _r_obj_movereference (&ptr_app->display_name, _app_getdisplayname (app_hash, ptr_app)); // get signature information if (app.ConfigGetBoolean (L"IsCertificatesEnabled", FALSE)) { - PR_OBJECT ptr_signer_object = _app_getsignatureinfo (app_hash, ptr_app); + signatureString = _app_getsignatureinfo (app_hash, ptr_app); - if (ptr_signer_object) - _r_obj2_dereference (ptr_signer_object); + if (signatureString) + _r_obj_dereference (signatureString); } + ptr_app->guids = new GUIDS_VEC; // initialize stl + ptr_app->is_enabled = is_enabled; ptr_app->is_silent = is_silent; @@ -185,7 +193,7 @@ SIZE_T _app_addapplication (HWND hwnd, LPCWSTR path, time_t timestamp, time_t ti ptr_app->is_undeletable = TRUE; // insert object into the map - apps[app_hash] = _r_obj2_allocateex (ptr_app, &_app_dereferenceapp); + apps.emplace (app_hash, ptr_app); // insert item if (hwnd) @@ -196,7 +204,7 @@ SIZE_T _app_addapplication (HWND hwnd, LPCWSTR path, time_t timestamp, time_t ti { _r_fastlock_acquireshared (&lock_checkbox); - _r_listview_additem (hwnd, listview_id, 0, 0, ptr_app->display_name, ptr_app->icon_id, _app_getappgroup (app_hash, ptr_app), app_hash); + _r_listview_additem (hwnd, listview_id, 0, 0, _r_obj_getstringordefault (ptr_app->display_name, SZ_EMPTY), ptr_app->icon_id, _app_getappgroup (app_hash, ptr_app), app_hash); _app_setappiteminfo (hwnd, listview_id, 0, app_hash, ptr_app); _r_fastlock_releaseshared (&lock_checkbox); @@ -206,10 +214,15 @@ SIZE_T _app_addapplication (HWND hwnd, LPCWSTR path, time_t timestamp, time_t ti return app_hash; } -PR_OBJECT _app_getappitem (SIZE_T app_hash) +PITEM_APP _app_getappitem (SIZE_T app_hash) { if (_app_isappfound (app_hash)) - return _r_obj2_reference (apps[app_hash]); + { + PVOID pdata = apps.at (app_hash); + + if (pdata) + return (PITEM_APP)_r_obj_reference (pdata); + } return NULL; } @@ -218,51 +231,47 @@ PITEM_APP_HELPER _app_getapphelperitem (SIZE_T app_hash) { if (_app_isapphelperfound (app_hash)) { - PVOID ptr = apps_helper[app_hash]; + PVOID pdata = apps_helper.at (app_hash); - if (ptr) - return (PITEM_APP_HELPER)_r_obj_reference (ptr); + if (pdata) + return (PITEM_APP_HELPER)_r_obj_reference (pdata); } return NULL; } -PR_OBJECT _app_getrulebyid (SIZE_T idx) +PITEM_RULE _app_getrulebyid (SIZE_T idx) { if (idx != INVALID_SIZE_T && idx < rules_arr.size ()) { - PR_OBJECT ptr_rule_object = rules_arr.at (idx); + PITEM_RULE pdata = rules_arr.at (idx); - if (ptr_rule_object) - return _r_obj2_reference (ptr_rule_object); + if (pdata) + return (PITEM_RULE)_r_obj_reference (pdata); } return NULL; } -PR_OBJECT _app_getrulebyhash (SIZE_T rule_hash) +PITEM_RULE _app_getrulebyhash (SIZE_T rule_hash) { if (!rule_hash) return NULL; - for (auto &p : rules_arr) + for (auto it = rules_arr.begin (); it != rules_arr.end (); ++it) { - if (!p) + if (!*it) continue; - PR_OBJECT ptr_rule_object = _r_obj2_reference (p); - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; + PITEM_RULE ptr_rule = (PITEM_RULE)_r_obj_reference (*it); - if (ptr_rule) + if (ptr_rule->is_readonly) { - if (ptr_rule->is_readonly) - { - if (_r_str_hash (ptr_rule->pname) == rule_hash) - return ptr_rule_object; - } + if (_r_str_hash (ptr_rule->name) == rule_hash) + return ptr_rule; } - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); } return NULL; @@ -272,10 +281,10 @@ PITEM_NETWORK _app_getnetworkitem (SIZE_T network_hash) { if (network_map.find (network_hash) != network_map.end ()) { - PVOID ptr = network_map[network_hash]; + PVOID pdata = network_map.at (network_hash); - if (ptr) - return (PITEM_NETWORK)_r_obj_reference (ptr); + if (pdata) + return (PITEM_NETWORK)_r_obj_reference (pdata); } return NULL; @@ -301,8 +310,13 @@ SIZE_T _app_getnetworkapp (SIZE_T network_hash) PITEM_LOG _app_getlogitem (SIZE_T idx) { - if (idx != INVALID_SIZE_T && idx < log_arr.size () && log_arr.at (idx) != NULL) - return (PITEM_LOG)_r_obj_reference (log_arr.at (idx)); + if (idx != INVALID_SIZE_T && idx < log_arr.size ()) + { + PVOID pdata = log_arr.at (idx); + + if (pdata) + return (PITEM_LOG)_r_obj_reference (pdata); + } return NULL; } @@ -325,58 +339,53 @@ SIZE_T _app_getlogapp (SIZE_T idx) COLORREF _app_getappcolor (INT listview_id, SIZE_T app_hash) { - rstring color_value; + PITEM_APP ptr_app = _app_getappitem (app_hash); - PR_OBJECT ptr_app_object = _app_getappitem (app_hash); - - if (!ptr_app_object) + if (!ptr_app) return 0; + LPCWSTR colorValue = NULL; + BOOLEAN is_profilelist = (listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_RULES_CUSTOM); BOOLEAN is_networklist = (listview_id >= IDC_NETWORK && listview_id <= IDC_LOG); BOOLEAN is_editorlist = (listview_id == IDC_RULE_APPS_ID); - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + if (app.ConfigGetBoolean (L"IsHighlightInvalid", TRUE, L"colors") && !_app_isappexists (ptr_app)) + colorValue = L"ColorInvalid"; - if (ptr_app) - { - if (app.ConfigGetBoolean (L"IsHighlightInvalid", TRUE, L"colors") && !_app_isappexists (ptr_app)) - color_value = L"ColorInvalid"; + else if (app.ConfigGetBoolean (L"IsHighlightTimer", TRUE, L"colors") && _app_istimeractive (ptr_app)) + colorValue = L"ColorTimer"; - else if (app.ConfigGetBoolean (L"IsHighlightTimer", TRUE, L"colors") && _app_istimeractive (ptr_app)) - color_value = L"ColorTimer"; + else if (!is_networklist && !ptr_app->is_silent && app.ConfigGetBoolean (L"IsHighlightConnection", TRUE, L"colors") && _app_isapphaveconnection (app_hash)) + colorValue = L"ColorConnection"; - else if (!is_networklist && !ptr_app->is_silent && app.ConfigGetBoolean (L"IsHighlightConnection", TRUE, L"colors") && _app_isapphaveconnection (app_hash)) - color_value = L"ColorConnection"; + else if (app.ConfigGetBoolean (L"IsHighlightSigned", TRUE, L"colors") && !ptr_app->is_silent && app.ConfigGetBoolean (L"IsCertificatesEnabled", FALSE) && ptr_app->is_signed) + colorValue = L"ColorSigned"; - else if (app.ConfigGetBoolean (L"IsHighlightSigned", TRUE, L"colors") && !ptr_app->is_silent && app.ConfigGetBoolean (L"IsCertificatesEnabled", FALSE) && ptr_app->is_signed) - color_value = L"ColorSigned"; + else if ((!is_profilelist || !app.ConfigGetBoolean (L"IsEnableSpecialGroup", TRUE)) && (app.ConfigGetBoolean (L"IsHighlightSpecial", TRUE, L"colors") && _app_isapphaverule (app_hash))) + colorValue = L"ColorSpecial"; - else if ((!is_profilelist || !app.ConfigGetBoolean (L"IsEnableSpecialGroup", TRUE)) && (app.ConfigGetBoolean (L"IsHighlightSpecial", TRUE, L"colors") && _app_isapphaverule (app_hash))) - color_value = L"ColorSpecial"; + else if (is_profilelist && app.ConfigGetBoolean (L"IsHighlightSilent", TRUE, L"colors") && ptr_app->is_silent) + colorValue = L"ColorSilent"; - else if (is_profilelist && app.ConfigGetBoolean (L"IsHighlightSilent", TRUE, L"colors") && ptr_app->is_silent) - color_value = L"ColorSilent"; + else if (!is_profilelist && !is_editorlist && app.ConfigGetBoolean (L"IsHighlightService", TRUE, L"colors") && ptr_app->type == DataAppService) + colorValue = L"ColorService"; - else if (!is_profilelist && !is_editorlist && app.ConfigGetBoolean (L"IsHighlightService", TRUE, L"colors") && ptr_app->type == DataAppService) - color_value = L"ColorService"; + else if (!is_profilelist && !is_editorlist && app.ConfigGetBoolean (L"IsHighlightPackage", TRUE, L"colors") && ptr_app->type == DataAppUWP) + colorValue = L"ColorPackage"; - else if (!is_profilelist && !is_editorlist && app.ConfigGetBoolean (L"IsHighlightPackage", TRUE, L"colors") && ptr_app->type == DataAppUWP) - color_value = L"ColorPackage"; + else if (app.ConfigGetBoolean (L"IsHighlightPico", TRUE, L"colors") && ptr_app->type == DataAppPico) + colorValue = L"ColorPico"; - else if (app.ConfigGetBoolean (L"IsHighlightPico", TRUE, L"colors") && ptr_app->type == DataAppPico) - color_value = L"ColorPico"; + else if (app.ConfigGetBoolean (L"IsHighlightSystem", TRUE, L"colors") && ptr_app->is_system) + colorValue = L"ColorSystem"; - else if (app.ConfigGetBoolean (L"IsHighlightSystem", TRUE, L"colors") && ptr_app->is_system) - color_value = L"ColorSystem"; - } + _r_obj_dereference (ptr_app); - _r_obj2_dereference (ptr_app_object); + if (colorValue) + return _app_getcolorvalue (_r_str_hash (colorValue)); - if (color_value.IsEmpty ()) - return 0; - - return _app_getcolorvalue (_r_str_hash (color_value.GetString ())); + return 0; } VOID _app_freeapplication (SIZE_T app_hash) @@ -386,48 +395,44 @@ VOID _app_freeapplication (SIZE_T app_hash) INT index = INVALID_INT; - for (auto &p : rules_arr) + for (auto it = rules_arr.begin (); it != rules_arr.end (); ++it) { index += 1; - if (!p) + if (!*it) continue; - PR_OBJECT ptr_rule_object = _r_obj2_reference (p); - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; + PITEM_RULE ptr_rule = (PITEM_RULE)_r_obj_reference (*it); - if (ptr_rule) + if (ptr_rule->type == DataRuleCustom) { - if (ptr_rule->type == DataRuleCustom) + if (ptr_rule->apps->find (app_hash) != ptr_rule->apps->end ()) { - if (ptr_rule->apps.find (app_hash) != ptr_rule->apps.end ()) + ptr_rule->apps->erase (app_hash); + + if (ptr_rule->is_enabled && ptr_rule->apps->empty ()) { - ptr_rule->apps.erase (app_hash); + ptr_rule->is_enabled = FALSE; + ptr_rule->is_haveerrors = FALSE; + } - if (ptr_rule->is_enabled && ptr_rule->apps.empty ()) + INT rule_listview_id = _app_getlistview_id (ptr_rule->type); + + if (rule_listview_id) + { + INT item_pos = _app_getposition (app.GetHWND (), rule_listview_id, index); + + if (item_pos != INVALID_INT) { - ptr_rule->is_enabled = FALSE; - ptr_rule->is_haveerrors = FALSE; - } - - INT rule_listview_id = _app_getlistview_id (ptr_rule->type); - - if (rule_listview_id) - { - INT item_pos = _app_getposition (app.GetHWND (), rule_listview_id, index); - - if (item_pos != INVALID_INT) - { - _r_fastlock_acquireshared (&lock_checkbox); - _app_setruleiteminfo (app.GetHWND (), rule_listview_id, item_pos, ptr_rule, FALSE); - _r_fastlock_releaseshared (&lock_checkbox); - } + _r_fastlock_acquireshared (&lock_checkbox); + _app_setruleiteminfo (app.GetHWND (), rule_listview_id, item_pos, ptr_rule, FALSE); + _r_fastlock_releaseshared (&lock_checkbox); } } } } - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); } apps.erase (app_hash); @@ -435,59 +440,54 @@ VOID _app_freeapplication (SIZE_T app_hash) VOID _app_getcount (PITEM_STATUS ptr_status) { - for (auto &p : apps) - { - PR_OBJECT ptr_app_object = _r_obj2_reference (p.second); + PITEM_APP ptr_app; + PITEM_RULE ptr_rule; + SIZE_T app_hash; + BOOLEAN is_used; - if (!ptr_app_object) + for (auto it = apps.begin (); it != apps.end (); ++it) + { + if (!it->second) continue; - SIZE_T app_hash = p.first; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + app_hash = it->first; + ptr_app = (PITEM_APP)_r_obj_reference (it->second); + is_used = _app_isappused (ptr_app, app_hash); - if (ptr_app) - { - BOOLEAN is_used = _app_isappused (ptr_app, app_hash); + if (_app_istimeractive (ptr_app)) + ptr_status->apps_timer_count += 1; - if (_app_istimeractive (ptr_app)) - ptr_status->apps_timer_count += 1; + if (!ptr_app->is_undeletable && (!_app_isappexists (ptr_app) || !is_used) && !(ptr_app->type == DataAppService || ptr_app->type == DataAppUWP)) + ptr_status->apps_unused_count += 1; - if (!ptr_app->is_undeletable && (!_app_isappexists (ptr_app) || !is_used) && !(ptr_app->type == DataAppService || ptr_app->type == DataAppUWP)) - ptr_status->apps_unused_count += 1; + if (is_used) + ptr_status->apps_count += 1; - if (is_used) - ptr_status->apps_count += 1; - } - - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } - for (auto &p : rules_arr) + for (auto it = rules_arr.begin (); it != rules_arr.end (); ++it) { - if (!p) + if (!*it) continue; - PR_OBJECT ptr_rule_object = _r_obj2_reference (p); - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; + ptr_rule = (PITEM_RULE)_r_obj_reference (*it); - if (ptr_rule) + if (ptr_rule->type == DataRuleCustom) { - if (ptr_rule->type == DataRuleCustom) - { - if (ptr_rule->is_enabled && !ptr_rule->apps.empty ()) - ptr_status->rules_global_count += 1; + if (ptr_rule->is_enabled && !ptr_rule->apps->empty ()) + ptr_status->rules_global_count += 1; - if (ptr_rule->is_readonly) - ptr_status->rules_predefined_count += 1; + if (ptr_rule->is_readonly) + ptr_status->rules_predefined_count += 1; - else - ptr_status->rules_user_count += 1; + else + ptr_status->rules_user_count += 1; - ptr_status->rules_count += 1; - } + ptr_status->rules_count += 1; } - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); } } @@ -521,215 +521,229 @@ INT _app_getruleicon (const PITEM_RULE ptr_rule) COLORREF _app_getrulecolor (INT listview_id, SIZE_T rule_idx) { - PR_OBJECT ptr_rule_object = _app_getrulebyid (rule_idx); + PITEM_RULE ptr_rule = _app_getrulebyid (rule_idx); - if (!ptr_rule_object) + if (!ptr_rule) return 0; - rstring color_value; + LPCWSTR colorValue = NULL; - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; + if (app.ConfigGetBoolean (L"IsHighlightInvalid", TRUE, L"colors") && ptr_rule->is_enabled && ptr_rule->is_haveerrors) + colorValue = L"ColorInvalid"; - if (ptr_rule) - { - if (app.ConfigGetBoolean (L"IsHighlightInvalid", TRUE, L"colors") && ptr_rule->is_enabled && ptr_rule->is_haveerrors) - color_value = L"ColorInvalid"; + else if (app.ConfigGetBoolean (L"IsHighlightSpecial", TRUE, L"colors") && !ptr_rule->apps->empty ()) + colorValue = L"ColorSpecial"; - else if (app.ConfigGetBoolean (L"IsHighlightSpecial", TRUE, L"colors") && !ptr_rule->apps.empty ()) - color_value = L"ColorSpecial"; - } + _r_obj_dereference (ptr_rule); - _r_obj2_dereference (ptr_rule_object); + if (colorValue) + return _app_getcolorvalue (_r_str_hash (colorValue)); - if (color_value.IsEmpty ()) - return 0; - - return _app_getcolorvalue (_r_str_hash (color_value.GetString ())); + return 0; } -rstring _app_gettooltip (HWND hwnd, LPNMLVGETINFOTIP lpnmlv) +PR_STRING _app_gettooltip (HWND hwnd, LPNMLVGETINFOTIP lpnmlv) { - rstring result; + PR_STRING string = NULL; INT listview_id = PtrToInt ((PVOID)lpnmlv->hdr.idFrom); BOOLEAN is_appslist = (listview_id >= IDC_APPS_PROFILE && listview_id <= IDC_APPS_UWP); + BOOLEAN is_ruleslist = (listview_id >= IDC_RULES_BLOCKLIST && listview_id <= IDC_RULES_CUSTOM); if (is_appslist || listview_id == IDC_RULE_APPS_ID) { LPARAM lparam = _r_listview_getitemlparam (hwnd, listview_id, lpnmlv->iItem); - PR_OBJECT ptr_app_object = _app_getappitem (lparam); + PITEM_APP ptr_app = _app_getappitem (lparam); + PR_STRING displayName = NULL; - if (ptr_app_object) + if (ptr_app) { - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + string = _r_format_string (L"%s\r\n", _r_obj_getstring (!_r_str_isempty (ptr_app->real_path) ? ptr_app->real_path : (!_r_str_isempty (ptr_app->display_name) ? ptr_app->display_name : ptr_app->original_path))); - if (ptr_app) + // app information { - result.Format (L"%s\r\n", (!_r_str_isempty (ptr_app->real_path) ? ptr_app->real_path : (!_r_str_isempty (ptr_app->display_name) ? ptr_app->display_name : ptr_app->original_path))); + PR_STRING infoString; - // app information + infoString = _r_obj_createstringbuilder (256 * sizeof (WCHAR)); + + if (ptr_app->type == DataAppRegular) { - rstring app_info; + PR_STRING versionString = _app_getversioninfo (lparam, ptr_app); - if (ptr_app->type == DataAppRegular) + if (versionString) { - PR_OBJECT ptr_version_object = _app_getversioninfo (lparam, ptr_app); + if (!_r_str_isempty (versionString)) + _r_string_appendformat (&infoString, SZ_TAB L"%s\r\n", versionString->Buffer); - if (ptr_version_object) - { - if (ptr_version_object->pdata) - app_info.AppendFormat (SZ_TAB L"%s\r\n", (LPCWSTR)ptr_version_object->pdata); - - _r_obj2_dereference (ptr_version_object); - } + _r_obj_dereference (versionString); } - else if (ptr_app->type == DataAppService) + } + else if (ptr_app->type == DataAppService) + { + if (_app_item_get (ptr_app->type, lparam, &displayName, NULL, NULL, NULL)) { - rstring display_name; + _r_string_appendformat (&infoString, SZ_TAB L"%s" SZ_TAB_CRLF L"%s\r\n", _r_obj_getstringorempty (ptr_app->original_path), _r_obj_getstringorempty (displayName)); - if (_app_item_get (ptr_app->type, lparam, &display_name, NULL, NULL, NULL)) - app_info.AppendFormat (SZ_TAB L"%s" SZ_TAB_CRLF L"%s\r\n", ptr_app->original_path, display_name.GetString ()); + if (displayName) + _r_obj_dereference (displayName); } - else if (ptr_app->type == DataAppUWP) + } + else if (ptr_app->type == DataAppUWP) + { + if (_app_item_get (ptr_app->type, lparam, &displayName, NULL, NULL, NULL)) { - rstring display_name; + _r_string_appendformat (&infoString, SZ_TAB L"%s\r\n", _r_obj_getstringorempty (displayName)); - if (_app_item_get (ptr_app->type, lparam, &display_name, NULL, NULL, NULL)) - app_info.AppendFormat (SZ_TAB L"%s\r\n", display_name.GetString ()); - } - - // signature information - if (app.ConfigGetBoolean (L"IsCertificatesEnabled", FALSE) && ptr_app->is_signed) - { - PR_OBJECT ptr_signature_object = _app_getsignatureinfo (lparam, ptr_app); - - if (ptr_signature_object) - { - if (ptr_signature_object->pdata) - app_info.AppendFormat (SZ_TAB L"%s: %s\r\n", app.LocaleString (IDS_SIGNATURE, NULL).GetString (), (LPCWSTR)ptr_signature_object->pdata); - - _r_obj2_dereference (ptr_signature_object); - } - } - - if (!app_info.IsEmpty ()) - { - app_info.InsertFormat (0, L"%s:\r\n", app.LocaleString (IDS_FILE, NULL).GetString ()); - result.Append (app_info); + if (displayName) + _r_obj_dereference (displayName); } } - // app timer - if (_app_istimeractive (ptr_app)) - result.AppendFormat (L"%s:" SZ_TAB_CRLF L"%s\r\n", app.LocaleString (IDS_TIMELEFT, NULL).GetString (), _r_fmt_interval (ptr_app->timer - _r_unixtime_now (), 3).GetString ()); - - // app rules + // signature information + if (app.ConfigGetBoolean (L"IsCertificatesEnabled", FALSE) && ptr_app->is_signed) { - rstring app_rules = _app_appexpandrules (lparam, SZ_TAB_CRLF); + PR_STRING signatureString = _app_getsignatureinfo (lparam, ptr_app); - if (!app_rules.IsEmpty ()) + if (signatureString) { - app_rules.InsertFormat (0, L"%s:" SZ_TAB_CRLF, app.LocaleString (IDS_RULE, NULL).GetString ()); - app_rules.Append (L"\r\n"); + if (!_r_str_isempty (signatureString)) + _r_string_appendformat (&infoString, SZ_TAB L"%s: %s\r\n", app.LocaleString (IDS_SIGNATURE), signatureString->Buffer); - result.Append (app_rules); + _r_obj_dereference (signatureString); } } - // app notes + if (!_r_str_isempty (infoString)) { - rstring app_notes; + _r_string_insertformat (&infoString, 0, L"%s:\r\n", app.LocaleString (IDS_FILE)); + _r_string_append (&string, infoString->Buffer); + } - // app type - if (ptr_app->type == DataAppNetwork) - app_notes.AppendFormat (SZ_TAB L"%s\r\n", app.LocaleString (IDS_HIGHLIGHT_NETWORK, NULL).GetString ()); + _r_obj_dereference (infoString); + } - else if (ptr_app->type == DataAppPico) - app_notes.AppendFormat (SZ_TAB L"%s\r\n", app.LocaleString (IDS_HIGHLIGHT_PICO, NULL).GetString ()); + // app timer + if (_app_istimeractive (ptr_app)) + { + WCHAR intervalString[128]; + _r_format_interval (intervalString, RTL_NUMBER_OF (intervalString), ptr_app->timer - _r_unixtime_now (), 3); - else if (!is_appslist && ptr_app->type == DataAppService) - app_notes.AppendFormat (SZ_TAB L"%s\r\n", app.LocaleString (IDS_HIGHLIGHT_SERVICE, NULL).GetString ()); + _r_string_appendformat (&string, L"%s:" SZ_TAB_CRLF L"%s\r\n", app.LocaleString (IDS_TIMELEFT), intervalString); + } - else if (!is_appslist && ptr_app->type == DataAppUWP) - app_notes.AppendFormat (SZ_TAB L"%s\r\n", app.LocaleString (IDS_HIGHLIGHT_PACKAGE, NULL).GetString ()); + // app rules + { + PR_STRING appRulesString = _app_appexpandrules (lparam, SZ_TAB_CRLF); - // app settings - if (ptr_app->is_system) - app_notes.AppendFormat (SZ_TAB L"%s\r\n", app.LocaleString (IDS_HIGHLIGHT_SYSTEM, NULL).GetString ()); + if (appRulesString) + { + if (!_r_str_isempty (appRulesString)) + _r_string_appendformat (&string, L"%s:" SZ_TAB_CRLF L"%s\r\n", app.LocaleString (IDS_RULE), appRulesString->Buffer); - if (_app_isapphaveconnection (lparam)) - app_notes.AppendFormat (SZ_TAB L"%s\r\n", app.LocaleString (IDS_HIGHLIGHT_CONNECTION, NULL).GetString ()); - - if (is_appslist && ptr_app->is_silent) - app_notes.AppendFormat (SZ_TAB L"%s\r\n", app.LocaleString (IDS_HIGHLIGHT_SILENT, NULL).GetString ()); - - if (!_app_isappexists (ptr_app)) - app_notes.AppendFormat (SZ_TAB L"%s\r\n", app.LocaleString (IDS_HIGHLIGHT_INVALID, NULL).GetString ()); - - if (!app_notes.IsEmpty ()) - { - app_notes.InsertFormat (0, L"%s:\r\n", app.LocaleString (IDS_NOTES, NULL).GetString ()); - result.Append (app_notes); - } + _r_obj_dereference (appRulesString); } } - _r_obj2_dereference (ptr_app_object); + // app notes + { + PR_STRING notesString; + + notesString = _r_obj_createstringbuilder (256 * sizeof (WCHAR)); + + // app type + if (ptr_app->type == DataAppNetwork) + _r_string_appendformat (¬esString, SZ_TAB L"%s\r\n", app.LocaleString (IDS_HIGHLIGHT_NETWORK)); + + else if (ptr_app->type == DataAppPico) + _r_string_appendformat (¬esString, SZ_TAB L"%s\r\n", app.LocaleString (IDS_HIGHLIGHT_PICO)); + + else if (!is_appslist && ptr_app->type == DataAppService) + _r_string_appendformat (¬esString, SZ_TAB L"%s\r\n", app.LocaleString (IDS_HIGHLIGHT_SERVICE)); + + else if (!is_appslist && ptr_app->type == DataAppUWP) + _r_string_appendformat (¬esString, SZ_TAB L"%s\r\n", app.LocaleString (IDS_HIGHLIGHT_PACKAGE)); + + // app settings + if (ptr_app->is_system) + _r_string_appendformat (¬esString, SZ_TAB L"%s\r\n", app.LocaleString (IDS_HIGHLIGHT_SYSTEM)); + + if (_app_isapphaveconnection (lparam)) + _r_string_appendformat (¬esString, SZ_TAB L"%s\r\n", app.LocaleString (IDS_HIGHLIGHT_CONNECTION)); + + if (is_appslist && ptr_app->is_silent) + _r_string_appendformat (¬esString, SZ_TAB L"%s\r\n", app.LocaleString (IDS_HIGHLIGHT_SILENT)); + + if (!_app_isappexists (ptr_app)) + _r_string_appendformat (¬esString, SZ_TAB L"%s\r\n", app.LocaleString (IDS_HIGHLIGHT_INVALID)); + + if (!_r_str_isempty (notesString)) + { + _r_string_insertformat (¬esString, 0, L"%s:\r\n", app.LocaleString (IDS_NOTES)); + _r_string_append2 (&string, notesString); + } + + _r_obj_dereference (notesString); + } + + _r_obj_dereference (ptr_app); } } - else if (listview_id >= IDC_RULES_BLOCKLIST && listview_id <= IDC_RULES_CUSTOM) + else if (is_ruleslist) { LPARAM lparam = _r_listview_getitemlparam (hwnd, listview_id, lpnmlv->iItem); - PR_OBJECT ptr_rule_object = _app_getrulebyid (lparam); + PITEM_RULE ptr_rule = _app_getrulebyid (lparam); - if (ptr_rule_object) + if (ptr_rule) { - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; + LPCWSTR empty; - if (ptr_rule) + PR_STRING ruleRemoteString = NULL; + PR_STRING ruleLocalString = NULL; + + empty = app.LocaleString (IDS_STATUS_EMPTY); + + if (!_r_str_isempty (ptr_rule->rule_remote)) + ruleRemoteString = _r_obj_reference (ptr_rule->rule_remote); + + if (!_r_str_isempty (ptr_rule->rule_local)) + ruleLocalString = _r_obj_reference (ptr_rule->rule_local); + + // rule information + string = _r_format_string (L"%s (#%" TEXT (PR_SIZE_T) L")\r\n%s (" SZ_DIRECTION_REMOTE L"):\r\n%s%s\r\n%s (" SZ_DIRECTION_LOCAL L"):\r\n%s%s", + _r_obj_getstringordefault (ptr_rule->name, empty), + lparam, + app.LocaleString (IDS_RULE), + SZ_TAB, + _r_obj_getstringordefault (ruleRemoteString, empty), + app.LocaleString (IDS_RULE), + SZ_TAB, + _r_obj_getstringordefault (ruleLocalString, empty) + ); + + SAFE_DELETE_REFERENCE (ruleRemoteString); + SAFE_DELETE_REFERENCE (ruleLocalString); + + // rule apps + if (ptr_rule->is_forservices || !ptr_rule->apps->empty ()) { - rstring empty = app.LocaleString (IDS_STATUS_EMPTY, NULL); + PR_STRING ruleAppsString = _app_rulesexpandapps (ptr_rule, TRUE, SZ_TAB_CRLF); - rstring rule_remote = ptr_rule->prule_remote; - rstring rule_local = ptr_rule->prule_local; - - if (!rule_remote.IsEmpty ()) - rule_remote.Replace (DIVIDER_RULE, SZ_TAB_CRLF); - - else - rule_remote = empty; - - if (!rule_local.IsEmpty ()) - rule_local.Replace (DIVIDER_RULE, SZ_TAB_CRLF); - - else - rule_local = empty; - - // rule information - result.Format (L"%s (#%" TEXT (PR_SIZE_T) L")\r\n%s:\r\n%s%s\r\n%s:\r\n%s%s", ptr_rule->pname, lparam, app.LocaleString (IDS_RULE, L" (" SZ_DIRECTION_REMOTE L")").GetString (), SZ_TAB, rule_remote.GetString (), app.LocaleString (IDS_RULE, L" (" SZ_DIRECTION_LOCAL L")").GetString (), SZ_TAB, rule_local.GetString ()); - - // rule apps - if (ptr_rule->is_forservices || !ptr_rule->apps.empty ()) - result.AppendFormat (L"\r\n%s:\r\n%s%s", app.LocaleString (IDS_TAB_APPS, NULL).GetString (), SZ_TAB, _app_rulesexpandapps (ptr_rule, TRUE, SZ_TAB_CRLF).GetString ()); - - // rule notes + if (ruleAppsString) { - rstring buffer; + if (!_r_str_isempty (ruleAppsString)) + _r_string_appendformat (&string, L"\r\n%s:\r\n%s%s", app.LocaleString (IDS_TAB_APPS), SZ_TAB, ruleAppsString->Buffer); - if (ptr_rule->is_readonly && ptr_rule->type == DataRuleCustom) - { - buffer.AppendFormat (SZ_TAB L"%s\r\n", SZ_RULE_INTERNAL_TITLE); - } - - if (!buffer.IsEmpty ()) - { - buffer.InsertFormat (0, L"\r\n%s:\r\n", app.LocaleString (IDS_NOTES, NULL).GetString ()); - result.Append (buffer); - } + _r_obj_dereference (ruleAppsString); } } - _r_obj2_dereference (ptr_rule_object); + // rule notes + if (ptr_rule->is_readonly && ptr_rule->type == DataRuleCustom) + { + _r_string_appendformat (&string, SZ_TAB L"\r\n%s:\r\n" SZ_TAB L"%s\r\n", app.LocaleString (IDS_NOTES), SZ_RULE_INTERNAL_TITLE); + } + + _r_obj_dereference (ptr_rule); } } else if (listview_id == IDC_NETWORK) @@ -739,26 +753,30 @@ rstring _app_gettooltip (HWND hwnd, LPNMLVGETINFOTIP lpnmlv) if (ptr_network) { - LPWSTR local_fmt = NULL; - LPWSTR remote_fmt = NULL; + LPCWSTR empty; - _app_formataddress (ptr_network->af, 0, &ptr_network->local_addr, ptr_network->local_port, &local_fmt, 0); - _app_formataddress (ptr_network->af, 0, &ptr_network->remote_addr, ptr_network->remote_port, &remote_fmt, 0); + PR_STRING localAddressString; + PR_STRING remoteAddressString; - result.Format (L"%s\r\n%s:\r\n" SZ_TAB L"%s\r\n%s:\r\n" SZ_TAB L"%s\r\n%s:\r\n" SZ_TAB L"%s\r\n%s:\r\n" SZ_TAB L"%s", - (!_r_str_isempty (ptr_network->path) ? ptr_network->path : SZ_EMPTY), - app.LocaleString (IDS_ADDRESS, L" (" SZ_DIRECTION_LOCAL L")").GetString (), - !_r_str_isempty (local_fmt) ? local_fmt : SZ_EMPTY, - app.LocaleString (IDS_ADDRESS, L" (" SZ_DIRECTION_REMOTE L")").GetString (), - !_r_str_isempty (remote_fmt) ? remote_fmt : SZ_EMPTY, - app.LocaleString (IDS_PROTOCOL, NULL).GetString (), - _app_getprotoname (ptr_network->protocol, ptr_network->af, NULL).GetString (), - app.LocaleString (IDS_STATE, NULL).GetString (), - _app_getconnectionstatusname (ptr_network->state, SZ_EMPTY).GetString () + empty = app.LocaleString (IDS_STATUS_EMPTY); + + localAddressString = _app_formataddress (ptr_network->af, 0, &ptr_network->local_addr, ptr_network->local_port, 0); + remoteAddressString = _app_formataddress (ptr_network->af, 0, &ptr_network->remote_addr, ptr_network->remote_port, 0); + + string = _r_format_string (L"%s\r\n%s (" SZ_DIRECTION_LOCAL L"):\r\n" SZ_TAB L"%s\r\n%s (" SZ_DIRECTION_REMOTE L"):\r\n" SZ_TAB L"%s\r\n%s:\r\n" SZ_TAB L"%s\r\n%s:\r\n" SZ_TAB L"%s", + _r_obj_getstringordefault (ptr_network->path, empty), + app.LocaleString (IDS_ADDRESS), + _r_obj_getstringordefault (localAddressString, empty), + app.LocaleString (IDS_ADDRESS), + _r_obj_getstringordefault (remoteAddressString, empty), + app.LocaleString (IDS_PROTOCOL), + _app_getprotoname (ptr_network->protocol, ptr_network->af, empty), + app.LocaleString (IDS_STATE), + _app_getconnectionstatusname (ptr_network->state, empty) ); - SAFE_DELETE_MEMORY (local_fmt); - SAFE_DELETE_MEMORY (remote_fmt); + SAFE_DELETE_REFERENCE (localAddressString); + SAFE_DELETE_REFERENCE (remoteAddressString); _r_obj_dereference (ptr_network); } @@ -771,42 +789,60 @@ rstring _app_gettooltip (HWND hwnd, LPNMLVGETINFOTIP lpnmlv) if (ptr_log) { - LPWSTR local_fmt = NULL; - LPWSTR remote_fmt = NULL; + WCHAR dateString[256]; - _app_formataddress (ptr_log->af, 0, &ptr_log->local_addr, ptr_log->local_port, &local_fmt, 0); - _app_formataddress (ptr_log->af, 0, &ptr_log->remote_addr, ptr_log->remote_port, &remote_fmt, 0); + LPCWSTR empty; - result.Format (L"%s\r\n%s:\r\n" SZ_TAB L"%s\r\n%s:\r\n" SZ_TAB L"%s\r\n%s:\r\n" SZ_TAB L"%s\r\n%s:\r\n" SZ_TAB L"%s\r\n%s:\r\n" SZ_TAB L"%s\r\n%s:\r\n" SZ_TAB L"%s\r\n%s:\r\n" SZ_TAB L"%s", - (!_r_str_isempty (ptr_log->path) ? ptr_log->path : SZ_EMPTY), - app.LocaleString (IDS_DATE, NULL).GetString (), - _r_fmt_dateex (ptr_log->timestamp, FDTF_LONGDATE | FDTF_LONGTIME).GetString (), - app.LocaleString (IDS_ADDRESS, L" (" SZ_DIRECTION_LOCAL L")").GetString (), - !_r_str_isempty (local_fmt) ? local_fmt : SZ_EMPTY, - app.LocaleString (IDS_ADDRESS, L" (" SZ_DIRECTION_REMOTE L")").GetString (), - !_r_str_isempty (remote_fmt) ? remote_fmt : SZ_EMPTY, - app.LocaleString (IDS_PROTOCOL, NULL).GetString (), - _app_getprotoname (ptr_log->protocol, ptr_log->af, NULL).GetString (), - app.LocaleString (IDS_FILTER, NULL).GetString (), - _app_getfiltername (NULL, ptr_log->filter_name, SZ_EMPTY).GetString (), - app.LocaleString (IDS_DIRECTION, NULL).GetString (), - _app_getdirectionname (ptr_log->direction, ptr_log->is_loopback, TRUE).GetString (), - app.LocaleString (IDS_STATE, NULL).GetString (), - (ptr_log->is_allow ? SZ_STATE_ALLOW : SZ_STATE_BLOCK) + PR_STRING localAddressString; + PR_STRING remoteAddressString; + PR_STRING directionString; + + _r_format_dateex (dateString, RTL_NUMBER_OF (dateString), ptr_log->timestamp, FDTF_LONGDATE | FDTF_LONGTIME); + + empty = app.LocaleString (IDS_STATUS_EMPTY); + + localAddressString = _app_formataddress (ptr_log->af, 0, &ptr_log->local_addr, ptr_log->local_port, 0); + remoteAddressString = _app_formataddress (ptr_log->af, 0, &ptr_log->remote_addr, ptr_log->remote_port, 0); + directionString = _app_getdirectionname (ptr_log->direction, ptr_log->is_loopback, TRUE); + + string = _r_format_string (L"%s\r\n%s:\r\n" SZ_TAB L"%s\r\n%s (" SZ_DIRECTION_LOCAL L"):\r\n" SZ_TAB L"%s\r\n%s (" SZ_DIRECTION_REMOTE L"):\r\n" SZ_TAB L"%s\r\n%s:\r\n" SZ_TAB L"%s\r\n%s:\r\n" SZ_TAB L"%s\r\n%s:\r\n" SZ_TAB L"%s\r\n%s:\r\n" SZ_TAB L"%s", + _r_obj_getstringordefault (ptr_log->path, empty), + app.LocaleString (IDS_DATE), + dateString, + app.LocaleString (IDS_ADDRESS), + _r_obj_getstringordefault (localAddressString, empty), + app.LocaleString (IDS_ADDRESS), + _r_obj_getstringordefault (remoteAddressString, empty), + app.LocaleString (IDS_PROTOCOL), + _app_getprotoname (ptr_log->protocol, ptr_log->af, empty), + app.LocaleString (IDS_FILTER), + _r_obj_getstringordefault (ptr_log->filter_name, empty), + app.LocaleString (IDS_DIRECTION), + _r_obj_getstringorempty (directionString), + app.LocaleString (IDS_STATE), + (ptr_log->is_allow ? SZ_STATE_ALLOW : SZ_STATE_BLOCK) ); - SAFE_DELETE_MEMORY (local_fmt); - SAFE_DELETE_MEMORY (remote_fmt); + SAFE_DELETE_REFERENCE (localAddressString); + SAFE_DELETE_REFERENCE (remoteAddressString); + SAFE_DELETE_REFERENCE (directionString); _r_obj_dereference (ptr_log); } } else if (listview_id == IDC_RULE_REMOTE_ID || listview_id == IDC_RULE_LOCAL_ID) { - result = _r_listview_getitemtext (hwnd, listview_id, lpnmlv->iItem, 0); + PR_STRING itemText = _r_listview_getitemtext (hwnd, listview_id, lpnmlv->iItem, 0); + + if (itemText) + { + string = _r_obj_reference (itemText); + + _r_obj_dereference (itemText); + } } - return result; + return string; } VOID _app_setappiteminfo (HWND hwnd, INT listview_id, INT item, SIZE_T app_hash, PITEM_APP ptr_app) @@ -816,8 +852,12 @@ VOID _app_setappiteminfo (HWND hwnd, INT listview_id, INT item, SIZE_T app_hash, _app_getappicon (ptr_app, TRUE, &ptr_app->icon_id, NULL); - _r_listview_setitem (hwnd, listview_id, item, 0, ptr_app->display_name, ptr_app->icon_id, _app_getappgroup (app_hash, ptr_app)); - _r_listview_setitem (hwnd, listview_id, item, 1, _r_fmt_dateex (ptr_app->timestamp, FDTF_SHORTDATE | FDTF_SHORTTIME).GetString ()); + _r_listview_setitem (hwnd, listview_id, item, 0, _r_obj_getstringordefault (ptr_app->display_name, SZ_EMPTY), ptr_app->icon_id, _app_getappgroup (app_hash, ptr_app)); + + WCHAR dateString[256]; + _r_format_dateex (dateString, RTL_NUMBER_OF (dateString), ptr_app->timestamp, FDTF_SHORTDATE | FDTF_SHORTTIME); + + _r_listview_setitem (hwnd, listview_id, item, 1, dateString); _r_listview_setitemcheck (hwnd, listview_id, item, ptr_app->is_enabled); } @@ -827,38 +867,66 @@ VOID _app_setruleiteminfo (HWND hwnd, INT listview_id, INT item, PITEM_RULE ptr_ if (!listview_id || item == INVALID_INT) return; - _r_listview_setitem (hwnd, listview_id, item, 0, ptr_rule->is_readonly && ptr_rule->type == DataRuleCustom ? _r_fmt (L"%s" SZ_RULE_INTERNAL_MENU, ptr_rule->pname).GetString () : ptr_rule->pname, _app_getruleicon (ptr_rule), _app_getrulegroup (ptr_rule)); - _r_listview_setitem (hwnd, listview_id, item, 1, ptr_rule->protocol ? _app_getprotoname (ptr_rule->protocol, AF_UNSPEC, NULL).GetString () : app.LocaleString (IDS_ANY, NULL).GetString ()); - _r_listview_setitem (hwnd, listview_id, item, 2, _app_getdirectionname (ptr_rule->direction, FALSE, TRUE).GetString ()); + INT ruleIconId; + INT ruleGroupId; + + ruleIconId = _app_getruleicon (ptr_rule); + ruleGroupId = _app_getrulegroup (ptr_rule); + + LPCWSTR ruleNamePtr = NULL; + WCHAR ruleName[RULE_NAME_CCH_MAX]; + PR_STRING directionString; + + if (!_r_str_isempty (ptr_rule->name)) + { + if (ptr_rule->is_readonly && ptr_rule->type == DataRuleCustom) + { + _r_str_printf (ruleName, RTL_NUMBER_OF (ruleName), L"%s" SZ_RULE_INTERNAL_MENU, ptr_rule->name->Buffer); + ruleNamePtr = ruleName; + } + else + { + ruleNamePtr = ptr_rule->name->Buffer; + } + } + + directionString = _app_getdirectionname (ptr_rule->direction, FALSE, TRUE); + + _r_listview_setitem (hwnd, listview_id, item, 0, ruleNamePtr, ruleIconId, ruleGroupId); + _r_listview_setitem (hwnd, listview_id, item, 1, ptr_rule->protocol ? _app_getprotoname (ptr_rule->protocol, AF_UNSPEC, NULL) : app.LocaleString (IDS_ANY)); + _r_listview_setitem (hwnd, listview_id, item, 2, _r_obj_getstringorempty (directionString)); _r_listview_setitemcheck (hwnd, listview_id, item, ptr_rule->is_enabled); + if (directionString) + _r_obj_dereference (directionString); + if (include_apps) { - for (auto &p : ptr_rule->apps) - { - SIZE_T app_hash = p.first; - PR_OBJECT ptr_app_object = _app_getappitem (app_hash); + SIZE_T app_hash; + PITEM_APP ptr_app; + INT app_listview_id; + INT item_pos; - if (!ptr_app_object) + for (auto it = ptr_rule->apps->begin (); it != ptr_rule->apps->end (); ++it) + { + app_hash = it->first; + ptr_app = _app_getappitem (app_hash); + + if (!ptr_app) continue; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + app_listview_id = _app_getlistview_id (ptr_app->type); - if (ptr_app) + if (app_listview_id) { - INT app_listview_id = _app_getlistview_id (ptr_app->type); + item_pos = _app_getposition (app.GetHWND (), app_listview_id, app_hash); - if (app_listview_id) - { - INT item_pos = _app_getposition (app.GetHWND (), app_listview_id, app_hash); - - if (item_pos != INVALID_INT) - _app_setappiteminfo (hwnd, app_listview_id, item_pos, app_hash, ptr_app); - } + if (item_pos != INVALID_INT) + _app_setappiteminfo (hwnd, app_listview_id, item_pos, app_hash, ptr_app); } - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } } } @@ -867,39 +935,41 @@ VOID _app_ruleenable (PITEM_RULE ptr_rule, BOOLEAN is_enable) { ptr_rule->is_enabled = is_enable; - if (ptr_rule->is_readonly && !_r_str_isempty (ptr_rule->pname)) + if (ptr_rule->is_readonly && !_r_str_isempty (ptr_rule->name)) { - SIZE_T rule_hash = _r_str_hash (ptr_rule->pname); + PVOID pdata; + PITEM_RULE_CONFIG ptr_config; + SIZE_T rule_hash = _r_str_hash (ptr_rule->name); if (rule_hash) { if (rules_config.find (rule_hash) != rules_config.end ()) { - PITEM_RULE_CONFIG ptr_config; - PVOID ptr = rules_config[rule_hash]; + pdata = rules_config[rule_hash]; - if (ptr && (ptr_config = (PITEM_RULE_CONFIG)_r_obj_reference (ptr))) + if (pdata) { + ptr_config = (PITEM_RULE_CONFIG)_r_obj_reference (pdata); ptr_config->is_enabled = is_enable; _r_obj_dereference (ptr_config); } else { - PITEM_RULE_CONFIG ptr_config = (PITEM_RULE_CONFIG)_r_obj_allocateex (sizeof (ITEM_RULE_CONFIG), &_app_dereferenceruleconfig); + ptr_config = (PITEM_RULE_CONFIG)_r_obj_allocateex (sizeof (ITEM_RULE_CONFIG), &_app_dereferenceruleconfig); ptr_config->is_enabled = is_enable; - _r_str_alloc (&ptr_config->pname, _r_str_length (ptr_rule->pname), ptr_rule->pname); + ptr_config->name = _r_obj_createstring2 (ptr_rule->name); rules_config[rule_hash] = ptr_config; } } else { - PITEM_RULE_CONFIG ptr_config = (PITEM_RULE_CONFIG)_r_obj_allocateex (sizeof (ITEM_RULE_CONFIG), &_app_dereferenceruleconfig); + ptr_config = (PITEM_RULE_CONFIG)_r_obj_allocateex (sizeof (ITEM_RULE_CONFIG), &_app_dereferenceruleconfig); ptr_config->is_enabled = is_enable; - _r_str_alloc (&ptr_config->pname, _r_str_length (ptr_rule->pname), ptr_rule->pname); + ptr_config->name = _r_obj_createstring2 (ptr_rule->name); rules_config[rule_hash] = ptr_config; } @@ -911,9 +981,9 @@ VOID _app_ruleenable2 (PITEM_RULE ptr_rule, BOOLEAN is_enable) { ptr_rule->is_enabled = is_enable; - if (ptr_rule->is_readonly && !_r_str_isempty (ptr_rule->pname)) + if (ptr_rule->is_readonly && !_r_str_isempty (ptr_rule->name)) { - SIZE_T rule_hash = _r_str_hash (ptr_rule->pname); + SIZE_T rule_hash = _r_str_hash (ptr_rule->name); if (rule_hash) { @@ -957,16 +1027,21 @@ BOOLEAN _app_ruleblocklistsetchange (PITEM_RULE ptr_rule, INT new_state) BOOLEAN _app_ruleblocklistsetstate (PITEM_RULE ptr_rule, INT spy_state, INT update_state, INT extra_state) { - if (ptr_rule->type != DataRuleBlocklist) + if (ptr_rule->type != DataRuleBlocklist || _r_str_isempty (ptr_rule->name)) return FALSE; - if (_r_str_compare_length (ptr_rule->pname, L"spy_", 4) == 0) + LPCWSTR ruleName = ptr_rule->name->Buffer; + + if (!ruleName) + return FALSE; + + if (_r_str_compare_length (ruleName, L"spy_", 4) == 0) return _app_ruleblocklistsetchange (ptr_rule, spy_state); - else if (_r_str_compare_length (ptr_rule->pname, L"update_", 7) == 0) + else if (_r_str_compare_length (ruleName, L"update_", 7) == 0) return _app_ruleblocklistsetchange (ptr_rule, update_state); - else if (_r_str_compare_length (ptr_rule->pname, L"extra_", 6) == 0) + else if (_r_str_compare_length (ruleName, L"extra_", 6) == 0) return _app_ruleblocklistsetchange (ptr_rule, extra_state); // fallback: block rules with other names by default! @@ -975,32 +1050,31 @@ BOOLEAN _app_ruleblocklistsetstate (PITEM_RULE ptr_rule, INT spy_state, INT upda VOID _app_ruleblocklistset (HWND hwnd, INT spy_state, INT update_state, INT extra_state, BOOLEAN is_instantapply) { - OBJECTS_VEC rules; + OBJECTS_RULE_VECTOR rules; INT listview_id = _app_getlistview_id (DataRuleBlocklist); SIZE_T changes_count = 0; INT index = INVALID_INT; // negative initial value is required for correct array indexing - for (auto &p : rules_arr) + for (auto it = rules_arr.begin (); it != rules_arr.end (); ++it) { index += 1; - if (!p) + if (!*it) continue; - PR_OBJECT ptr_rule_object = _r_obj2_reference (p); - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; + PITEM_RULE ptr_rule = (PITEM_RULE)_r_obj_reference (*it); - if (!ptr_rule || ptr_rule->type != DataRuleBlocklist) + if (ptr_rule->type != DataRuleBlocklist) { - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); continue; } if (!_app_ruleblocklistsetstate (ptr_rule, spy_state, update_state, extra_state)) { - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); continue; } @@ -1021,11 +1095,11 @@ VOID _app_ruleblocklistset (HWND hwnd, INT spy_state, INT update_state, INT extr if (is_instantapply) { - rules.push_back (ptr_rule_object); // be freed later! + rules.emplace_back (ptr_rule); // be freed later! continue; } - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); } if (changes_count) @@ -1043,114 +1117,116 @@ VOID _app_ruleblocklistset (HWND hwnd, INT spy_state, INT update_state, INT extr HANDLE hengine = _wfp_getenginehandle (); if (hengine) - _wfp_create4filters (hengine, rules, __LINE__); + _wfp_create4filters (hengine, &rules, __LINE__); - _app_freeobjects_vec (rules); + _app_freerules_vec (&rules); } _app_profile_save (NULL); // required! } } -rstring _app_appexpandrules (SIZE_T app_hash, LPCWSTR delimeter) +PR_STRING _app_appexpandrules (SIZE_T app_hash, LPCWSTR delimeter) { - rstring result; + PR_STRING string; - for (auto &p : rules_arr) + string = _r_obj_createstringbuilder (256 * sizeof (WCHAR)); + + for (auto it = rules_arr.begin (); it != rules_arr.end (); ++it) { - if (!p) + if (!*it) continue; - PR_OBJECT ptr_rule_object = _r_obj2_reference (p); - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; + PITEM_RULE ptr_rule = (PITEM_RULE)_r_obj_reference (*it); - if (ptr_rule) + if (ptr_rule->is_enabled && ptr_rule->type == DataRuleCustom && ptr_rule->apps->find (app_hash) != ptr_rule->apps->end ()) { - if (ptr_rule->is_enabled && ptr_rule->type == DataRuleCustom && ptr_rule->apps.find (app_hash) != ptr_rule->apps.end ()) + if (!_r_str_isempty (ptr_rule->name)) { - if (!_r_str_isempty (ptr_rule->pname)) - { - result.Append (ptr_rule->pname); + _r_string_append2 (&string, ptr_rule->name); - if (ptr_rule->is_readonly) - result.Append (SZ_RULE_INTERNAL_MENU); + if (ptr_rule->is_readonly) + _r_string_append (&string, SZ_RULE_INTERNAL_MENU); - result.Append (delimeter); - } + _r_string_append (&string, delimeter); } } - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); } - if (!result.IsEmpty ()) - _r_str_trim (result, delimeter); + _r_str_trim (string, delimeter); - return result; + if (_r_str_isempty (string)) + { + _r_obj_dereference (string); + return NULL; + } + + return string; } -rstring _app_rulesexpandapps (const PITEM_RULE ptr_rule, BOOLEAN is_fordisplay, LPCWSTR delimeter) +PR_STRING _app_rulesexpandapps (const PITEM_RULE ptr_rule, BOOLEAN is_fordisplay, LPCWSTR delimeter) { - rstring result; + PR_STRING string; + + string = _r_obj_createstringbuilder (256 * sizeof (WCHAR)); if (is_fordisplay && ptr_rule->is_forservices) { - static rstring svchost_path = _r_path_expand (PATH_SVCHOST); - - result.AppendFormat (L"%s%s", PROC_SYSTEM_NAME, delimeter); - result.AppendFormat (L"%s%s", svchost_path.GetString (), delimeter); + _r_string_appendformat (&string, L"%s%s%s%s", PROC_SYSTEM_NAME, delimeter, _r_obj_getstring (config.svchost_path), delimeter); } - for (auto &p : ptr_rule->apps) + for (auto it = ptr_rule->apps->begin (); it != ptr_rule->apps->end (); ++it) { - PR_OBJECT ptr_app_object = _app_getappitem (p.first); + PITEM_APP ptr_app = _app_getappitem (it->first); - if (!ptr_app_object) + if (!ptr_app) continue; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; - - if (ptr_app) + if (is_fordisplay) { - if (is_fordisplay) + if (ptr_app->type == DataAppUWP || ptr_app->type == DataAppService) { - if (ptr_app->type == DataAppUWP || ptr_app->type == DataAppService) - { - if (!_r_str_isempty (ptr_app->display_name)) - result.Append (ptr_app->display_name); - } - else - { - if (!_r_str_isempty (ptr_app->original_path)) - result.Append (ptr_app->original_path); - } + if (!_r_str_isempty (ptr_app->display_name)) + _r_string_append2 (&string, ptr_app->display_name); } else { if (!_r_str_isempty (ptr_app->original_path)) - result.Append (ptr_app->original_path); + _r_string_append2 (&string, ptr_app->original_path); } - - result.Append (delimeter); + } + else + { + if (!_r_str_isempty (ptr_app->original_path)) + _r_string_append2 (&string, ptr_app->original_path); } - _r_obj2_dereference (ptr_app_object); + _r_string_append (&string, delimeter); + + _r_obj_dereference (ptr_app); } - if (!result.IsEmpty ()) - _r_str_trim (result, delimeter); + _r_str_trim (string, delimeter); - return result; + if (_r_str_isempty (string)) + { + _r_obj_dereference (string); + return NULL; + } + + return string; } BOOLEAN _app_isappfound (SIZE_T app_hash) { - return apps.find (app_hash) != apps.end (); + return app_hash && apps.find (app_hash) != apps.end (); } BOOLEAN _app_isapphelperfound (SIZE_T app_hash) { - return apps_helper.find (app_hash) != apps_helper.end (); + return app_hash && apps_helper.find (app_hash) != apps_helper.end (); } BOOLEAN _app_isapphaveconnection (SIZE_T app_hash) @@ -1158,13 +1234,13 @@ BOOLEAN _app_isapphaveconnection (SIZE_T app_hash) if (!app_hash) return FALSE; - for (auto &p : network_map) + for (auto it = network_map.begin (); it != network_map.end (); ++it) { - PITEM_NETWORK ptr_network = (PITEM_NETWORK)_r_obj_reference (p.second); - - if (!ptr_network) + if (!it->second) continue; + PITEM_NETWORK ptr_network = (PITEM_NETWORK)_r_obj_reference (it->second); + if (ptr_network->app_hash == app_hash) { if (ptr_network->is_connection) @@ -1182,33 +1258,29 @@ BOOLEAN _app_isapphaveconnection (SIZE_T app_hash) BOOLEAN _app_isapphavedrive (INT letter) { - for (auto &p : apps) + for (auto it = apps.begin (); it != apps.end (); ++it) { - PR_OBJECT ptr_app_object = _r_obj2_reference (p.second); - - if (!ptr_app_object) + if (!it->second) continue; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + SIZE_T app_hash = it->first; + PITEM_APP ptr_app = (PITEM_APP)_r_obj_reference (it->second); - if (!ptr_app) + if (!_r_str_isempty (ptr_app->original_path)) { - _r_obj2_dereference (ptr_app_object); - continue; - } + INT drive_id = PathGetDriveNumber (ptr_app->original_path->Buffer); - INT drive_id = PathGetDriveNumber (ptr_app->original_path); - - if ((drive_id != INVALID_INT && drive_id == letter) || ptr_app->type == DataAppDevice) - { - if (ptr_app->is_enabled || _app_isapphaverule (p.first)) + if ((drive_id != INVALID_INT && drive_id == letter) || ptr_app->type == DataAppDevice) { - _r_obj2_dereference (ptr_app_object); - return TRUE; + if (ptr_app->is_enabled || _app_isapphaverule (app_hash)) + { + _r_obj_dereference (ptr_app); + return TRUE; + } } } - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } return FALSE; @@ -1219,21 +1291,20 @@ BOOLEAN _app_isapphaverule (SIZE_T app_hash) if (!app_hash) return FALSE; - for (auto &p : rules_arr) + for (auto it = rules_arr.begin (); it != rules_arr.end (); ++it) { - if (!p) + if (!*it) continue; - PR_OBJECT ptr_rule_object = _r_obj2_reference (p); - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; + PITEM_RULE ptr_rule = (PITEM_RULE)_r_obj_reference (*it); - if (ptr_rule && ptr_rule->is_enabled && ptr_rule->type == DataRuleCustom && ptr_rule->apps.find (app_hash) != ptr_rule->apps.end ()) + if (ptr_rule->is_enabled && ptr_rule->type == DataRuleCustom && ptr_rule->apps->find (app_hash) != ptr_rule->apps->end ()) { - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); return TRUE; } - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); } return FALSE; @@ -1259,7 +1330,7 @@ BOOLEAN _app_isappexists (const PITEM_APP ptr_app) return TRUE; else if (ptr_app->type == DataAppRegular) - return !_r_str_isempty (ptr_app->real_path) && _r_fs_exists (ptr_app->real_path); + return !_r_str_isempty (ptr_app->real_path) && _r_fs_exists (ptr_app->real_path->Buffer); else if (ptr_app->type == DataAppService || ptr_app->type == DataAppUWP) return _app_item_get (ptr_app->type, _r_str_hash (ptr_app->original_path), NULL, NULL, NULL, NULL); @@ -1269,30 +1340,28 @@ BOOLEAN _app_isappexists (const PITEM_APP ptr_app) BOOLEAN _app_isrulehost (LPCWSTR rule) { - PNET_ADDRESS_INFO pni = (PNET_ADDRESS_INFO)_r_mem_allocatezero (sizeof (NET_ADDRESS_INFO)); + NET_ADDRESS_INFO addressInfo; + memset (&addressInfo, 0, sizeof (NET_ADDRESS_INFO)); USHORT port; BYTE prefix_length; DWORD types = NET_STRING_NAMED_ADDRESS | NET_STRING_NAMED_SERVICE; - DWORD code = ParseNetworkString (rule, types, pni, &port, &prefix_length); - - _r_mem_free (pni); + DWORD code = ParseNetworkString (rule, types, &addressInfo, &port, &prefix_length); return (code == ERROR_SUCCESS); } BOOLEAN _app_isruleip (LPCWSTR rule) { - PNET_ADDRESS_INFO pni = (PNET_ADDRESS_INFO)_r_mem_allocatezero (sizeof (NET_ADDRESS_INFO)); + NET_ADDRESS_INFO addressInfo; + memset (&addressInfo, 0, sizeof (NET_ADDRESS_INFO)); USHORT port; BYTE prefix_length; DWORD types = NET_STRING_IP_ADDRESS | NET_STRING_IP_SERVICE | NET_STRING_IP_NETWORK | NET_STRING_IP_ADDRESS_NO_SCOPE | NET_STRING_IP_SERVICE_NO_SCOPE; - DWORD code = ParseNetworkString (rule, types, pni, &port, &prefix_length); - - _r_mem_free (pni); + DWORD code = ParseNetworkString (rule, types, &addressInfo, &port, &prefix_length); return (code == ERROR_SUCCESS); } @@ -1326,7 +1395,7 @@ BOOLEAN _app_isrulevalidchars (LPCWSTR rule) { BOOLEAN is_valid = FALSE; - for (auto &chr : valid_chars) + for (auto chr : valid_chars) { if (rule[i] == chr) { @@ -1376,7 +1445,7 @@ BOOLEAN _app_profile_load_check (LPCWSTR path, ENUM_TYPE_XML type, BOOLEAN is_st VOID _app_profile_load_fallback () { if (!_app_isappfound (config.my_hash)) - _app_addapplication (NULL, app.GetBinaryPath (), 0, 0, 0, FALSE, TRUE); + _app_addapplication (NULL, app.GetAppBinaryPath (), 0, 0, 0, FALSE, TRUE); _app_setappinfo (config.my_hash, InfoIsUndeletable, TRUE); @@ -1387,7 +1456,7 @@ VOID _app_profile_load_fallback () _app_addapplication (NULL, PROC_SYSTEM_NAME, 0, 0, 0, FALSE, FALSE); if (!_app_isappfound (config.svchost_hash)) - _app_addapplication (NULL, _r_path_expand (PATH_SVCHOST).GetString (), 0, 0, 0, FALSE, FALSE); + _app_addapplication (NULL, _r_obj_getstring (config.svchost_path), 0, 0, 0, FALSE, FALSE); _app_setappinfo (config.ntoskrnl_hash, InfoIsUndeletable, TRUE); _app_setappinfo (config.svchost_hash, InfoIsUndeletable, TRUE); @@ -1408,25 +1477,44 @@ VOID _app_profile_load_helper (pugi::xml_node& root, ENUM_TYPE_DATA type, UINT v } else if (type == DataRuleBlocklist || type == DataRuleSystem || type == DataRuleCustom) { - PITEM_RULE ptr_rule = new ITEM_RULE; - - SIZE_T rule_hash = _r_str_hash (item.attribute (L"name").as_string ()); - + PITEM_RULE ptr_rule; PITEM_RULE_CONFIG ptr_config = NULL; + SIZE_T rule_hash; + BOOLEAN is_internal; - // allocate required memory + 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; + + // set rule name + if (!item.attribute (L"name").empty ()) { - rstring attr_name = item.attribute (L"name").as_string (); - rstring attr_rule_remote = item.attribute (L"rule").as_string (); - rstring attr_rule_local = item.attribute (L"rule_local").as_string (); + ptr_rule->name = _r_obj_createstring (item.attribute (L"name").as_string ()); - SIZE_T name_length = min (attr_name.GetLength (), RULE_NAME_CCH_MAX); - SIZE_T rule_remote_length = min (attr_rule_remote.GetLength (), RULE_RULE_CCH_MAX); - SIZE_T rule_local_length = min (attr_rule_local.GetLength (), RULE_RULE_CCH_MAX); + if (_r_obj_getstringlength (ptr_rule->name) > RULE_NAME_CCH_MAX) + _r_string_setsize (ptr_rule->name, RULE_NAME_CCH_MAX * sizeof (WCHAR)); - _r_str_alloc (&ptr_rule->pname, name_length, attr_name.GetString ()); - _r_str_alloc (&ptr_rule->prule_remote, rule_remote_length, attr_rule_remote.GetString ()); - _r_str_alloc (&ptr_rule->prule_local, rule_local_length, attr_rule_local.GetString ()); + rule_hash = _r_str_hash (ptr_rule->name); + } + + // set rule destination + if (!item.attribute (L"rule").empty ()) + { + ptr_rule->rule_remote = _r_obj_createstring (item.attribute (L"rule").as_string ()); + + if (_r_obj_getstringlength (ptr_rule->rule_remote) > RULE_RULE_CCH_MAX) + _r_string_setsize (ptr_rule->rule_remote, RULE_RULE_CCH_MAX * sizeof (WCHAR)); + } + + // set rule source + if (!item.attribute (L"rule_local").empty ()) + { + ptr_rule->rule_local = _r_obj_createstring (item.attribute (L"rule_local").as_string ()); + + if (_r_obj_getstringlength (ptr_rule->rule_local) > RULE_RULE_CCH_MAX) + _r_string_setsize (ptr_rule->rule_local, RULE_RULE_CCH_MAX * sizeof (WCHAR)); } ptr_rule->direction = (FWP_DIRECTION)item.attribute (L"dir").as_int (); @@ -1451,12 +1539,16 @@ VOID _app_profile_load_helper (pugi::xml_node& root, ENUM_TYPE_DATA type, UINT v ptr_rule->is_enabled = item.attribute (L"is_enabled").as_bool (); if (type == DataRuleBlocklist) + { _app_ruleblocklistsetstate (ptr_rule, blocklist_spy_state, blocklist_update_state, blocklist_extra_state); + } else + { ptr_rule->is_enabled_default = ptr_rule->is_enabled; // set default value for rule + } // load rules config - BOOLEAN is_internal = (type == DataRuleBlocklist || type == DataRuleSystem); + is_internal = (type == DataRuleBlocklist || type == DataRuleSystem); if (is_internal) { @@ -1472,62 +1564,91 @@ VOID _app_profile_load_helper (pugi::xml_node& root, ENUM_TYPE_DATA type, UINT v // load apps { - rstring apps_rule = item.attribute (L"apps").as_string (); + PR_STRING ruleApps; - if (is_internal && ptr_config && !_r_str_isempty (ptr_config->papps)) + ruleApps = _r_obj_createstringbuilder (256 * sizeof (WCHAR)); + + if (!item.attribute (L"apps").empty ()) + _r_string_append (&ruleApps, item.attribute (L"apps").as_string ()); + + if (is_internal && ptr_config && !_r_str_isempty (ptr_config->apps)) { - if (apps_rule.IsEmpty ()) - apps_rule = ptr_config->papps; - + if (!_r_str_isempty (ruleApps)) + { + _r_string_appendformat (&ruleApps, L"%s%s", DIVIDER_APP, ptr_config->apps->Buffer); + } else - apps_rule.AppendFormat (L"%s%s", DIVIDER_APP, ptr_config->papps); + { + _r_string_append2 (&ruleApps, ptr_config->apps); + } } if (ptr_config) _r_obj_dereference (ptr_config); - if (!apps_rule.IsEmpty ()) + if (!_r_str_isempty (ruleApps)) { if (version < XML_PROFILE_VER_3) - _r_str_replace (apps_rule.GetBuffer (), DIVIDER_RULE[0], DIVIDER_APP[0]); // for compat with old profiles + _r_str_replacechar (ruleApps->Buffer, DIVIDER_RULE[0], DIVIDER_APP[0]); // for compat with old profiles - rstringvec rvc; - _r_str_split (apps_rule.GetString (), apps_rule.GetLength (), DIVIDER_APP[0], rvc); + R_STRINGREF remainingPart; + PR_STRING appPath; + PR_STRING expandedPath; + SIZE_T app_hash; - for (auto& p : rvc) + _r_stringref_initializeex (&remainingPart, ruleApps->Buffer, ruleApps->Length); + + while (remainingPart.Length != 0) { - _r_str_trim (p, DIVIDER_TRIM); + appPath = _r_str_splitatchar (&remainingPart, &remainingPart, DIVIDER_APP[0], TRUE); - rstring app_path = _r_path_expand (p.GetString ()); - SIZE_T app_hash = _r_str_hash (app_path.GetString ()); - - if (app_hash) + if (appPath) { - if (item.attribute (L"is_services").as_bool () && (app_hash == config.ntoskrnl_hash || app_hash == config.svchost_hash)) - continue; + expandedPath = _r_str_expandenvironmentstring (appPath); - if (!_app_isappfound (app_hash)) - app_hash = _app_addapplication (NULL, app_path.GetString (), 0, 0, 0, FALSE, FALSE); + if (expandedPath) + _r_obj_movereference (&appPath, expandedPath); - if (ptr_rule->type == DataRuleSystem) - _app_setappinfo (app_hash, InfoIsUndeletable, TRUE); + if (appPath) + { + app_hash = _r_str_hash (appPath); - ptr_rule->apps[app_hash] = TRUE; + if (app_hash) + { + if (item.attribute (L"is_services").as_bool () && (app_hash == config.ntoskrnl_hash || app_hash == config.svchost_hash)) + { + _r_obj_dereference (appPath); + continue; + } + + if (!_app_isappfound (app_hash)) + app_hash = _app_addapplication (NULL, _r_obj_getstring (appPath), 0, 0, 0, FALSE, FALSE); + + if (ptr_rule->type == DataRuleSystem) + _app_setappinfo (app_hash, InfoIsUndeletable, TRUE); + + ptr_rule->apps->emplace (app_hash, TRUE); + } + + _r_obj_dereference (appPath); + } } } } + + _r_obj_dereference (ruleApps); } - rules_arr.push_back (_r_obj2_allocateex (ptr_rule, &_app_dereferencerule)); + rules_arr.emplace_back (ptr_rule); } else if (type == DataRulesConfig) { - rstring rule_name = item.attribute (L"name").as_string (); + LPCWSTR rule_name = item.attribute (L"name").as_string (); - if (rule_name.IsEmpty ()) + if (_r_str_isempty (rule_name)) continue; - SIZE_T rule_hash = _r_str_hash (rule_name.GetString ()); + SIZE_T rule_hash = _r_str_hash (rule_name); if (rule_hash && rules_config.find (rule_hash) == rules_config.end ()) { @@ -1535,13 +1656,11 @@ VOID _app_profile_load_helper (pugi::xml_node& root, ENUM_TYPE_DATA type, UINT v ptr_config->is_enabled = item.attribute (L"is_enabled").as_bool (); - rstring attr_apps = item.attribute (L"apps").as_string (); + ptr_config->name = _r_obj_createstring (rule_name); + ptr_config->apps = _r_obj_createstring (item.attribute (L"apps").as_string ()); if (version < XML_PROFILE_VER_3) - _r_str_replace (attr_apps.GetBuffer (), DIVIDER_RULE[0], DIVIDER_APP[0]); // for compat with old profiles - - _r_str_alloc (&ptr_config->pname, rule_name.GetLength (), rule_name.GetString ()); - _r_str_alloc (&ptr_config->papps, attr_apps.GetLength (), attr_apps.GetString ()); + _r_str_replacechar (ptr_config->apps->Buffer, DIVIDER_RULE[0], DIVIDER_APP[0]); // for compat with old profiles rules_config[rule_hash] = ptr_config; } @@ -1584,7 +1703,7 @@ VOID _app_profile_load_internal (LPCWSTR path, LPCWSTR path_backup, time_t* ptim // show only syntax, memory and i/o errors... if (!load_original && load_original.status != pugi::status_file_not_found && load_original.status != pugi::status_no_document_element) - app.LogError (L"pugi::load_file", 0, _r_fmt (L"status: %d,offset: %" TEXT (PR_PTRDIFF) L",text: %hs,file: %s", load_original.status, load_original.offset, load_original.description (), path).GetString (), UID); + app.LogErrorV (UID, L"pugi::load_file", 0, L"status: %d,offset: %" TEXT (PR_PTRDIFF) L",text: %hs,file: %s", load_original.status, load_original.offset, load_original.description (), path); if (load_original && root) { @@ -1624,16 +1743,16 @@ VOID _app_profile_load (HWND hwnd, LPCWSTR path_custom) _r_fastlock_acquireexclusive (&lock_apply); // clear apps - _app_freeobjects_map (apps, 0); + _app_freeapps_map (&apps); // clear services/uwp apps - _app_freeappshelper_map (apps_helper); + _app_freeappshelper_map (&apps_helper); // clear rules config - _app_freerulesconfig_map (rules_config); + _app_freerulesconfig_map (&rules_config); // clear rules - _app_freeobjects_vec (rules_arr); + _app_freerules_vec (&rules_arr); // generate uwp apps list (win8+) if (_r_sys_validversion (6, 2)) @@ -1658,7 +1777,7 @@ VOID _app_profile_load (HWND hwnd, LPCWSTR path_custom) { // show only syntax, memory and i/o errors... if (result.status != pugi::status_file_not_found && result.status != pugi::status_no_document_element) - app.LogError (L"pugi::load_file", 0, _r_fmt (L"status: %d,offset: %" TEXT (PR_PTRDIFF) L",text: %hs,file: %s", result.status, result.offset, result.description (), !_r_str_isempty (path_custom) ? path_custom : config.profile_path).GetString (), UID); + app.LogErrorV (UID, L"pugi::load_file", 0, L"status: %d,offset: %" TEXT (PR_PTRDIFF) L",text: %hs,file: %s", result.status, result.offset, result.description (), !_r_str_isempty (path_custom) ? path_custom : config.profile_path); } else { @@ -1703,47 +1822,48 @@ VOID _app_profile_load (HWND hwnd, LPCWSTR path_custom) time_t current_time = _r_unixtime_now (); // add apps - for (auto &p : apps) + for (auto it = apps.begin (); it != apps.end (); ++it) { - PR_OBJECT ptr_app_object = _r_obj2_reference (p.second); - - if (!ptr_app_object) + if (!it->second) continue; - SIZE_T app_hash = p.first; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + SIZE_T app_hash = it->first; + PITEM_APP ptr_app = (PITEM_APP)_r_obj_reference (it->second); - if (ptr_app) + INT listview_id = _app_getlistview_id (ptr_app->type); + + if (listview_id) { - INT listview_id = _app_getlistview_id (ptr_app->type); + _r_fastlock_acquireshared (&lock_checkbox); - if (listview_id) - { - _r_fastlock_acquireshared (&lock_checkbox); + _r_listview_additem (hwnd, listview_id, 0, 0, _r_obj_getstringordefault (ptr_app->display_name, SZ_EMPTY), ptr_app->icon_id, _app_getappgroup (app_hash, ptr_app), app_hash); + _app_setappiteminfo (hwnd, listview_id, 0, app_hash, ptr_app); - _r_listview_additem (hwnd, listview_id, 0, 0, ptr_app->display_name, ptr_app->icon_id, _app_getappgroup (app_hash, ptr_app), app_hash); - _app_setappiteminfo (hwnd, listview_id, 0, app_hash, ptr_app); - - _r_fastlock_releaseshared (&lock_checkbox); - } - - // install timer - if (ptr_app->timer) - _app_timer_set (hwnd, ptr_app, ptr_app->timer - current_time); + _r_fastlock_releaseshared (&lock_checkbox); } - _r_obj2_dereference (ptr_app_object); + // install timer + if (ptr_app->timer) + _app_timer_set (hwnd, ptr_app, ptr_app->timer - current_time); + + _r_obj_dereference (ptr_app); } // add services and store apps - for (auto &p : apps_helper) + for (auto it = apps_helper.begin (); it != apps_helper.end (); ++it) { - PITEM_APP_HELPER ptr_app_item = (PITEM_APP_HELPER)_r_obj_reference (p.second); - - if (!ptr_app_item) + if (!it->second) continue; - _app_addapplication (hwnd, ptr_app_item->internal_name, ptr_app_item->timestamp, 0, 0, FALSE, FALSE); + PITEM_APP_HELPER ptr_app_item = (PITEM_APP_HELPER)_r_obj_reference (it->second); + + if (_r_str_isempty (ptr_app_item->internal_name)) + { + _r_obj_dereference (ptr_app_item); + continue; + } + + _app_addapplication (hwnd, ptr_app_item->internal_name->Buffer, ptr_app_item->timestamp, 0, 0, FALSE, FALSE); _r_obj_dereference (ptr_app_item); } @@ -1751,29 +1871,26 @@ VOID _app_profile_load (HWND hwnd, LPCWSTR path_custom) // add rules for (SIZE_T i = 0; i < rules_arr.size (); i++) { - PR_OBJECT ptr_rule_object = _r_obj2_reference (rules_arr.at (i)); + PVOID pdata = rules_arr.at (i); - if (!ptr_rule_object) + if (!pdata) continue; - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; + PITEM_RULE ptr_rule = (PITEM_RULE)_r_obj_reference (pdata); - if (ptr_rule) + INT listview_id = _app_getlistview_id (ptr_rule->type); + + if (listview_id) { - INT listview_id = _app_getlistview_id (ptr_rule->type); + _r_fastlock_acquireshared (&lock_checkbox); - if (listview_id) - { - _r_fastlock_acquireshared (&lock_checkbox); + _r_listview_additem (hwnd, listview_id, 0, 0, _r_obj_getstringordefault (ptr_rule->name, SZ_EMPTY), _app_getruleicon (ptr_rule), _app_getrulegroup (ptr_rule), i); + _app_setruleiteminfo (hwnd, listview_id, 0, ptr_rule, FALSE); - _r_listview_additem (hwnd, listview_id, 0, 0, ptr_rule->pname, _app_getruleicon (ptr_rule), _app_getrulegroup (ptr_rule), i); - _app_setruleiteminfo (hwnd, listview_id, 0, ptr_rule, FALSE); - - _r_fastlock_releaseshared (&lock_checkbox); - } + _r_fastlock_releaseshared (&lock_checkbox); } - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); } } @@ -1812,76 +1929,60 @@ VOID _app_profile_save (LPCWSTR path_custom) // save apps if (root_apps) { - for (auto &p : apps) + for (auto it = apps.begin (); it != apps.end (); ++it) { - PR_OBJECT ptr_app_object = _r_obj2_reference (p.second); - - if (!ptr_app_object) + if (!it->second) continue; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + PITEM_APP ptr_app = (PITEM_APP)_r_obj_reference (it->second); - if (ptr_app) + if (_r_str_isempty (ptr_app->original_path) || (!_app_isappused (ptr_app, it->first) && (ptr_app->type == DataAppService || ptr_app->type == DataAppUWP))) { - if (!ptr_app->original_path) - { - _r_obj2_dereference (ptr_app_object); - continue; - } - - if (!_app_isappused (ptr_app, p.first) && (ptr_app->type == DataAppService || ptr_app->type == DataAppUWP)) - { - _r_obj2_dereference (ptr_app_object); - continue; - } - - pugi::xml_node item = root_apps.append_child (L"item"); - - if (item) - { - item.append_attribute (L"path").set_value (ptr_app->original_path); - - if (ptr_app->timestamp) - item.append_attribute (L"timestamp").set_value (ptr_app->timestamp); - - // set timer (if presented) - if (ptr_app->timer && _app_istimeractive (ptr_app)) - item.append_attribute (L"timer").set_value (ptr_app->timer); - - // ffu! - if (ptr_app->profile) - item.append_attribute (L"profile").set_value (ptr_app->profile); - - if (ptr_app->is_silent) - item.append_attribute (L"is_silent").set_value (ptr_app->is_silent); - - if (ptr_app->is_enabled) - item.append_attribute (L"is_enabled").set_value (ptr_app->is_enabled); - } + _r_obj_dereference (ptr_app); + continue; } - _r_obj2_dereference (ptr_app_object); + pugi::xml_node item = root_apps.append_child (L"item"); + + if (item) + { + item.append_attribute (L"path").set_value (ptr_app->original_path->Buffer); + + if (ptr_app->timestamp) + item.append_attribute (L"timestamp").set_value (ptr_app->timestamp); + + // set timer (if presented) + if (ptr_app->timer && _app_istimeractive (ptr_app)) + item.append_attribute (L"timer").set_value (ptr_app->timer); + + // ffu! + if (ptr_app->profile) + item.append_attribute (L"profile").set_value (ptr_app->profile); + + if (ptr_app->is_silent) + item.append_attribute (L"is_silent").set_value (ptr_app->is_silent); + + if (ptr_app->is_enabled) + item.append_attribute (L"is_enabled").set_value (ptr_app->is_enabled); + } + + _r_obj_dereference (ptr_app); } } // save user rules if (root_rules_custom) { - for (auto &p : rules_arr) + for (auto it = rules_arr.begin (); it != rules_arr.end (); ++it) { - if (!p) + if (!*it) continue; - PR_OBJECT ptr_rule_object = _r_obj2_reference (p); + PITEM_RULE ptr_rule = (PITEM_RULE)_r_obj_reference (*it); - if (!ptr_rule_object) - continue; - - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; - - if (!ptr_rule || ptr_rule->is_readonly || _r_str_isempty (ptr_rule->pname)) + if (ptr_rule->is_readonly || _r_str_isempty (ptr_rule->name)) { - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); continue; } @@ -1889,13 +1990,13 @@ VOID _app_profile_save (LPCWSTR path_custom) if (item) { - item.append_attribute (L"name").set_value (ptr_rule->pname); + item.append_attribute (L"name").set_value (ptr_rule->name->Buffer); - if (!_r_str_isempty (ptr_rule->prule_remote)) - item.append_attribute (L"rule").set_value (ptr_rule->prule_remote); + if (!_r_str_isempty (ptr_rule->rule_remote)) + item.append_attribute (L"rule").set_value (ptr_rule->rule_remote->Buffer); - if (!_r_str_isempty (ptr_rule->prule_local)) - item.append_attribute (L"rule_local").set_value (ptr_rule->prule_local); + if (!_r_str_isempty (ptr_rule->rule_local)) + item.append_attribute (L"rule_local").set_value (ptr_rule->rule_local->Buffer); // ffu! if (ptr_rule->profile) @@ -1911,12 +2012,17 @@ VOID _app_profile_save (LPCWSTR path_custom) item.append_attribute (L"version").set_value (ptr_rule->af); // add apps attribute - if (!ptr_rule->apps.empty ()) + if (!ptr_rule->apps->empty ()) { - rstring rule_apps = _app_rulesexpandapps (ptr_rule, FALSE, DIVIDER_APP); + PR_STRING rule_apps = _app_rulesexpandapps (ptr_rule, FALSE, DIVIDER_APP); - if (!rule_apps.IsEmpty ()) - item.append_attribute (L"apps").set_value (rule_apps.GetString ()); + if (rule_apps) + { + if (!_r_str_isempty (rule_apps)) + item.append_attribute (L"apps").set_value (rule_apps->Buffer); + + _r_obj_dereference (rule_apps); + } } if (ptr_rule->is_block) @@ -1926,67 +2032,70 @@ VOID _app_profile_save (LPCWSTR path_custom) item.append_attribute (L"is_enabled").set_value (ptr_rule->is_enabled); } - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); } } // save rules config if (root_rule_config) { - for (auto &p : rules_config) + for (auto it = rules_config.begin (); it != rules_config.end (); ++it) { - PITEM_RULE_CONFIG ptr_config = (PITEM_RULE_CONFIG)_r_obj_reference (p.second); - - if (!ptr_config) + if (!it->second) continue; - if (_r_str_isempty (ptr_config->pname)) + PITEM_RULE_CONFIG ptr_config = (PITEM_RULE_CONFIG)_r_obj_reference (it->second); + + if (_r_str_isempty (ptr_config->name)) { _r_obj_dereference (ptr_config); continue; } - rstring rule_apps; + PR_STRING rule_apps = NULL; BOOLEAN is_enabled_default = ptr_config->is_enabled; { - SIZE_T rule_hash = _r_str_hash (ptr_config->pname); - PR_OBJECT ptr_rule_object = _app_getrulebyhash (rule_hash); + SIZE_T rule_hash = _r_str_hash (ptr_config->name); + PITEM_RULE ptr_rule = _app_getrulebyhash (rule_hash); - if (ptr_rule_object) + if (ptr_rule) { - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; + is_enabled_default = ptr_rule->is_enabled_default; - if (ptr_rule) + if (ptr_rule->type == DataRuleCustom && !ptr_rule->apps->empty ()) { - is_enabled_default = ptr_rule->is_enabled_default; - - if (ptr_rule->type == DataRuleCustom && !ptr_rule->apps.empty ()) - rule_apps = _app_rulesexpandapps (ptr_rule, FALSE, DIVIDER_APP); + rule_apps = _app_rulesexpandapps (ptr_rule, FALSE, DIVIDER_APP); } - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); } } // skip saving untouched configuration - if (ptr_config->is_enabled == is_enabled_default) + if (ptr_config->is_enabled == is_enabled_default && _r_str_isempty (rule_apps)) { - if (rule_apps.IsEmpty ()) - { - _r_obj_dereference (ptr_config); - continue; - } + if (rule_apps) + _r_obj_clearreference (&rule_apps); + + _r_obj_dereference (ptr_config); + + continue; } pugi::xml_node item = root_rule_config.append_child (L"item"); if (item) { - item.append_attribute (L"name").set_value (ptr_config->pname); + item.append_attribute (L"name").set_value (ptr_config->name->Buffer); - if (!rule_apps.IsEmpty ()) - item.append_attribute (L"apps").set_value (rule_apps.GetString ()); + if (rule_apps) + { + if (!_r_str_isempty (rule_apps)) + item.append_attribute (L"apps").set_value (rule_apps->Buffer); + + _r_obj_clearreference (&rule_apps); + } item.append_attribute (L"is_enabled").set_value (ptr_config->is_enabled); } diff --git a/src/profile.hpp b/src/profile.hpp index dce5fe05..6f7334f8 100644 --- a/src/profile.hpp +++ b/src/profile.hpp @@ -8,10 +8,10 @@ BOOLEAN _app_setappinfo (SIZE_T app_hash, ENUM_INFO_DATA info_key, LONG_PTR info SIZE_T _app_addapplication (HWND hwnd, LPCWSTR path, time_t timestamp, time_t timer, time_t last_notify, BOOLEAN is_silent, BOOLEAN is_enabled); -PR_OBJECT _app_getappitem (SIZE_T app_hash); +PITEM_APP _app_getappitem (SIZE_T app_hash); PITEM_APP_HELPER _app_getapphelperitem (SIZE_T app_hash); -PR_OBJECT _app_getrulebyid (SIZE_T idx); -PR_OBJECT _app_getrulebyhash (SIZE_T rule_hash); +PITEM_RULE _app_getrulebyid (SIZE_T idx); +PITEM_RULE _app_getrulebyhash (SIZE_T rule_hash); PITEM_NETWORK _app_getnetworkitem (SIZE_T network_hash); SIZE_T _app_getnetworkapp (SIZE_T network_hash); PITEM_LOG _app_getlogitem (SIZE_T idx); @@ -27,7 +27,7 @@ INT _app_getrulegroup (const PITEM_RULE ptr_rule); INT _app_getruleicon (const PITEM_RULE ptr_rule); COLORREF _app_getrulecolor (INT listview_id, SIZE_T rule_idx); -rstring _app_gettooltip (HWND hwnd, LPNMLVGETINFOTIP lpnmlv); +PR_STRING _app_gettooltip (HWND hwnd, LPNMLVGETINFOTIP lpnmlv); VOID _app_setappiteminfo (HWND hwnd, INT listview_id, INT item, SIZE_T app_hash, PITEM_APP ptr_app); VOID _app_setruleiteminfo (HWND hwnd, INT listview_id, INT item, PITEM_RULE ptr_rule, BOOLEAN include_apps); @@ -39,8 +39,8 @@ BOOLEAN _app_ruleblocklistsetchange (PITEM_RULE ptr_rule, INT new_state); BOOLEAN _app_ruleblocklistsetstate (PITEM_RULE ptr_rule, INT spy_state, INT update_state, INT extra_state); VOID _app_ruleblocklistset (HWND hwnd, INT spy_state, INT update_state, INT extra_state, BOOLEAN is_instantapply); -rstring _app_appexpandrules (SIZE_T app_hash, LPCWSTR delimeter); -rstring _app_rulesexpandapps (const PITEM_RULE ptr_rule, BOOLEAN is_fordisplay, LPCWSTR delimeter); +PR_STRING _app_appexpandrules (SIZE_T app_hash, LPCWSTR delimeter); +PR_STRING _app_rulesexpandapps (const PITEM_RULE ptr_rule, BOOLEAN is_fordisplay, LPCWSTR delimeter); BOOLEAN _app_isappfound (SIZE_T app_hash); BOOLEAN _app_isapphelperfound (SIZE_T app_hash); diff --git a/src/wfp.cpp b/src/wfp.cpp index 2d79a8ee..16c273b7 100644 --- a/src/wfp.cpp +++ b/src/wfp.cpp @@ -15,12 +15,15 @@ ENUM_INSTALL_TYPE _wfp_isproviderinstalled (HANDLE hengine) if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\services\\BFE\\Parameters\\Policy\\Persistent\\Provider", 0, KEY_READ, &hkey) == ERROR_SUCCESS) { - static rstring guidString = _r_str_fromguid ((LPGUID)&GUID_WfpProvider); + static PR_STRING guidString = _r_str_fromguid ((LPGUID)&GUID_WfpProvider); - if (RegQueryValueEx (hkey, guidString.GetString (), NULL, NULL, NULL, NULL) == ERROR_SUCCESS) + if (guidString) { - RegCloseKey (hkey); - return InstallEnabled; + if (RegQueryValueEx (hkey, guidString->Buffer, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) + { + RegCloseKey (hkey); + return InstallEnabled; + } } RegCloseKey (hkey); @@ -46,12 +49,15 @@ ENUM_INSTALL_TYPE _wfp_issublayerinstalled (HANDLE hengine) if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\services\\BFE\\Parameters\\Policy\\Persistent\\SubLayer", 0, KEY_READ, &hkey) == ERROR_SUCCESS) { - static rstring guidString = _r_str_fromguid ((LPGUID)&GUID_WfpSublayer); + static PR_STRING guidString = _r_str_fromguid ((LPGUID)&GUID_WfpSublayer); - if (RegQueryValueEx (hkey, guidString.GetString (), NULL, NULL, NULL, NULL) == ERROR_SUCCESS) + if (guidString) { - RegCloseKey (hkey); - return InstallEnabled; + if (RegQueryValueEx (hkey, guidString->Buffer, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) + { + RegCloseKey (hkey); + return InstallEnabled; + } } RegCloseKey (hkey); @@ -101,7 +107,7 @@ HANDLE _wfp_getenginehandle () if (code != ERROR_SUCCESS) { - app.LogError (L"FwpmEngineOpen", code, NULL, UID); + app.LogError (UID, L"FwpmEngineOpen", code, NULL); } else { @@ -181,7 +187,7 @@ BOOLEAN _wfp_initialize (HANDLE hengine, BOOLEAN is_full) is_intransact = FALSE; } - app.LogError (L"FwpmProviderAdd", code, NULL, UID); + app.LogError (UID, L"FwpmProviderAdd", code, NULL); result = FALSE; goto DoExit; @@ -216,7 +222,7 @@ BOOLEAN _wfp_initialize (HANDLE hengine, BOOLEAN is_full) is_intransact = FALSE; } - app.LogError (L"FwpmSubLayerAdd", code, NULL, UID); + app.LogError (UID, L"FwpmSubLayerAdd", code, NULL); result = FALSE; goto DoExit; @@ -261,7 +267,7 @@ BOOLEAN _wfp_initialize (HANDLE hengine, BOOLEAN is_full) if (code != ERROR_SUCCESS) { - app.LogError (L"FwpmEngineSetOption", code, L"FWPM_ENGINE_COLLECT_NET_EVENTS", 0); + app.LogError (0, L"FwpmEngineSetOption", code, L"FWPM_ENGINE_COLLECT_NET_EVENTS"); } else { @@ -281,7 +287,7 @@ BOOLEAN _wfp_initialize (HANDLE hengine, BOOLEAN is_full) code = FwpmEngineSetOption (hengine, FWPM_ENGINE_NET_EVENT_MATCH_ANY_KEYWORDS, &val); if (code != ERROR_SUCCESS) - app.LogError (L"FwpmEngineSetOption", code, L"FWPM_ENGINE_NET_EVENT_MATCH_ANY_KEYWORDS", 0); + app.LogError (0, L"FwpmEngineSetOption", code, L"FWPM_ENGINE_NET_EVENT_MATCH_ANY_KEYWORDS"); // enables the connection monitoring feature and starts logging creation and deletion events (and notifying any subscribers) if (app.ConfigGetBoolean (L"IsMonitorIPSecConnections", TRUE)) @@ -292,7 +298,7 @@ BOOLEAN _wfp_initialize (HANDLE hengine, BOOLEAN is_full) code = FwpmEngineSetOption (hengine, FWPM_ENGINE_MONITOR_IPSEC_CONNECTIONS, &val); if (code != ERROR_SUCCESS) - app.LogError (L"FwpmEngineSetOption", code, L"FWPM_ENGINE_MONITOR_IPSEC_CONNECTIONS", 0); + app.LogError (0, L"FwpmEngineSetOption", code, L"FWPM_ENGINE_MONITOR_IPSEC_CONNECTIONS"); } } @@ -312,7 +318,7 @@ BOOLEAN _wfp_initialize (HANDLE hengine, BOOLEAN is_full) code = FwpmEngineSetOption (hengine, FWPM_ENGINE_PACKET_QUEUING, &val); if (code != ERROR_SUCCESS) - app.LogError (L"FwpmEngineSetOption", code, L"FWPM_ENGINE_PACKET_QUEUING", 0); + app.LogError (0, L"FwpmEngineSetOption", code, L"FWPM_ENGINE_PACKET_QUEUING"); } } @@ -364,7 +370,7 @@ VOID _wfp_uninitialize (HANDLE hengine, BOOLEAN is_full) // destroy callouts (deprecated) { - LPGUID callouts[] = { + LPCGUID callouts[] = { &GUID_WfpOutboundCallout4_DEPRECATED, &GUID_WfpOutboundCallout6_DEPRECATED, &GUID_WfpInboundCallout4_DEPRECATED, @@ -373,21 +379,21 @@ VOID _wfp_uninitialize (HANDLE hengine, BOOLEAN is_full) &GUID_WfpListenCallout6_DEPRECATED }; - for (auto &callout_id : callouts) - FwpmCalloutDeleteByKey (hengine, callout_id); + for (SIZE_T i = 0; i < RTL_NUMBER_OF (callouts); i++) + FwpmCalloutDeleteByKey (hengine, callouts[i]); } // destroy sublayer code = FwpmSubLayerDeleteByKey (hengine, &GUID_WfpSublayer); if (code != ERROR_SUCCESS && code != FWP_E_SUBLAYER_NOT_FOUND) - app.LogError (L"FwpmSubLayerDeleteByKey", code, NULL, UID); + app.LogError (UID, L"FwpmSubLayerDeleteByKey", code, NULL); // destroy provider code = FwpmProviderDeleteByKey (hengine, &GUID_WfpProvider); if (code != ERROR_SUCCESS && code != FWP_E_PROVIDER_NOT_FOUND) - app.LogError (L"FwpmProviderDeleteByKey", code, NULL, UID); + app.LogError (UID, L"FwpmProviderDeleteByKey", code, NULL); if (is_intransact) _wfp_transact_commit (hengine, __LINE__); @@ -413,8 +419,8 @@ VOID _wfp_installfilters (HANDLE hengine) // restore filters security if (filters_count) { - for (auto &filter_id : filter_all) - _app_setsecurityinfoforfilter (hengine, &filter_id, FALSE, __LINE__); + for (auto it = filter_all.begin (); it != filter_all.end (); ++it) + _app_setsecurityinfoforfilter (hengine, &(*it), FALSE, __LINE__); } BOOLEAN is_intransact = _wfp_transact_start (hengine, __LINE__); @@ -422,8 +428,8 @@ VOID _wfp_installfilters (HANDLE hengine) // destroy all filters if (filters_count) { - for (auto &p : filter_all) - _wfp_deletefilter (hengine, &p); + for (auto it = filter_all.begin (); it != filter_all.end (); ++it) + _wfp_deletefilter (hengine, &(*it)); } // apply internal rules @@ -431,61 +437,57 @@ VOID _wfp_installfilters (HANDLE hengine) // apply apps rules { - OBJECTS_VEC rules; + OBJECTS_APP_VECTOR rules; - for (auto &p : apps) + for (auto it = apps.begin (); it != apps.end (); ++it) { - PR_OBJECT ptr_app_object = _r_obj2_reference (p.second); - - if (!ptr_app_object) + if (!it->second) continue; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + PITEM_APP ptr_app = (PITEM_APP)_r_obj_reference (it->second); - if (ptr_app && ptr_app->is_enabled) + if (ptr_app->is_enabled) { - rules.push_back (ptr_app_object); + rules.emplace_back (ptr_app); } else { - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } } if (!rules.empty ()) { - _wfp_create3filters (hengine, rules, __LINE__, is_intransact); - _app_freeobjects_vec (rules); + _wfp_create3filters (hengine, &rules, __LINE__, is_intransact); + _app_freeapps_vec (&rules); } } // apply blocklist/system/user rules { - OBJECTS_VEC rules; + OBJECTS_RULE_VECTOR rules; - for (auto &p : rules_arr) + for (auto it = rules_arr.begin (); it != rules_arr.end (); ++it) { - PR_OBJECT ptr_rule_object = _r_obj2_reference (p); - - if (!ptr_rule_object) + if (!*it) continue; - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; + PITEM_RULE ptr_rule = (PITEM_RULE)_r_obj_reference (*it); - if (ptr_rule && ptr_rule->is_enabled) + if (ptr_rule->is_enabled) { - rules.push_back (ptr_rule_object); + rules.emplace_back (ptr_rule); } else { - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); } } if (!rules.empty ()) { - _wfp_create4filters (hengine, rules, __LINE__, is_intransact); - _app_freeobjects_vec (rules); + _wfp_create4filters (hengine, &rules, __LINE__, is_intransact); + _app_freerules_vec (&rules); } } @@ -499,8 +501,8 @@ VOID _wfp_installfilters (HANDLE hengine) { if (_wfp_dumpfilters (hengine, &GUID_WfpProvider, &filter_all)) { - for (auto &filter_id : filter_all) - _app_setsecurityinfoforfilter (hengine, &filter_id, is_secure, __LINE__); + for (auto it = filter_all.begin (); it != filter_all.end (); ++it) + _app_setsecurityinfoforfilter (hengine, &(*it), is_secure, __LINE__); } } @@ -519,7 +521,7 @@ BOOLEAN _wfp_transact_start (HANDLE hengine, UINT line) if (code != ERROR_SUCCESS) { - app.LogError (L"FwpmTransactionBegin", code, _r_fmt (L"#%d", line).GetString (), UID); + app.LogErrorV (UID, L"FwpmTransactionBegin", code, L"#%" TEXT (PRIu32), line); return FALSE; } @@ -534,7 +536,7 @@ BOOLEAN _wfp_transact_commit (HANDLE hengine, UINT line) { FwpmTransactionAbort (hengine); - app.LogError (L"FwpmTransactionCommit", code, _r_fmt (L"#%d", line).GetString (), UID); + app.LogErrorV (UID, L"FwpmTransactionCommit", code, L"#%" TEXT (PRIu32), line); return FALSE; } @@ -542,13 +544,19 @@ BOOLEAN _wfp_transact_commit (HANDLE hengine, UINT line) return TRUE; } -BOOLEAN _wfp_deletefilter (HANDLE hengine, const LPGUID pfilter_id) +BOOLEAN _wfp_deletefilter (HANDLE hengine, LPCGUID pfilter_id) { DWORD code = FwpmFilterDeleteByKey (hengine, pfilter_id); if (code != ERROR_SUCCESS && code != FWP_E_FILTER_NOT_FOUND) { - app.LogError (L"FwpmFilterDeleteByKey", code, _r_str_fromguid (pfilter_id).GetString (), UID); + PR_STRING guidString = _r_str_fromguid ((LPGUID)pfilter_id); + + app.LogError (UID, L"FwpmFilterDeleteByKey", code, _r_obj_getstringordefault (guidString, SZ_EMPTY)); + + if (guidString) + _r_obj_dereference (guidString); + return FALSE; } @@ -558,12 +566,13 @@ BOOLEAN _wfp_deletefilter (HANDLE hengine, const LPGUID pfilter_id) DWORD _wfp_createfilter (HANDLE hengine, LPCWSTR name, FWPM_FILTER_CONDITION* lpcond, UINT32 count, UINT8 weight, const GUID* layer_id, const GUID* callout_id, FWP_ACTION_TYPE action, UINT32 flags, GUIDS_VEC* ptr_filters) { FWPM_FILTER filter = {0}; - WCHAR fltr_name[128]; - _r_str_copy (fltr_name, RTL_NUMBER_OF (fltr_name), APP_NAME); - WCHAR fltr_desc[128]; - _r_str_copy (fltr_desc, RTL_NUMBER_OF (fltr_desc), _r_str_isempty (name) ? SZ_EMPTY : name); + ULONG code; + UINT64 filter_id; + + _r_str_copy (fltr_name, RTL_NUMBER_OF (fltr_name), APP_NAME); + _r_str_copy (fltr_desc, RTL_NUMBER_OF (fltr_desc), name ? name : SZ_EMPTY); filter.displayData.name = fltr_name; filter.displayData.description = fltr_desc; @@ -603,17 +612,16 @@ DWORD _wfp_createfilter (HANDLE hengine, LPCWSTR name, FWPM_FILTER_CONDITION* lp filter.action.type = action; - UINT64 filter_id; - DWORD code = FwpmFilterAdd (hengine, &filter, NULL, &filter_id); + code = FwpmFilterAdd (hengine, &filter, NULL, &filter_id); if (code == ERROR_SUCCESS) { if (ptr_filters) - ptr_filters->push_back (filter.filterKey); + ptr_filters->emplace_back (filter.filterKey); } else { - app.LogError (L"FwpmFilterAdd", code, fltr_desc, UID); + app.LogError (UID, L"FwpmFilterAdd", code, fltr_desc); } return code; @@ -625,41 +633,31 @@ VOID _wfp_clearfilter_ids () filter_ids.clear (); // clear apps filters - for (auto &p : apps) + for (auto it = apps.begin (); it != apps.end (); ++it) { - PR_OBJECT ptr_app_object = _r_obj2_reference (p.second); - - if (!ptr_app_object) + if (!it->second) continue; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + PITEM_APP ptr_app = (PITEM_APP)_r_obj_reference (it->second); - if (ptr_app) - { - ptr_app->is_haveerrors = FALSE; - ptr_app->guids.clear (); - } + ptr_app->is_haveerrors = FALSE; + ptr_app->guids->clear (); - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } // clear rules filters - for (auto &p : rules_arr) + for (auto it = rules_arr.begin (); it != rules_arr.end (); ++it) { - PR_OBJECT ptr_rule_object = _r_obj2_reference (p); - - if (!ptr_rule_object) + if (!*it) continue; - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; + PITEM_RULE ptr_rule = (PITEM_RULE)_r_obj_reference (*it); - if (ptr_rule) - { - ptr_rule->is_haveerrors = FALSE; - ptr_rule->guids.clear (); - } + ptr_rule->is_haveerrors = FALSE; + ptr_rule->guids->clear (); - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); } } @@ -673,29 +671,29 @@ VOID _wfp_destroyfilters (HANDLE hengine) _r_fastlock_acquireshared (&lock_transaction); if (_wfp_dumpfilters (hengine, &GUID_WfpProvider, &filter_all)) - _wfp_destroyfilters_array (hengine, filter_all, __LINE__); + _wfp_destroyfilters_array (hengine, &filter_all, __LINE__); _r_fastlock_releaseshared (&lock_transaction); } -BOOLEAN _wfp_destroyfilters_array (HANDLE hengine, GUIDS_VEC& ptr_filters, UINT line) +BOOLEAN _wfp_destroyfilters_array (HANDLE hengine, GUIDS_VEC* ptr_filters, UINT line) { - if (ptr_filters.empty ()) + if (ptr_filters->empty ()) return FALSE; BOOLEAN is_enabled = _app_initinterfacestate (app.GetHWND (), FALSE); _r_fastlock_acquireshared (&lock_transaction); - for (auto &filter_id : ptr_filters) - _app_setsecurityinfoforfilter (hengine, &filter_id, FALSE, line); + for (auto it = ptr_filters->begin (); it != ptr_filters->end (); ++it) + _app_setsecurityinfoforfilter (hengine, &(*it), FALSE, line); BOOLEAN is_intransact = _wfp_transact_start (hengine, line); - for (auto &filter_id : ptr_filters) - _wfp_deletefilter (hengine, &filter_id); + for (auto it = ptr_filters->begin (); it != ptr_filters->end (); ++it) + _wfp_deletefilter (hengine, &(*it)); - ptr_filters.clear (); + ptr_filters->clear (); if (is_intransact) _wfp_transact_commit (hengine, line); @@ -707,7 +705,7 @@ BOOLEAN _wfp_destroyfilters_array (HANDLE hengine, GUIDS_VEC& ptr_filters, UINT return TRUE; } -BOOLEAN _wfp_createrulefilter (HANDLE hengine, LPCWSTR name, SIZE_T app_hash, LPCWSTR rule_remote, LPCWSTR rule_local, UINT8 protocol, ADDRESS_FAMILY af, FWP_DIRECTION dir, UINT8 weight, FWP_ACTION_TYPE action, UINT32 flag, GUIDS_VEC* pmfarr) +BOOLEAN _wfp_createrulefilter (HANDLE hengine, LPCWSTR name, SIZE_T app_hash, PR_STRING rule_remote, PR_STRING rule_local, UINT8 protocol, ADDRESS_FAMILY af, FWP_DIRECTION dir, UINT8 weight, FWP_ACTION_TYPE action, UINT32 flag, GUIDS_VEC* pmfarr) { UINT32 count = 0; FWPM_FILTER_CONDITION fwfc[8] = {0}; @@ -734,31 +732,22 @@ BOOLEAN _wfp_createrulefilter (HANDLE hengine, LPCWSTR name, SIZE_T app_hash, LP // set path condition if (app_hash) { - PR_OBJECT ptr_app_object = _app_getappitem (app_hash); - - if (!ptr_app_object) - { - app.LogError (TEXT (__FUNCTION__), 0, _r_fmt (L"App \"%" TEXT (PR_SIZE_T) L"\" not found!", app_hash).GetString (), 0); - return FALSE; - } - - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + PITEM_APP ptr_app = _app_getappitem (app_hash); if (!ptr_app) { - app.LogError (TEXT (__FUNCTION__), 0, _r_fmt (L"App \"%" TEXT (PR_SIZE_T) L"\" not found!", app_hash).GetString (), 0); - _r_obj2_dereference (ptr_app_object); - + app.LogErrorV (0, TEXT (__FUNCTION__), 0, L"App \"%" TEXT (PR_SIZE_T) L"\" not found!", app_hash); return FALSE; } - if (ptr_app->type == DataAppService) // windows service { PVOID pdata = NULL; - if (_app_item_get (ptr_app->type, app_hash, NULL, NULL, NULL, &pdata) && ByteBlobAlloc (pdata, RtlLengthSecurityDescriptor (pdata), &bSid)) + if (_app_item_get (ptr_app->type, app_hash, NULL, NULL, NULL, &pdata)) { + ByteBlobAlloc (pdata, RtlLengthSecurityDescriptor (pdata), &bSid); + fwfc[count].fieldKey = FWPM_CONDITION_ALE_USER_ID; fwfc[count].matchType = FWP_MATCH_EQUAL; fwfc[count].conditionValue.type = FWP_SECURITY_DESCRIPTOR_TYPE; @@ -768,11 +757,8 @@ BOOLEAN _wfp_createrulefilter (HANDLE hengine, LPCWSTR name, SIZE_T app_hash, LP } else { - ByteBlobFree (&bPath); - ByteBlobFree (&bSid); - - app.LogError (TEXT (__FUNCTION__), 0, ptr_app->display_name, 0); - _r_obj2_dereference (ptr_app_object); + app.LogError (0, TEXT (__FUNCTION__), 0, _r_obj_getstring (ptr_app->display_name)); + _r_obj_dereference (ptr_app); return FALSE; } @@ -792,15 +778,15 @@ BOOLEAN _wfp_createrulefilter (HANDLE hengine, LPCWSTR name, SIZE_T app_hash, LP } else { - app.LogError (TEXT (__FUNCTION__), 0, ptr_app->display_name, 0); - _r_obj2_dereference (ptr_app_object); + app.LogError (0, TEXT (__FUNCTION__), 0, _r_obj_getstring (ptr_app->display_name)); + _r_obj_dereference (ptr_app); return FALSE; } } else { - LPCWSTR path = ptr_app->original_path; + LPCWSTR path = _r_obj_getstring (ptr_app->original_path); DWORD code = _FwpmGetAppIdFromFileName1 (path, &bPath, ptr_app->type); if (code == ERROR_SUCCESS) @@ -814,25 +800,24 @@ BOOLEAN _wfp_createrulefilter (HANDLE hengine, LPCWSTR name, SIZE_T app_hash, LP } else { - ByteBlobFree (&bSid); ByteBlobFree (&bPath); // do not log file not found to error log if (code != ERROR_FILE_NOT_FOUND && code != ERROR_PATH_NOT_FOUND) - app.LogError (L"FwpmGetAppIdFromFileName", code, path, 0); + app.LogError (0, L"FwpmGetAppIdFromFileName", code, path); - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); return FALSE; } } - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } // set ip/port condition { - LPCWSTR rules[] = { + PR_STRING rules[] = { rule_remote, rule_local }; @@ -924,19 +909,26 @@ BOOLEAN _wfp_createrulefilter (HANDLE hengine, LPCWSTR name, SIZE_T app_hash, LP ByteBlobFree (&bSid); ByteBlobFree (&bPath); - rstringvec rvc; - _r_str_split (addr.host, INVALID_SIZE_T, DIVIDER_RULE[0], rvc); + PR_STRING hostPart; + R_STRINGREF remainingPart; - if (rvc.empty ()) + _r_stringref_initialize (&remainingPart, addr.host); + + while (remainingPart.Length != 0) { - return FALSE; - } - else - { - for (auto &p : rvc) + hostPart = _r_str_splitatchar (&remainingPart, &remainingPart, DIVIDER_RULE[0], TRUE); + + if (hostPart) { - if (!_wfp_createrulefilter (hengine, name, app_hash, p.GetString (), NULL, protocol, af, dir, weight, action, flag, pmfarr)) + if (!_wfp_createrulefilter (hengine, name, app_hash, hostPart, NULL, protocol, af, dir, weight, action, flag, pmfarr)) + { + ByteBlobFree (&bSid); + ByteBlobFree (&bPath); + return FALSE; + } + + _r_obj_dereference (hostPart); } } @@ -1030,9 +1022,9 @@ BOOLEAN _wfp_createrulefilter (HANDLE hengine, LPCWSTR name, SIZE_T app_hash, LP return TRUE; } -BOOLEAN _wfp_create4filters (HANDLE hengine, const OBJECTS_VEC& ptr_rules, UINT line, BOOLEAN is_intransact) +BOOLEAN _wfp_create4filters (HANDLE hengine, OBJECTS_RULE_VECTOR* ptr_rules, UINT line, BOOLEAN is_intransact) { - if (ptr_rules.empty ()) + if (ptr_rules->empty ()) return FALSE; BOOLEAN is_enabled = _app_initinterfacestate (app.GetHWND (), FALSE); @@ -1040,123 +1032,125 @@ BOOLEAN _wfp_create4filters (HANDLE hengine, const OBJECTS_VEC& ptr_rules, UINT if (!is_intransact && _wfp_isfiltersapplying ()) is_intransact = TRUE; - GUIDS_VEC ids; + GUIDS_VEC guids; if (!is_intransact) { - for (auto &p : ptr_rules) + for (auto it = ptr_rules->begin (); it != ptr_rules->end (); ++it) { - PR_OBJECT ptr_rule_object = _r_obj2_reference (p); - - if (!ptr_rule_object) + if (!*it) continue; - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; + PITEM_RULE ptr_rule = (PITEM_RULE)_r_obj_reference (*it); - if (ptr_rule) + if (!ptr_rule->guids->empty ()) { - if (!ptr_rule->guids.empty ()) - { - ids.insert (ids.end (), ptr_rule->guids.begin (), ptr_rule->guids.end ()); - ptr_rule->guids.clear (); - } + guids.insert (guids.end (), ptr_rule->guids->begin (), ptr_rule->guids->end ()); + ptr_rule->guids->clear (); } - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); } - for (auto &filter_id : ids) - _app_setsecurityinfoforfilter (hengine, &filter_id, FALSE, line); + for (auto it = guids.begin (); it != guids.end (); ++it) + _app_setsecurityinfoforfilter (hengine, &(*it), FALSE, line); _r_fastlock_acquireshared (&lock_transaction); is_intransact = !_wfp_transact_start (hengine, line); } - for (auto &p : ids) - _wfp_deletefilter (hengine, &p); + for (auto it = guids.begin (); it != guids.end (); ++it) + _wfp_deletefilter (hengine, &(*it)); - for (auto &p : ptr_rules) + PITEM_RULE ptr_rule; + R_STRINGREF remoteRemainingPart; + R_STRINGREF localRemainingPart; + PR_STRING ruleRemoteString; + PR_STRING ruleLocalString; + LPCWSTR ruleNamePtr; + + for (auto it = ptr_rules->begin (); it != ptr_rules->end (); ++it) { - PR_OBJECT ptr_rule_object = _r_obj2_reference (p); - - if (!ptr_rule_object) + if (!*it) continue; - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; + ptr_rule = (PITEM_RULE)_r_obj_reference (*it); - if (ptr_rule) + ptr_rule->is_haveerrors = FALSE; + ptr_rule->guids->clear (); + + if (!ptr_rule->is_enabled) { - GUIDS_VEC guids; - BOOLEAN is_haveerrors = FALSE; - - if (ptr_rule->is_enabled) - { - rstringvec rule_remote_arr; - _r_str_split (ptr_rule->prule_remote, INVALID_SIZE_T, DIVIDER_RULE[0], rule_remote_arr); - - rstringvec rule_local_arr; - _r_str_split (ptr_rule->prule_local, INVALID_SIZE_T, DIVIDER_RULE[0], rule_local_arr); - - SIZE_T rules_remote_length = rule_remote_arr.size (); - SIZE_T rules_local_length = rule_local_arr.size (); - - SIZE_T count = max (1, max (rules_remote_length, rules_local_length)); - - for (SIZE_T j = 0; j < count; j++) - { - rstring rule_remote; - rstring rule_local; - - // sync remote rules and local rules - if (!rule_remote_arr.empty () && rules_remote_length > j) - { - rule_remote = std::move (rule_remote_arr.at (j)); - _r_str_trim (rule_remote, DIVIDER_TRIM); - } - - // sync local rules and remote rules - if (!rule_local_arr.empty () && rules_local_length > j) - { - rule_local = std::move (rule_local_arr.at (j)); - _r_str_trim (rule_local, DIVIDER_TRIM); - } - - // apply rules for services hosts - if (ptr_rule->is_forservices) - { - if (!_wfp_createrulefilter (hengine, ptr_rule->pname, config.ntoskrnl_hash, rule_remote.GetString (), rule_local.GetString (), ptr_rule->protocol, ptr_rule->af, ptr_rule->direction, ptr_rule->weight, ptr_rule->is_block ? FWP_ACTION_BLOCK : FWP_ACTION_PERMIT, 0, &guids)) - is_haveerrors = TRUE; - - if (!_wfp_createrulefilter (hengine, ptr_rule->pname, config.svchost_hash, rule_remote.GetString (), rule_local.GetString (), ptr_rule->protocol, ptr_rule->af, ptr_rule->direction, ptr_rule->weight, ptr_rule->is_block ? FWP_ACTION_BLOCK : FWP_ACTION_PERMIT, 0, &guids)) - is_haveerrors = TRUE; - } - - if (!ptr_rule->apps.empty ()) - { - for (auto &papps : ptr_rule->apps) - { - if (ptr_rule->is_forservices && (papps.first == config.ntoskrnl_hash || papps.first == config.svchost_hash)) - continue; - - if (!_wfp_createrulefilter (hengine, ptr_rule->pname, papps.first, rule_remote.GetString (), rule_local.GetString (), ptr_rule->protocol, ptr_rule->af, ptr_rule->direction, ptr_rule->weight, ptr_rule->is_block ? FWP_ACTION_BLOCK : FWP_ACTION_PERMIT, 0, &guids)) - is_haveerrors = TRUE; - } - } - else - { - if (!_wfp_createrulefilter (hengine, ptr_rule->pname, 0, rule_remote.GetString (), rule_local.GetString (), ptr_rule->protocol, ptr_rule->af, ptr_rule->direction, ptr_rule->weight, ptr_rule->is_block ? FWP_ACTION_BLOCK : FWP_ACTION_PERMIT, 0, &guids)) - is_haveerrors = TRUE; - } - } - } - - ptr_rule->is_haveerrors = is_haveerrors; - - ptr_rule->guids.clear (); - ptr_rule->guids = std::move (guids); + _r_obj_dereference (ptr_rule); + continue; } - _r_obj2_dereference (ptr_rule_object); + ruleNamePtr = _r_obj_getstringorempty (ptr_rule->name); + + ruleRemoteString = NULL; + ruleLocalString = NULL; + + if (!_r_str_isempty (ptr_rule->rule_remote)) + ruleRemoteString = _r_str_splitatchar (&ptr_rule->rule_remote->sr, &remoteRemainingPart, DIVIDER_RULE[0], TRUE); + else + _r_obj_initializeemptystringref (&remoteRemainingPart); + + if (!_r_str_isempty (ptr_rule->rule_local)) + ruleLocalString = _r_str_splitatchar (&ptr_rule->rule_local->sr, &localRemainingPart, DIVIDER_RULE[0], TRUE); + else + _r_obj_initializeemptystringref (&localRemainingPart); + + while (TRUE) + { + // apply rules for services hosts + if (ptr_rule->is_forservices) + { + if (!_wfp_createrulefilter (hengine, ruleNamePtr, config.ntoskrnl_hash, ruleRemoteString, ruleLocalString, ptr_rule->protocol, ptr_rule->af, ptr_rule->direction, ptr_rule->weight, ptr_rule->is_block ? FWP_ACTION_BLOCK : FWP_ACTION_PERMIT, 0, ptr_rule->guids)) + ptr_rule->is_haveerrors = TRUE; + + if (!_wfp_createrulefilter (hengine, ruleNamePtr, config.svchost_hash, ruleRemoteString, ruleLocalString, ptr_rule->protocol, ptr_rule->af, ptr_rule->direction, ptr_rule->weight, ptr_rule->is_block ? FWP_ACTION_BLOCK : FWP_ACTION_PERMIT, 0, ptr_rule->guids)) + ptr_rule->is_haveerrors = TRUE; + } + + if (!ptr_rule->apps->empty ()) + { + for (auto it = ptr_rule->apps->begin (); it != ptr_rule->apps->end (); ++it) + { + if (ptr_rule->is_forservices && (it->first == config.ntoskrnl_hash || it->first == config.svchost_hash)) + continue; + + if (!_wfp_createrulefilter (hengine, ruleNamePtr, it->first, ruleRemoteString, ruleLocalString, ptr_rule->protocol, ptr_rule->af, ptr_rule->direction, ptr_rule->weight, ptr_rule->is_block ? FWP_ACTION_BLOCK : FWP_ACTION_PERMIT, 0, ptr_rule->guids)) + ptr_rule->is_haveerrors = TRUE; + } + } + else + { + if (!_wfp_createrulefilter (hengine, ruleNamePtr, 0, ruleRemoteString, ruleLocalString, ptr_rule->protocol, ptr_rule->af, ptr_rule->direction, ptr_rule->weight, ptr_rule->is_block ? FWP_ACTION_BLOCK : FWP_ACTION_PERMIT, 0, ptr_rule->guids)) + ptr_rule->is_haveerrors = TRUE; + } + + if (remoteRemainingPart.Length == 0 && localRemainingPart.Length == 0) + break; + + if (remoteRemainingPart.Length != 0) + { + SAFE_DELETE_REFERENCE (ruleRemoteString); + + ruleRemoteString = _r_str_splitatchar (&remoteRemainingPart, &remoteRemainingPart, DIVIDER_RULE[0], TRUE); + } + + if (localRemainingPart.Length != 0) + { + SAFE_DELETE_REFERENCE (ruleLocalString); + + ruleLocalString = _r_str_splitatchar (&localRemainingPart, &localRemainingPart, DIVIDER_RULE[0], TRUE); + } + } + + SAFE_DELETE_REFERENCE (ruleRemoteString); + SAFE_DELETE_REFERENCE (ruleLocalString); + + _r_obj_dereference (ptr_rule); } if (!is_intransact) @@ -1167,22 +1161,20 @@ BOOLEAN _wfp_create4filters (HANDLE hengine, const OBJECTS_VEC& ptr_rules, UINT if (is_secure) { - for (auto &p : ptr_rules) + for (auto it = ptr_rules->begin (); it != ptr_rules->end (); ++it) { - PR_OBJECT ptr_rule_object = _r_obj2_reference (p); - - if (!ptr_rule_object) + if (!*it) continue; - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; + PITEM_RULE ptr_rule = (PITEM_RULE)_r_obj_reference (*it); - if (ptr_rule && ptr_rule->is_enabled) + if (ptr_rule->is_enabled) { - for (auto &filter_id : ptr_rule->guids) - _app_setsecurityinfoforfilter (hengine, &filter_id, is_secure, line); + for (auto it2 = ptr_rule->guids->begin (); it2 != ptr_rule->guids->end (); ++it2) + _app_setsecurityinfoforfilter (hengine, &(*it2), is_secure, line); } - _r_obj2_dereference (ptr_rule_object); + _r_obj_dereference (ptr_rule); } } @@ -1194,9 +1186,9 @@ BOOLEAN _wfp_create4filters (HANDLE hengine, const OBJECTS_VEC& ptr_rules, UINT return TRUE; } -BOOLEAN _wfp_create3filters (HANDLE hengine, const OBJECTS_VEC& ptr_apps, UINT line, BOOLEAN is_intransact) +BOOLEAN _wfp_create3filters (HANDLE hengine, OBJECTS_APP_VECTOR* ptr_apps, UINT line, BOOLEAN is_intransact) { - if (ptr_apps.empty ()) + if (ptr_apps->empty ()) return FALSE; BOOLEAN is_enabled = _app_initinterfacestate (app.GetHWND (), FALSE); @@ -1205,67 +1197,53 @@ BOOLEAN _wfp_create3filters (HANDLE hengine, const OBJECTS_VEC& ptr_apps, UINT l if (!is_intransact && _wfp_isfiltersapplying ()) is_intransact = TRUE; - GUIDS_VEC ids; + GUIDS_VEC guids; if (!is_intransact) { - for (auto &p : ptr_apps) + for (auto it = ptr_apps->begin (); it != ptr_apps->end (); ++it) { - PR_OBJECT ptr_app_object = _r_obj2_reference (p); - - if (!ptr_app_object) + if (!*it) continue; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + PITEM_APP ptr_app = (PITEM_APP)_r_obj_reference (*it); - if (ptr_app) + if (!ptr_app->guids->empty ()) { - if (!ptr_app->guids.empty ()) - { - ids.insert (ids.end (), ptr_app->guids.begin (), ptr_app->guids.end ()); - ptr_app->guids.clear (); - } + guids.insert (guids.end (), ptr_app->guids->begin (), ptr_app->guids->end ()); + ptr_app->guids->clear (); } - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } - for (auto &filter_id : ids) - _app_setsecurityinfoforfilter (hengine, &filter_id, FALSE, line); + for (auto it = guids.begin (); it != guids.end (); ++it) + _app_setsecurityinfoforfilter (hengine, &(*it), FALSE, line); _r_fastlock_acquireshared (&lock_transaction); is_intransact = !_wfp_transact_start (hengine, line); } - for (auto &filter_id : ids) - _wfp_deletefilter (hengine, &filter_id); - - for (auto &p : ptr_apps) + if (!guids.empty ()) { - PR_OBJECT ptr_app_object = _r_obj2_reference (p); + for (auto it = guids.begin (); it != guids.end (); ++it) + _wfp_deletefilter (hengine, &(*it)); + } - if (!ptr_app_object) + for (auto it = ptr_apps->begin (); it != ptr_apps->end (); ++it) + { + if (!*it) continue; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + PITEM_APP ptr_app = (PITEM_APP)_r_obj_reference (*it); - if (ptr_app) + if (ptr_app->is_enabled) { - GUIDS_VEC guids; - - if (ptr_app->is_enabled) - { - if (!_wfp_createrulefilter (hengine, ptr_app->display_name, _r_str_hash (ptr_app->original_path), NULL, NULL, 0, AF_UNSPEC, FWP_DIRECTION_MAX, FILTER_WEIGHT_APPLICATION, action, 0, &guids)) - ptr_app->is_haveerrors = TRUE; - } - - ptr_app->guids.clear (); - - if (!guids.empty ()) - ptr_app->guids = std::move (guids); + if (!_wfp_createrulefilter (hengine, _r_obj_getstring (ptr_app->display_name), _r_str_hash (ptr_app->original_path), NULL, NULL, 0, AF_UNSPEC, FWP_DIRECTION_MAX, FILTER_WEIGHT_APPLICATION, action, 0, ptr_app->guids)) + ptr_app->is_haveerrors = TRUE; } - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } if (!is_intransact) @@ -1276,22 +1254,17 @@ BOOLEAN _wfp_create3filters (HANDLE hengine, const OBJECTS_VEC& ptr_apps, UINT l if (is_secure) { - for (auto &p : ptr_apps) + for (auto it = ptr_apps->begin (); it != ptr_apps->end (); ++it) { - PR_OBJECT ptr_app_object = _r_obj2_reference (p); - - if (!ptr_app_object) + if (!*it) continue; - PITEM_APP ptr_app = (PITEM_APP)ptr_app_object->pdata; + PITEM_APP ptr_app = (PITEM_APP)_r_obj_reference (*it); - if (ptr_app) - { - for (auto &filter_id : ptr_app->guids) - _app_setsecurityinfoforfilter (hengine, &filter_id, is_secure, line); - } + for (auto it2 = ptr_app->guids->begin (); it2 != ptr_app->guids->end (); ++it2) + _app_setsecurityinfoforfilter (hengine, &(*it2), is_secure, line); - _r_obj2_dereference (ptr_app_object); + _r_obj_dereference (ptr_app); } } @@ -1312,8 +1285,11 @@ BOOLEAN _wfp_create2filters (HANDLE hengine, UINT line, BOOLEAN is_intransact) if (!is_intransact) { - for (auto &filter_id : filter_ids) - _app_setsecurityinfoforfilter (hengine, &filter_id, FALSE, line); + if (!filter_ids.empty ()) + { + for (auto it = filter_ids.begin (); it != filter_ids.end (); ++it) + _app_setsecurityinfoforfilter (hengine, &(*it), FALSE, line); + } _r_fastlock_acquireshared (&lock_transaction); is_intransact = !_wfp_transact_start (hengine, line); @@ -1321,8 +1297,8 @@ BOOLEAN _wfp_create2filters (HANDLE hengine, UINT line, BOOLEAN is_intransact) if (!filter_ids.empty ()) { - for (auto &p : filter_ids) - _wfp_deletefilter (hengine, &p); + for (auto it = filter_ids.begin (); it != filter_ids.end (); ++it) + _wfp_deletefilter (hengine, &(*it)); filter_ids.clear (); } @@ -1392,18 +1368,21 @@ BOOLEAN _wfp_create2filters (HANDLE hengine, UINT line, BOOLEAN is_intransact) L"ff00::/8" }; + FWP_V4_ADDR_AND_MASK addr4 = {0}; + FWP_V6_ADDR_AND_MASK addr6 = {0}; + ITEM_ADDRESS addr; + PR_STRING ruleString; + for (SIZE_T i = 0; i < RTL_NUMBER_OF (ip_list); i++) { - FWP_V4_ADDR_AND_MASK addr4 = {0}; - FWP_V6_ADDR_AND_MASK addr6 = {0}; - - ITEM_ADDRESS addr; RtlSecureZeroMemory (&addr, sizeof (addr)); addr.paddr4 = &addr4; addr.paddr6 = &addr6; - if (_app_parserulestring (ip_list[i], &addr)) + ruleString = _r_obj_createstring (ip_list[i]); + + if (_app_parserulestring (ruleString, &addr)) { fwfc[1].matchType = FWP_MATCH_EQUAL; @@ -1438,6 +1417,8 @@ BOOLEAN _wfp_create2filters (HANDLE hengine, UINT line, BOOLEAN is_intransact) _wfp_createfilter (hengine, NULL, fwfc, 2, FILTER_WEIGHT_HIGHEST_IMPORTANT, &FWPM_LAYER_ALE_RESOURCE_ASSIGNMENT_V6, NULL, FWP_ACTION_PERMIT, 0, &filter_ids); } } + + _r_obj_dereference (ruleString); } } @@ -1580,8 +1561,8 @@ BOOLEAN _wfp_create2filters (HANDLE hengine, UINT line, BOOLEAN is_intransact) if (is_secure) { - for (auto &filter_id : filter_ids) - _app_setsecurityinfoforfilter (hengine, &filter_id, is_secure, line); + for (auto it = filter_ids.begin (); it != filter_ids.end (); ++it) + _app_setsecurityinfoforfilter (hengine, &(*it), is_secure, line); } _r_fastlock_releaseshared (&lock_transaction); @@ -1592,7 +1573,7 @@ BOOLEAN _wfp_create2filters (HANDLE hengine, UINT line, BOOLEAN is_intransact) return TRUE; } -SIZE_T _wfp_dumpfilters (HANDLE hengine, const GUID* pprovider_id, GUIDS_VEC* ptr_filters) +SIZE_T _wfp_dumpfilters (HANDLE hengine, LPCGUID pprovider_id, GUIDS_VEC* ptr_filters) { ptr_filters->clear (); @@ -1603,7 +1584,7 @@ SIZE_T _wfp_dumpfilters (HANDLE hengine, const GUID* pprovider_id, GUIDS_VEC* pt if (code != ERROR_SUCCESS) { - app.LogError (L"FwpmFilterCreateEnumHandle", code, NULL, 0); + app.LogError (0, L"FwpmFilterCreateEnumHandle", code, NULL); return 0; } else @@ -1614,7 +1595,7 @@ SIZE_T _wfp_dumpfilters (HANDLE hengine, const GUID* pprovider_id, GUIDS_VEC* pt if (code != ERROR_SUCCESS) { - app.LogError (L"FwpmFilterEnum", code, NULL, 0); + app.LogError (0, L"FwpmFilterEnum", code, NULL); } else { @@ -1625,7 +1606,7 @@ SIZE_T _wfp_dumpfilters (HANDLE hengine, const GUID* pprovider_id, GUIDS_VEC* pt FWPM_FILTER* pfilter = matchingFwpFilter[i]; if (pfilter && pfilter->providerKey && RtlEqualMemory (pfilter->providerKey, pprovider_id, sizeof (GUID))) - ptr_filters->push_back (pfilter->filterKey); + ptr_filters->emplace_back (pfilter->filterKey); } FwpmFreeMemory ((PVOID*)&matchingFwpFilter); @@ -1665,7 +1646,7 @@ BOOLEAN _mps_firewallapi (PBOOLEAN pis_enabled, PBOOLEAN pis_enable) { *pis_enabled = FALSE; - for (auto &type : profileTypes) + for (auto type : profileTypes) { VARIANT_BOOL bIsEnabled = FALSE; @@ -1686,21 +1667,24 @@ BOOLEAN _mps_firewallapi (PBOOLEAN pis_enabled, PBOOLEAN pis_enable) if (pis_enable) { - for (auto &type : profileTypes) + for (auto type : profileTypes) { hr = pNetFwPolicy2->put_FirewallEnabled (type, *pis_enable ? VARIANT_TRUE : VARIANT_FALSE); if (SUCCEEDED (hr)) + { result = TRUE; - + } else - app.LogError (L"put_FirewallEnabled", hr, _r_fmt (L"%d", type).GetString (), 0); + { + app.LogErrorV (0, L"put_FirewallEnabled", hr, L"%d", type); + } } } } else { - app.LogError (L"CoCreateInstance", hr, L"INetFwPolicy2", 0); + app.LogError (0, L"CoCreateInstance", hr, L"INetFwPolicy2"); } if (pNetFwPolicy2) @@ -1722,7 +1706,7 @@ VOID _mps_changeconfig2 (BOOLEAN is_enable) if (!scm) { - app.LogError (L"OpenSCManager", GetLastError (), NULL, 0); + app.LogError (0, L"OpenSCManager", GetLastError (), NULL); } else { @@ -1733,7 +1717,7 @@ VOID _mps_changeconfig2 (BOOLEAN is_enable) BOOLEAN is_started = FALSE; - for (auto &name : ServiceNames) + for (auto name : ServiceNames) { SC_HANDLE sc = OpenService (scm, name, SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS | SERVICE_STOP); @@ -1742,7 +1726,7 @@ VOID _mps_changeconfig2 (BOOLEAN is_enable) DWORD code = GetLastError (); if (code != ERROR_ACCESS_DENIED) - app.LogError (L"OpenService", code, name, 0); + app.LogError (0, L"OpenService", code, name); } else { @@ -1755,7 +1739,7 @@ VOID _mps_changeconfig2 (BOOLEAN is_enable) } if (!ChangeServiceConfig (sc, SERVICE_NO_CHANGE, is_enable ? SERVICE_AUTO_START : SERVICE_DISABLED, SERVICE_NO_CHANGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) - app.LogError (L"ChangeServiceConfig", GetLastError (), name, 0); + app.LogError (0, L"ChangeServiceConfig", GetLastError (), name); CloseServiceHandle (sc); } @@ -1764,13 +1748,13 @@ VOID _mps_changeconfig2 (BOOLEAN is_enable) // start services if (is_enable) { - for (auto &name : ServiceNames) + for (auto name : ServiceNames) { SC_HANDLE sc = OpenService (scm, name, SERVICE_QUERY_STATUS | SERVICE_START); if (!sc) { - app.LogError (L"OpenService", GetLastError (), name, 0); + app.LogError (0, L"OpenService", GetLastError (), name); } else { @@ -1779,14 +1763,14 @@ VOID _mps_changeconfig2 (BOOLEAN is_enable) if (!QueryServiceStatusEx (sc, SC_STATUS_PROCESS_INFO, (LPBYTE)&ssp, sizeof (ssp), &dwBytesNeeded)) { - app.LogError (L"QueryServiceStatusEx", GetLastError (), name, 0); + app.LogError (0, L"QueryServiceStatusEx", GetLastError (), name); } else { if (ssp.dwCurrentState != SERVICE_RUNNING) { if (!StartService (sc, 0, NULL)) - app.LogError (L"StartService", GetLastError (), name, 0); + app.LogError (0, L"StartService", GetLastError (), name); } CloseServiceHandle (sc); @@ -1805,23 +1789,23 @@ VOID _mps_changeconfig2 (BOOLEAN is_enable) DWORD _FwpmGetAppIdFromFileName1 (LPCWSTR path, FWP_BYTE_BLOB** lpblob, ENUM_TYPE_DATA type) { - if (_r_str_isempty (path) || !lpblob) - return ERROR_BAD_ARGUMENTS; + DWORD code = ERROR_FILE_NOT_FOUND; - rstring path_buff; + PR_STRING originalPath = _r_obj_createstring (path); + PR_STRING ntPath = NULL; if (type == DataAppRegular || type == DataAppNetwork || type == DataAppService) { - path_buff = path; - - if (_r_str_hash (path_buff.GetString ()) == config.ntoskrnl_hash) + if (_r_str_hash (_r_obj_getstring (originalPath)) == config.ntoskrnl_hash) { - if (ByteBlobAlloc ((PVOID)path_buff.GetString (), (path_buff.GetLength () + 1) * sizeof (WCHAR), lpblob)) - return ERROR_SUCCESS; + ByteBlobAlloc (_r_obj_getstring (originalPath), _r_obj_getstringsize (originalPath) + sizeof (UNICODE_NULL), lpblob); + code = ERROR_SUCCESS; + + goto DoExit; } else { - DWORD code = _r_path_ntpathfromdos (path_buff); + code = _r_path_ntpathfromdos (path, &ntPath); // file is inaccessible or not found, maybe low-level driver preventing file access? // try another way! @@ -1833,58 +1817,67 @@ DWORD _FwpmGetAppIdFromFileName1 (LPCWSTR path, FWP_BYTE_BLOB** lpblob, ENUM_TYP { if (PathIsRelative (path)) { - return code; + goto DoExit; } else { + WCHAR pathRoot[128]; + WCHAR pathSkipRoot[512]; + // file path (root) - WCHAR path_root[MAX_PATH]; - _r_str_copy (path_root, RTL_NUMBER_OF (path_root), path); - PathStripToRoot (path_root); + _r_str_copy (pathRoot, RTL_NUMBER_OF (pathRoot), path); + PathStripToRoot (pathRoot); // file path (without root) - WCHAR path_noroot[MAX_PATH]; - _r_str_copy (path_noroot, RTL_NUMBER_OF (path_noroot), PathSkipRoot (path)); + _r_str_copy (pathSkipRoot, RTL_NUMBER_OF (pathSkipRoot), PathSkipRoot (path)); + _r_str_tolower (pathSkipRoot); // lower is important! - path_buff = path_root; - code = _r_path_ntpathfromdos (path_buff); + code = _r_path_ntpathfromdos (pathRoot, &ntPath); if (code != ERROR_SUCCESS) - return code; + goto DoExit; - path_buff.Append (path_noroot); - - _r_str_tolower (path_buff.GetBuffer ()); // lower is important! + _r_obj_movereference (&originalPath, _r_format_string (L"%s%c%s", _r_obj_getstring (ntPath), OBJ_NAME_PATH_SEPARATOR, pathSkipRoot)); } } - else if (code != ERROR_SUCCESS) + else if (code == ERROR_SUCCESS) { - return code; + _r_obj_movereference (&originalPath, ntPath); + ntPath = NULL; + } + else + { + goto DoExit; + } - if (ByteBlobAlloc ((PVOID)path_buff.GetString (), (path_buff.GetLength () + 1) * sizeof (WCHAR), lpblob)) - return ERROR_SUCCESS; + ByteBlobAlloc (_r_obj_getstring (originalPath), _r_obj_getstringsize (originalPath) + sizeof (UNICODE_NULL), lpblob); } } else if (type == DataAppPico || type == DataAppDevice) { - path_buff = path; - if (type == DataAppDevice) - _r_str_tolower (path_buff.GetBuffer ()); // lower is important! + _r_str_tolower (originalPath); // lower is important! - if (ByteBlobAlloc ((PVOID)path_buff.GetString (), (path_buff.GetLength () + 1) * sizeof (WCHAR), lpblob)) - return ERROR_SUCCESS; + ByteBlobAlloc (_r_obj_getstring (originalPath), _r_obj_getstringsize (originalPath) + sizeof (UNICODE_NULL), lpblob); + code = ERROR_SUCCESS; + + goto DoExit; } - return ERROR_FILE_NOT_FOUND; +DoExit: + + if (originalPath) + _r_obj_dereference (originalPath); + + if (ntPath) + _r_obj_dereference (ntPath); + + return code; } -BOOLEAN ByteBlobAlloc (PVOID pdata, SIZE_T length, FWP_BYTE_BLOB** lpblob) +VOID ByteBlobAlloc (LPCVOID pdata, SIZE_T length, FWP_BYTE_BLOB** lpblob) { - if (!pdata || !length || !lpblob) - return FALSE; - FWP_BYTE_BLOB* pblob = (FWP_BYTE_BLOB*)_r_mem_allocatezero (sizeof (FWP_BYTE_BLOB)); pblob->data = (UINT8*)_r_mem_allocatezero (length); @@ -1893,8 +1886,6 @@ BOOLEAN ByteBlobAlloc (PVOID pdata, SIZE_T length, FWP_BYTE_BLOB** lpblob) RtlCopyMemory (pblob->data, pdata, length); *lpblob = pblob; - - return TRUE; } VOID ByteBlobFree (FWP_BYTE_BLOB** lpblob) diff --git a/src/wfp.hpp b/src/wfp.hpp index 6a989e94..4707b7bd 100644 --- a/src/wfp.hpp +++ b/src/wfp.hpp @@ -19,25 +19,25 @@ VOID _wfp_installfilters (HANDLE hengine); BOOLEAN _wfp_transact_start (HANDLE hengine, UINT line); BOOLEAN _wfp_transact_commit (HANDLE hengine, UINT line); -BOOLEAN _wfp_deletefilter (HANDLE hengine, const LPGUID pfilter_id); +BOOLEAN _wfp_deletefilter (HANDLE hengine, LPCGUID pfilter_id); DWORD _wfp_createfilter (HANDLE hengine, LPCWSTR name, FWPM_FILTER_CONDITION* lpcond, UINT32 count, UINT8 weight, const GUID* layer_id, const GUID* callout_id, FWP_ACTION_TYPE action, UINT32 flags, GUIDS_VEC* ptr_filters); VOID _wfp_clearfilter_ids (); VOID _wfp_destroyfilters (HANDLE hengine); -BOOLEAN _wfp_destroyfilters_array (HANDLE hengine, GUIDS_VEC& ptr_filters, UINT line); +BOOLEAN _wfp_destroyfilters_array (HANDLE hengine, GUIDS_VEC* ptr_filters, UINT line); -BOOLEAN _wfp_createrulefilter (HANDLE hengine, LPCWSTR name, SIZE_T app_hash, LPCWSTR rule_remote, LPCWSTR rule_local, UINT8 protocol, ADDRESS_FAMILY af, FWP_DIRECTION dir, UINT8 weight, FWP_ACTION_TYPE action, UINT32 flag, GUIDS_VEC* pmfarr); +BOOLEAN _wfp_createrulefilter (HANDLE hengine, LPCWSTR name, SIZE_T app_hash, PR_STRING rule_remote, PR_STRING rule_local, UINT8 protocol, ADDRESS_FAMILY af, FWP_DIRECTION dir, UINT8 weight, FWP_ACTION_TYPE action, UINT32 flag, GUIDS_VEC* pmfarr); -BOOLEAN _wfp_create4filters (HANDLE hengine, const OBJECTS_VEC& ptr_rules, UINT line, BOOLEAN is_intransact = FALSE); -BOOLEAN _wfp_create3filters (HANDLE hengine, const OBJECTS_VEC& ptr_apps, UINT line, BOOLEAN is_intransact = FALSE); +BOOLEAN _wfp_create4filters (HANDLE hengine, OBJECTS_RULE_VECTOR* ptr_rules, UINT line, BOOLEAN is_intransact = FALSE); +BOOLEAN _wfp_create3filters (HANDLE hengine, OBJECTS_APP_VECTOR* ptr_apps, UINT line, BOOLEAN is_intransact = FALSE); BOOLEAN _wfp_create2filters (HANDLE hengine, UINT line, BOOLEAN is_intransact = FALSE); -SIZE_T _wfp_dumpfilters (HANDLE hengine, const GUID* pprovider_id, GUIDS_VEC* ptr_filters); +SIZE_T _wfp_dumpfilters (HANDLE hengine, LPCGUID pprovider_id, GUIDS_VEC* ptr_filters); BOOLEAN _mps_firewallapi (PBOOLEAN pis_enabled, const PBOOLEAN pis_enable); VOID _mps_changeconfig2 (BOOLEAN is_enable); DWORD _FwpmGetAppIdFromFileName1 (LPCWSTR path, FWP_BYTE_BLOB** lpblob, ENUM_TYPE_DATA type); -BOOLEAN ByteBlobAlloc (const PVOID pdata, SIZE_T length, FWP_BYTE_BLOB** lpblob); +VOID ByteBlobAlloc (LPCVOID pdata, SIZE_T length, FWP_BYTE_BLOB** lpblob); VOID ByteBlobFree (FWP_BYTE_BLOB** lpblob);