diff --git a/src/main.cpp b/src/main.cpp index d532237b..4840b987 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -76,7 +76,6 @@ void CALLBACK _app_timer_callback (PVOID lparam, BOOLEAN); void _app_timer_create (HWND hwnd, const MFILTER_APPS* ptr_apps, time_t seconds); size_t _app_timer_remove (HWND hwnd, const MFILTER_APPS* ptr_apps); -bool _app_istimeractive (ITEM_APP const *ptr_app); bool _app_isunused (ITEM_APP const *ptr_app, size_t hash); bool _app_isexists (ITEM_APP const *ptr_app); @@ -92,15 +91,14 @@ bool _wfp_logunsubscribe (); bool _wfp_isfiltersinstalled (); bool _wfp_destroy2filters (const MARRAY* pmar, UINT line); -void _app_logerror (LPCWSTR fn, DWORD code, LPCWSTR desc, bool is_nopopups) +void _app_logerror (LPCWSTR fn, DWORD errcode, LPCWSTR desc, bool is_nopopups) { - _r_dbg_write (APP_NAME_SHORT, APP_VERSION, fn, code, desc); + _r_dbg (fn, errcode, desc); if (!is_nopopups && app.ConfigGet (L"IsErrorNotificationsEnabled", true).AsBool ()) // check for timeout (sec.) { - config.is_popuperrors = true; - - app.TrayPopup (app.GetHWND (), UID, nullptr, NIIF_USER | (app.ConfigGet (L"IsNotificationsSound", true).AsBool () ? 0 : NIIF_NOSOUND), APP_NAME, app.LocaleString (IDS_STATUS_ERROR, nullptr)); + // static time_t last_popup; + app.TrayPopup (app.GetHWND (), UID, nullptr, NIIF_ERROR | (app.ConfigGet (L"IsNotificationsSound", true).AsBool () ? 0 : NIIF_NOSOUND), APP_NAME, app.LocaleString (IDS_STATUS_ERROR, nullptr)); } } @@ -156,13 +154,10 @@ bool _mps_firewallapi (bool* pis_enabled, const bool* pis_enable) hr = pNetFwPolicy2->put_FirewallEnabled (profileTypes[i], *pis_enable ? VARIANT_TRUE : VARIANT_FALSE); if (SUCCEEDED (hr)) - { result = true; - } + else - { _app_logerror (L"put_FirewallEnabled", hr, _r_fmt (L"%d", profileTypes[i]), true); - } } } } @@ -258,9 +253,7 @@ void _mps_changeconfig2 (bool is_enable) if (ssp.dwCurrentState != SERVICE_RUNNING) { if (!StartService (sc, 0, nullptr)) - { _app_logerror (L"StartService", GetLastError (), arr[i], false); - } } CloseServiceHandle (sc); @@ -541,6 +534,30 @@ size_t _app_getruleicon (PITEM_RULE const ptr_rule) return ptr_rule->is_block ? 1 : 0; } +bool _app_istimeractive (ITEM_APP const *ptr_app) +{ + return ptr_app->htimer || (ptr_app->timer && (ptr_app->timer > _r_unixtime_now ())); +} + +bool _app_istimersactive () +{ + _r_fastlock_acquireshared (&lock_access); + + for (auto &p : apps) + { + if (_app_istimeractive (&p.second)) + { + _r_fastlock_releaseshared (&lock_access); + + return true; + } + } + + _r_fastlock_releaseshared (&lock_access); + + return false; +} + void ShowItem (HWND hwnd, UINT ctrl_id, size_t item, INT scroll_pos) { if (item != LAST_VALUE) @@ -2065,30 +2082,6 @@ bool _app_isexists (ITEM_APP const *ptr_app) return true; } -bool _app_istimeractive (ITEM_APP const *ptr_app) -{ - return ptr_app->htimer || (ptr_app->timer && (ptr_app->timer > _r_unixtime_now ())); -} - -bool _app_istimersactive () -{ - _r_fastlock_acquireshared (&lock_access); - - for (auto &p : apps) - { - if (_app_istimeractive (&p.second)) - { - _r_fastlock_releaseshared (&lock_access); - - return true; - } - } - - _r_fastlock_releaseshared (&lock_access); - - return false; -} - COLORREF _app_getcolor (size_t hash, bool is_excludesilent) { _r_fastlock_acquireshared (&lock_access); @@ -3664,39 +3657,36 @@ void _app_profile_loadrules (HWND hwnd, LPCWSTR path, LPCWSTR path_backup, bool pugi::xml_node root; pugi::xml_parse_result result_original = doc_original.load_file (path, PUGIXML_LOAD_FLAGS, PUGIXML_LOAD_ENCODING); - //if (!result) + // if file not found or parsing error, load from backup + if (path_backup) { - // if file not found or parsing error, load from backup - if (path_backup) + if (is_internal) { - if (is_internal) + DWORD size = 0; + const LPVOID buffer = _app_loadresource (path_backup, &size); + + pugi::xml_parse_result result_backup; + + if (buffer) + result_backup = doc_backup.load_buffer (buffer, size, PUGIXML_LOAD_FLAGS, PUGIXML_LOAD_ENCODING); + + if (result_backup && (!result_original || doc_backup.child (L"root").attribute (L"timestamp").as_ullong () > doc_original.child (L"root").attribute (L"timestamp").as_ullong ())) { - DWORD size = 0; - const LPVOID buffer = _app_loadresource (path_backup, &size); - - pugi::xml_parse_result result_backup; - - if (buffer) - result_backup = doc_backup.load_buffer (buffer, size, PUGIXML_LOAD_FLAGS, PUGIXML_LOAD_ENCODING); - - if (result_backup && (!result_original || doc_backup.child (L"root").attribute (L"timestamp").as_ullong () > doc_original.child (L"root").attribute (L"timestamp").as_ullong ())) - { - root = doc_backup.child (L"root"); - result_original = result_backup; - } - } - else - { - if (!result_original && _r_fs_exists (path_backup)) - result_original = doc_original.load_file (path_backup, PUGIXML_LOAD_FLAGS, PUGIXML_LOAD_ENCODING); + root = doc_backup.child (L"root"); + result_original = result_backup; } } - - // show only syntax, memory and i/o errors... - if (!result_original && result_original.status != pugi::status_file_not_found) - _app_logerror (L"pugi::load_file", 0, _r_fmt (L"status: %d,offset: %d,text: %s,file: %s", result_original.status, result_original.offset, rstring (result_original.description ()).GetString (), path), false); + else + { + if (!result_original && _r_fs_exists (path_backup)) + result_original = doc_original.load_file (path_backup, PUGIXML_LOAD_FLAGS, PUGIXML_LOAD_ENCODING); + } } + // show only syntax, memory and i/o errors... + if (!result_original && result_original.status != pugi::status_file_not_found) + _app_logerror (L"pugi::load_file", 0, _r_fmt (L"status: %d,offset: %d,text: %s,file: %s", result_original.status, result_original.offset, rstring (result_original.description ()).GetString (), path), false); + if (result_original) { if (!root) @@ -4080,7 +4070,7 @@ void _app_profile_save (HWND /*hwnd*/, LPCWSTR path_apps = nullptr, LPCWSTR path { PITEM_APP const ptr_app = &p.second; - if (ptr_app && ptr_app->original_path) + if (ptr_app->original_path) { item.append_attribute (L"path").set_value (ptr_app->original_path); @@ -5272,8 +5262,6 @@ void _app_timer_create (HWND hwnd, const MFILTER_APPS* ptr_apps, time_t seconds) const time_t current_time = _r_unixtime_now (); - _wfp_create3filters (ptr_apps, __LINE__); - for (size_t i = 0; i < ptr_apps->size (); i++) { PITEM_APP ptr_app = ptr_apps->at (i); @@ -5287,6 +5275,9 @@ void _app_timer_create (HWND hwnd, const MFILTER_APPS* ptr_apps, time_t seconds) ptr_app->htimer = nullptr; } + if (ptr_app->timer) + ptr_app->timer = 0; + const size_t hash = _r_str_hash (ptr_app->original_path); // note: be carefull (!) if (CreateTimerQueueTimer (&ptr_app->htimer, config.htimer, &_app_timer_callback, (PVOID)hash, DWORD (seconds * _R_SECONDSCLOCK_MSEC), 0, WT_EXECUTEONLYONCE | WT_EXECUTEINTIMERTHREAD)) @@ -5307,6 +5298,8 @@ void _app_timer_create (HWND hwnd, const MFILTER_APPS* ptr_apps, time_t seconds) } } } + + _wfp_create3filters (ptr_apps, __LINE__); } size_t _app_timer_remove (HWND hwnd, const MFILTER_APPS* ptr_apps) @@ -5668,120 +5661,16 @@ bool _app_notifycommand (HWND hwnd, UINT ctrl_id, size_t timer_idx) { if (ctrl_id == IDC_ALLOW_BTN || ctrl_id == IDC_BLOCK_BTN) { - // just create rule - //if (is_createaddrrule || is_createportrule) - //{ - // LPWSTR prule = nullptr; + ptr_app->is_enabled = (ctrl_id == IDC_ALLOW_BTN); - // if (is_createaddrrule) - // { - // _app_formataddress (ptr_log, FWP_DIRECTION_OUTBOUND, is_createportrule ? ptr_log->remote_port : 0, &prule, false); - // } - // else if (is_createportrule) - // { - // prule = new WCHAR[16]; + if (ctrl_id == IDC_BLOCK_BTN) + ptr_app->is_silent = true; - // if (prule) - // StringCchPrintf (prule, 15, L"%d", ptr_log->remote_port); - // } + _r_fastlock_acquireexclusive (&lock_checkbox); - // if (prule) - // { - // size_t rule_id = LAST_VALUE; + _r_listview_setitemcheck (app.GetHWND (), IDC_LISTVIEW, item, ptr_app->is_enabled); - // const size_t length = _r_str_length (prule); - // const size_t rule_length = min (length, RULE_RULE_CCH_MAX); - - // for (size_t i = 0; i < rules_arr.size (); i++) - // { - // PITEM_RULE ptr_rule = rules_arr.at (i); - - // if (ptr_rule && ptr_rule->type == TypeCustom && ptr_rule->prule_remote && (!ptr_rule->protocol || ptr_rule->protocol == ptr_log->protocol)) - // { - // if ((!ptr_rule->is_block && ctrl_id == IDC_ALLOW_BTN) || (ptr_rule->is_block && ctrl_id == IDC_BLOCK_BTN)) - // { - // rstring::rvector rule_remote_arr = rstring (ptr_rule->prule_remote).AsVector (RULE_DELIMETER); - - // for (size_t j = 0; j < rule_remote_arr.size (); j++) - // { - // if (_wcsnicmp (rule_remote_arr.at (j), prule, rule_length) == 0) - // { - // rule_id = i; - // break; - // } - // } - // } - - // if (rule_id != LAST_VALUE) - // break; - // } - // } - - // if (rule_id != LAST_VALUE) - // { - // // modify rule - // PITEM_RULE ptr_rule = rules_arr.at (rule_id); - - // if (ptr_rule) - // { - // ptr_rule->weight = (ptr_rule->is_block ? FILTER_WEIGHT_CUSTOM_BLOCK : FILTER_WEIGHT_CUSTOM); - // ptr_rule->is_block = ((ctrl_id == IDC_BLOCK_BTN) ? true : false); - - // _app_ruleenable (ptr_rule, true); - // } - // } - // else - // { - // // create rule - // PITEM_RULE ptr_rule = new ITEM_RULE; - - // if (ptr_rule) - // { - // const size_t name_length = min (length, (size_t)RULE_NAME_CCH_MAX); - - // _r_str_alloc (&ptr_rule->pname, name_length, prule); - // _r_str_alloc (&ptr_rule->prule_remote, rule_length, prule); - - // ptr_rule->protocol = ptr_log->protocol; - // ptr_rule->dir = ptr_log->direction; - // ptr_rule->type = TypeCustom; - // ptr_rule->weight = (ptr_rule->is_block ? FILTER_WEIGHT_CUSTOM_BLOCK : FILTER_WEIGHT_CUSTOM); - // ptr_rule->is_block = ((ctrl_id == IDC_BLOCK_BTN) ? true : false); - - // _app_ruleenable (ptr_rule, true); - - // rules_arr.push_back (ptr_rule); - // rule_id = rules_arr.size () - 1; - // } - // } - - // // add rule for app - // if (rule_id != LAST_VALUE) - // { - // rules_arr.at (rule_id)->apps[hash] = true; - - // MFILTER_RULES rules; - // rules.push_back (rules_arr.at (rule_id)); - - // _wfp_create4filters (&rules, __LINE__); - // } - - // SAFE_DELETE_ARRAY (prule); - // } - //} - //else - { - ptr_app->is_enabled = (ctrl_id == IDC_ALLOW_BTN); - - if (ctrl_id == IDC_BLOCK_BTN) - ptr_app->is_silent = true; - - _r_fastlock_acquireexclusive (&lock_checkbox); - - _r_listview_setitemcheck (app.GetHWND (), IDC_LISTVIEW, item, ptr_app->is_enabled); - - _r_fastlock_releaseexclusive (&lock_checkbox); - } + _r_fastlock_releaseexclusive (&lock_checkbox); MFILTER_APPS rules; rules.push_back (ptr_app); @@ -5802,7 +5691,7 @@ bool _app_notifycommand (HWND hwnd, UINT ctrl_id, size_t timer_idx) } else if (ctrl_id == IDC_LATER_BTN) { - // todo + // TODO } ptr_app->last_notify = _r_unixtime_now (); @@ -9375,12 +9264,21 @@ void _app_generate_rulesmenu (HMENU hsubmenu, size_t app_hash) static HBITMAP hbmp_allow = nullptr; static HBITMAP hbmp_block = nullptr; + static HBITMAP hbmp_checked = nullptr; + static HBITMAP hbmp_unchecked = nullptr; + if (!hbmp_allow) hbmp_allow = _app_ico2bmp (app.GetSharedIcon (app.GetHINSTANCE (), IDI_ALLOW, GetSystemMetrics (SM_CXSMICON))); if (!hbmp_block) hbmp_block = _app_ico2bmp (app.GetSharedIcon (app.GetHINSTANCE (), IDI_BLOCK, GetSystemMetrics (SM_CXSMICON))); + if (!hbmp_checked) + hbmp_checked = _app_ico2bmp (app.GetSharedIcon (app.GetHINSTANCE (), IDI_CHECKED, GetSystemMetrics (SM_CXSMICON))); + + if (!hbmp_unchecked) + hbmp_unchecked = _app_ico2bmp (app.GetSharedIcon (app.GetHINSTANCE (), IDI_UNCHECKED, GetSystemMetrics (SM_CXSMICON))); + if (!_app_isrulesexists (TypeCustom, -1)) { AppendMenu (hsubmenu, MF_SEPARATOR, 0, nullptr); @@ -9428,10 +9326,12 @@ void _app_generate_rulesmenu (HMENU hsubmenu, size_t app_hash) MENUITEMINFO mii = {0}; mii.cbSize = sizeof (mii); - mii.fMask = MIIM_ID | MIIM_FTYPE | MIIM_STATE | MIIM_BITMAP | MIIM_STRING; + mii.fMask = MIIM_ID | MIIM_FTYPE | MIIM_STATE | MIIM_STRING | MIIM_BITMAP | MIIM_CHECKMARKS; mii.fType = MFT_STRING; - mii.hbmpItem = ptr_rule->is_block ? hbmp_block : hbmp_allow; mii.dwTypeData = buffer; + mii.hbmpItem = ptr_rule->is_block ? hbmp_block : hbmp_allow; + mii.hbmpChecked = hbmp_checked; + mii.hbmpUnchecked = hbmp_unchecked; mii.fState = (is_checked ? MF_CHECKED : MF_UNCHECKED); mii.wID = IDX_RULES_SPECIAL + UINT (i); @@ -9595,7 +9495,7 @@ LRESULT CALLBACK NotificationProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lp _r_dc_fillrect (hdc, &rc, NOTIFY_CLR_TITLE_BG); for (INT i = 0; i < _R_RECT_WIDTH (&rc); i++) - SetPixel (hdc, i, rc.bottom, _R_COLOR_SHADE (NOTIFY_CLR_TITLE_BG, 90)); + SetPixel (hdc, i, rc.bottom, _r_dc_getcolorshade (NOTIFY_CLR_TITLE_BG, 90)); DrawFrameBorder (hdc, hwnd, NOTIFY_CLR_BORDER); @@ -10807,24 +10707,6 @@ INT_PTR CALLBACK DlgProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) break; } - case NIN_BALLOONUSERCLICK: - { - if (config.is_popuperrors) - { - PostMessage (hwnd, WM_COMMAND, MAKEWPARAM (IDM_TRAY_LOGSHOW_ERR, 0), 0); - config.is_popuperrors = false; - } - - break; - } - - case NIN_BALLOONHIDE: - case NIN_BALLOONTIMEOUT: - { - config.is_popuperrors = false; - break; - } - case WM_MBUTTONUP: { PostMessage (hwnd, WM_COMMAND, MAKEWPARAM (IDM_LOGSHOW, 0), 0); @@ -10939,7 +10821,7 @@ INT_PTR CALLBACK DlgProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) } } - if (_r_fs_exists (_r_dbg_getpath (APP_NAME_SHORT))) + if (_r_fs_exists (_r_dbg_getpath ())) { app.LocaleMenu (hsubmenu, IDS_LOGSHOW, IDM_TRAY_LOGSHOW_ERR, false, nullptr); app.LocaleMenu (hsubmenu, IDS_LOGCLEAR, IDM_TRAY_LOGCLEAR_ERR, false, nullptr); @@ -11606,19 +11488,17 @@ INT_PTR CALLBACK DlgProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) case IDM_TRAY_LOGSHOW_ERR: { - const rstring path = _r_dbg_getpath (APP_NAME_SHORT); + static const rstring path = _r_dbg_getpath (); - if (!_r_fs_exists (path)) - return FALSE; - - _r_run (nullptr, _r_fmt (L"%s \"%s\"", _app_getlogviewer ().GetString (), path.GetString ())); + if (_r_fs_exists (path)) + _r_run (nullptr, _r_fmt (L"%s \"%s\"", _app_getlogviewer ().GetString (), path.GetString ())); break; } case IDM_TRAY_LOGCLEAR_ERR: { - const rstring path = _r_dbg_getpath (APP_NAME_SHORT); + static const rstring path = _r_dbg_getpath (); if (!_r_fs_exists (path) || !app.ConfirmMessage (hwnd, nullptr, app.LocaleString (IDS_QUESTION, nullptr), L"ConfirmLogClear")) break; @@ -12053,6 +11933,13 @@ INT_PTR CALLBACK DlgProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) break; } +#if defined(_APP_BETA) || defined(_APP_BETA_RC) + case 998: + { + _app_logerror (L"FwpmEngineOpen", 2, nullptr, false); + break; + } + case 999: { #define ID_AD 17 @@ -12090,6 +11977,7 @@ INT_PTR CALLBACK DlgProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) break; } +#endif // _APP_BETA || _APP_BETA_RC } break; diff --git a/src/main.hpp b/src/main.hpp index 5450128f..47ad5d15 100644 --- a/src/main.hpp +++ b/src/main.hpp @@ -271,7 +271,6 @@ struct STATIC_DATA size_t icon_package_id = 0; size_t icon_service_id = 0; - bool is_popuperrors = false; bool is_notifytimeout = false; bool is_notifymouse = false; bool is_wsainit = false; diff --git a/src/res/checked.ico b/src/res/checked.ico new file mode 100644 index 00000000..e08e73d9 Binary files /dev/null and b/src/res/checked.ico differ diff --git a/src/res/unchecked.ico b/src/res/unchecked.ico new file mode 100644 index 00000000..f2ebc158 Binary files /dev/null and b/src/res/unchecked.ico differ diff --git a/src/resource.hpp b/src/resource.hpp index d685d76e..0a41a89e 100644 --- a/src/resource.hpp +++ b/src/resource.hpp @@ -468,6 +468,8 @@ #define IDI_MENU 104 #define IDI_TIMER 105 #define IDI_CLOSE 106 -#define IDI_MENU2 107 +#define IDI_CHECKED 107 +#define IDI_UNCHECKED 108 +#define IDI_MENU2 109 #endif // __RESOURCE_H__ diff --git a/src/resource.rc b/src/resource.rc index 398f1368..c011993b 100644 --- a/src/resource.rc +++ b/src/resource.rc @@ -32,6 +32,7 @@ BEGIN VK_F4, IDM_EXIT, ALT, VIRTKEY VK_F5, IDM_REFRESH, VIRTKEY VK_F11, IDM_ZOOM, VIRTKEY + VK_F6, 998, CONTROL, VIRTKEY VK_F6, 999, VIRTKEY END @@ -703,6 +704,8 @@ IDI_BLOCK ICON "res\\block_btn.ico" IDI_MENU ICON "res\\menu_btn.ico" IDI_TIMER ICON "res\\timer_btn.ico" IDI_CLOSE ICON "res\\close_btn.ico" +IDI_CHECKED ICON "res\\checked.ico" +IDI_UNCHECKED ICON "res\\unchecked.ico" //IDI_MENU2 ICON "res\\menu_btn2.ico" //