diff --git a/src/global.h b/src/global.h index ccd29da3..b83e4a24 100644 --- a/src/global.h +++ b/src/global.h @@ -57,6 +57,7 @@ DECLSPEC_SELECTANY R_SPINLOCK lock_apply; DECLSPEC_SELECTANY R_SPINLOCK lock_checkbox; DECLSPEC_SELECTANY R_SPINLOCK lock_logbusy; DECLSPEC_SELECTANY R_SPINLOCK lock_logthread; +DECLSPEC_SELECTANY R_SPINLOCK lock_network; DECLSPEC_SELECTANY R_SPINLOCK lock_profile; DECLSPEC_SELECTANY R_SPINLOCK lock_transaction; diff --git a/src/helper.c b/src/helper.c index da4679eb..500e8855 100644 --- a/src/helper.c +++ b/src/helper.c @@ -1669,7 +1669,7 @@ BOOLEAN _app_isvalidconnection (ADDRESS_FAMILY af, LPCVOID paddr) return FALSE; } -VOID _app_generate_connections (_Inout_ PR_HASHTABLE checker_map) +VOID _app_generate_connections (_Inout_ PR_HASHTABLE result_map, _Inout_ PR_HASHTABLE checker_map) { _r_obj_clearhashtable (checker_map); @@ -1705,7 +1705,7 @@ VOID _app_generate_connections (_Inout_ PR_HASHTABLE checker_map) network.network_hash = _app_getnetworkhash (AF_INET, tcp4_table->table[i].dwOwningPid, &remote_addr, tcp4_table->table[i].dwRemotePort, &local_addr, tcp4_table->table[i].dwLocalPort, IPPROTO_TCP, tcp4_table->table[i].dwState); - if (_r_obj_findhashtable (network_map, network.network_hash)) + if (_r_obj_findhashtable (result_map, network.network_hash)) { _app_addcachetable (checker_map, network.network_hash, NULL, 0); @@ -1734,7 +1734,11 @@ VOID _app_generate_connections (_Inout_ PR_HASHTABLE checker_map) network.is_connection = TRUE; } - _r_obj_addhashtableitem (network_map, network.network_hash, &network); + _r_spinlock_acquireexclusive (&lock_network); + + _r_obj_addhashtableitem (result_map, network.network_hash, &network); + + _r_spinlock_releaseexclusive (&lock_network); _app_addcachetable (checker_map, network.network_hash, NULL, 1); } @@ -1762,7 +1766,7 @@ VOID _app_generate_connections (_Inout_ PR_HASHTABLE checker_map) network.network_hash = _app_getnetworkhash (AF_INET6, tcp6_table->table[i].dwOwningPid, tcp6_table->table[i].ucRemoteAddr, tcp6_table->table[i].dwRemotePort, tcp6_table->table[i].ucLocalAddr, tcp6_table->table[i].dwLocalPort, IPPROTO_TCP, tcp6_table->table[i].dwState); - if (_r_obj_findhashtable (network_map, network.network_hash)) + if (_r_obj_findhashtable (result_map, network.network_hash)) { _app_addcachetable (checker_map, network.network_hash, NULL, 0); @@ -1791,7 +1795,11 @@ VOID _app_generate_connections (_Inout_ PR_HASHTABLE checker_map) network.is_connection = TRUE; } - _r_obj_addhashtableitem (network_map, network.network_hash, &network); + _r_spinlock_acquireexclusive (&lock_network); + + _r_obj_addhashtableitem (result_map, network.network_hash, &network); + + _r_spinlock_releaseexclusive (&lock_network); _app_addcachetable (checker_map, network.network_hash, NULL, 1); } @@ -1822,7 +1830,7 @@ VOID _app_generate_connections (_Inout_ PR_HASHTABLE checker_map) network.network_hash = _app_getnetworkhash (AF_INET, udp4_table->table[i].dwOwningPid, NULL, 0, &local_addr, udp4_table->table[i].dwLocalPort, IPPROTO_UDP, 0); - if (_r_obj_findhashtable (network_map, network.network_hash)) + if (_r_obj_findhashtable (result_map, network.network_hash)) { _app_addcachetable (checker_map, network.network_hash, NULL, 0); @@ -1843,7 +1851,11 @@ VOID _app_generate_connections (_Inout_ PR_HASHTABLE checker_map) if (_app_isvalidconnection (network.af, &network.local_addr)) network.is_connection = TRUE; - _r_obj_addhashtableitem (network_map, network.network_hash, &network); + _r_spinlock_acquireexclusive (&lock_network); + + _r_obj_addhashtableitem (result_map, network.network_hash, &network); + + _r_spinlock_releaseexclusive (&lock_network); _app_addcachetable (checker_map, network.network_hash, NULL, 1); } @@ -1871,7 +1883,7 @@ VOID _app_generate_connections (_Inout_ PR_HASHTABLE checker_map) network.network_hash = _app_getnetworkhash (AF_INET6, udp6_table->table[i].dwOwningPid, NULL, 0, udp6_table->table[i].ucLocalAddr, udp6_table->table[i].dwLocalPort, IPPROTO_UDP, 0); - if (_r_obj_findhashtable (network_map, network.network_hash)) + if (_r_obj_findhashtable (result_map, network.network_hash)) { _app_addcachetable (checker_map, network.network_hash, NULL, 0); @@ -1892,7 +1904,11 @@ VOID _app_generate_connections (_Inout_ PR_HASHTABLE checker_map) if (_app_isvalidconnection (network.af, &network.local_addr6)) network.is_connection = TRUE; - _r_obj_addhashtableitem (network_map, network.network_hash, &network); + _r_spinlock_acquireexclusive(&lock_network); + + _r_obj_addhashtableitem (result_map, network.network_hash, &network); + + _r_spinlock_releaseexclusive (&lock_network); _app_addcachetable (checker_map, network.network_hash, NULL, 1); } diff --git a/src/helper.h b/src/helper.h index 86e47fd3..bee7328a 100644 --- a/src/helper.h +++ b/src/helper.h @@ -50,7 +50,7 @@ PR_STRING _app_getdirectionname (_In_ FWP_DIRECTION direction, _In_ BOOLEAN is_l COLORREF _app_getcolorvalue (_In_ SIZE_T color_hash); -VOID _app_generate_connections (_Inout_ PR_HASHTABLE checker_map); +VOID _app_generate_connections (_Inout_ PR_HASHTABLE result_map, _Inout_ PR_HASHTABLE checker_map); VOID _app_generate_packages (); VOID _app_generate_services (); diff --git a/src/main.c b/src/main.c index 65465a49..885e17a0 100644 --- a/src/main.c +++ b/src/main.c @@ -79,7 +79,7 @@ THREAD_API NetworkMonitorThread (_In_ PVOID lparam) while (TRUE) { - _app_generate_connections (checker_map); + _app_generate_connections (network_map, checker_map); is_highlighting_enabled = _r_config_getboolean (L"IsEnableHighlighting", TRUE) && _r_config_getbooleanex (L"IsHighlightConnection", TRUE, L"colors"); current_listview_id = (INT)_r_tab_getitemlparam (hwnd, IDC_TAB, -1); @@ -168,8 +168,12 @@ THREAD_API NetworkMonitorThread (_In_ PVOID lparam) SIZE_T app_hash = _app_getnetworkapp (network_hash); + _r_spinlock_acquireexclusive (&lock_network); + _r_obj_removehashtableentry (network_map, network_hash); + _r_spinlock_releaseexclusive (&lock_network); + // redraw listview item if (app_hash) { @@ -1695,6 +1699,7 @@ VOID _app_initialize () _r_spinlock_initialize (&lock_checkbox); _r_spinlock_initialize (&lock_logbusy); _r_spinlock_initialize (&lock_logthread); + _r_spinlock_initialize (&lock_network); _r_spinlock_initialize (&lock_profile); _r_spinlock_initialize (&lock_transaction);