Driver: Minor fixes.

This commit is contained in:
Nodir Temirkhodjaev 2021-01-23 16:20:00 +03:00
parent 237ea2a1b9
commit dbd92f17b1
2 changed files with 49 additions and 45 deletions

View File

@ -28,6 +28,22 @@ typedef struct fort_conf_exe_node
tommy_key_t path_hash; tommy_key_t path_hash;
} FORT_CONF_EXE_NODE, *PFORT_CONF_EXE_NODE; } FORT_CONF_EXE_NODE, *PFORT_CONF_EXE_NODE;
static FORT_TIME fort_current_time(void)
{
TIME_FIELDS tf;
LARGE_INTEGER system_time, local_time;
KeQuerySystemTime(&system_time);
ExSystemTimeToLocalTime(&system_time, &local_time);
RtlTimeToTimeFields(&local_time, &tf);
FORT_TIME time;
time.hour = (UCHAR) tf.Hour;
time.minute = (UCHAR) tf.Minute;
return time;
}
FORT_API void fort_device_conf_open(PFORT_DEVICE_CONF device_conf) FORT_API void fort_device_conf_open(PFORT_DEVICE_CONF device_conf)
{ {
KeInitializeSpinLock(&device_conf->ref_lock); KeInitializeSpinLock(&device_conf->ref_lock);
@ -344,7 +360,7 @@ FORT_API PFORT_CONF_REF fort_conf_ref_take(PFORT_DEVICE_CONF device_conf)
KeAcquireInStackQueuedSpinLock(&device_conf->ref_lock, &lock_queue); KeAcquireInStackQueuedSpinLock(&device_conf->ref_lock, &lock_queue);
{ {
conf_ref = device_conf->ref; conf_ref = device_conf->ref;
if (conf_ref) { if (conf_ref != NULL) {
++conf_ref->refcount; ++conf_ref->refcount;
} }
} }
@ -360,33 +376,34 @@ FORT_API FORT_CONF_FLAGS fort_conf_ref_set(PFORT_DEVICE_CONF device_conf, PFORT_
const PFORT_CONF_REF old_conf_ref = fort_conf_ref_take(device_conf); const PFORT_CONF_REF old_conf_ref = fort_conf_ref_take(device_conf);
if (old_conf_ref != NULL) {
old_conf_flags = old_conf_ref->conf.flags;
} else {
RtlZeroMemory(&old_conf_flags, sizeof(FORT_CONF_FLAGS));
old_conf_flags.prov_boot = fort_device_flag(device_conf, FORT_DEVICE_PROV_BOOT) != 0;
}
KeAcquireInStackQueuedSpinLock(&device_conf->ref_lock, &lock_queue); KeAcquireInStackQueuedSpinLock(&device_conf->ref_lock, &lock_queue);
{ {
device_conf->ref = conf_ref; FORT_CONF_FLAGS conf_flags;
if (old_conf_ref == NULL) { device_conf->ref = conf_ref;
RtlZeroMemory(&old_conf_flags, sizeof(FORT_CONF_FLAGS));
old_conf_flags.prov_boot = fort_device_flag(device_conf, FORT_DEVICE_PROV_BOOT) != 0;
}
if (conf_ref != NULL) { if (conf_ref != NULL) {
PFORT_CONF conf = &conf_ref->conf; PFORT_CONF conf = &conf_ref->conf;
const PFORT_CONF_FLAGS conf_flags = &conf->flags;
fort_device_flag_set(device_conf, FORT_DEVICE_PROV_BOOT, conf_flags->prov_boot); conf_flags = conf->flags;
fort_device_flag_set(device_conf, FORT_DEVICE_PROV_BOOT, conf_flags.prov_boot);
device_conf->conf_flags = *conf_flags;
} else { } else {
RtlZeroMemory((void *) &device_conf->conf_flags, sizeof(FORT_CONF_FLAGS)); RtlZeroMemory((void *) &conf_flags, sizeof(FORT_CONF_FLAGS));
conf_flags.prov_boot = fort_device_flag(device_conf, FORT_DEVICE_PROV_BOOT) != 0;
device_conf->conf_flags.prov_boot =
fort_device_flag(device_conf, FORT_DEVICE_PROV_BOOT) != 0;
} }
device_conf->conf_flags = conf_flags;
} }
KeReleaseInStackQueuedSpinLock(&lock_queue); KeReleaseInStackQueuedSpinLock(&lock_queue);
if (old_conf_ref != NULL) { if (old_conf_ref != NULL) {
old_conf_flags = old_conf_ref->conf.flags;
fort_conf_ref_put(device_conf, old_conf_ref); fort_conf_ref_put(device_conf, old_conf_ref);
} }
@ -428,42 +445,29 @@ FORT_API FORT_CONF_FLAGS fort_conf_ref_flags_set(
FORT_API BOOL fort_conf_ref_period_update(PFORT_DEVICE_CONF device_conf, BOOL force, int *periods_n) FORT_API BOOL fort_conf_ref_period_update(PFORT_DEVICE_CONF device_conf, BOOL force, int *periods_n)
{ {
FORT_TIME time;
BOOL res = FALSE;
/* Get current time */
{
TIME_FIELDS tf;
LARGE_INTEGER system_time, local_time;
KeQuerySystemTime(&system_time);
ExSystemTimeToLocalTime(&system_time, &local_time);
RtlTimeToTimeFields(&local_time, &tf);
time.hour = (UCHAR) tf.Hour;
time.minute = (UCHAR) tf.Minute;
}
PFORT_CONF_REF conf_ref = fort_conf_ref_take(device_conf); PFORT_CONF_REF conf_ref = fort_conf_ref_take(device_conf);
if (conf_ref != NULL) { if (conf_ref == NULL)
PFORT_CONF conf = &conf_ref->conf; return FALSE;
if (conf->app_periods_n != 0) { BOOL res = FALSE;
const UINT16 period_bits = fort_conf_app_period_bits(conf, time, periods_n); PFORT_CONF conf = &conf_ref->conf;
if (force || device_conf->conf_flags.group_bits != period_bits) { if (conf->app_periods_n != 0) {
device_conf->conf_flags.group_bits = period_bits; const FORT_TIME time = fort_current_time();
const UINT16 period_bits = fort_conf_app_period_bits(conf, time, periods_n);
fort_conf_app_perms_mask_init(conf, period_bits); if (force || device_conf->conf_flags.group_bits != period_bits) {
device_conf->conf_flags.group_bits = period_bits;
res = TRUE; fort_conf_app_perms_mask_init(conf, period_bits);
}
res = TRUE;
} }
fort_conf_ref_put(device_conf, conf_ref);
} }
fort_conf_ref_put(device_conf, conf_ref);
return res; return res;
} }

View File

@ -649,13 +649,14 @@ static NTSTATUS fort_callout_force_reauth(
fort_prov_trans_begin(engine); fort_prov_trans_begin(engine);
/* Check provider filters */ /* Check provider filters */
BOOL prov_recreated = FALSE;
if (old_conf_flags.prov_boot != conf_flags.prov_boot) { if (old_conf_flags.prov_boot != conf_flags.prov_boot) {
fort_prov_unregister(engine); fort_prov_unregister(engine);
if ((status = fort_prov_register(engine, conf_flags.prov_boot))) if ((status = fort_prov_register(engine, conf_flags.prov_boot)))
goto cleanup; goto cleanup;
goto stat_prov; prov_recreated = TRUE;
} }
/* Check flow filter */ /* Check flow filter */
@ -667,13 +668,12 @@ static NTSTATUS fort_callout_force_reauth(
fort_device_flag(&g_device->conf, FORT_DEVICE_FILTER_TRANSPORT) != 0; fort_device_flag(&g_device->conf, FORT_DEVICE_FILTER_TRANSPORT) != 0;
const BOOL filter_transport = (conf_flags.group_bits & filter_bits) != 0; const BOOL filter_transport = (conf_flags.group_bits & filter_bits) != 0;
if (old_conf_flags.log_stat != conf_flags.log_stat if (prov_recreated || old_conf_flags.log_stat != conf_flags.log_stat
|| old_filter_transport != filter_transport) { || old_filter_transport != filter_transport) {
fort_device_flag_set(&g_device->conf, FORT_DEVICE_FILTER_TRANSPORT, filter_transport); fort_device_flag_set(&g_device->conf, FORT_DEVICE_FILTER_TRANSPORT, filter_transport);
fort_prov_flow_unregister(engine); fort_prov_flow_unregister(engine);
stat_prov:
if (conf_flags.log_stat) { if (conf_flags.log_stat) {
if ((status = fort_prov_flow_register(engine, filter_transport))) if ((status = fort_prov_flow_register(engine, filter_transport)))
goto cleanup; goto cleanup;