You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
2.4 KiB
122 lines
2.4 KiB
#include "SettingsMonitor.h" |
|
|
|
DWORD WINAPI MonitorSettings(SettingsChangeParameters* params) |
|
{ |
|
BOOL bShouldExit = FALSE; |
|
HANDLE* handles = NULL; |
|
while (TRUE) |
|
{ |
|
handles = calloc(sizeof(HANDLE), params->size); |
|
if (handles) |
|
{ |
|
for (unsigned int i = 0; i < params->size; ++i) |
|
{ |
|
if (i == 0) |
|
{ |
|
if (params->settings[i].hEvent) |
|
{ |
|
handles[i] = params->settings[i].hEvent; |
|
continue; |
|
} |
|
else |
|
{ |
|
free(handles); |
|
free(params->settings); |
|
free(params); |
|
return 0; |
|
} |
|
} |
|
params->settings[i].hEvent = CreateEventW(NULL, FALSE, FALSE, NULL); |
|
if (!params->settings[i].hEvent) |
|
{ |
|
free(handles); |
|
free(params->settings); |
|
free(params); |
|
return 0; |
|
} |
|
handles[i] = params->settings[i].hEvent; |
|
if (RegCreateKeyExW( |
|
params->settings[i].origin, |
|
params->settings[i].name, |
|
0, |
|
NULL, |
|
REG_OPTION_NON_VOLATILE, |
|
KEY_READ, |
|
NULL, |
|
&(params->settings[i].hKey), |
|
NULL |
|
) != ERROR_SUCCESS) |
|
{ |
|
free(handles); |
|
free(params->settings); |
|
free(params); |
|
return 0; |
|
} |
|
if (RegNotifyChangeKeyValue( |
|
params->settings[i].hKey, |
|
FALSE, |
|
REG_NOTIFY_CHANGE_LAST_SET, |
|
params->settings[i].hEvent, |
|
TRUE |
|
) != ERROR_SUCCESS) |
|
{ |
|
free(handles); |
|
free(params->settings); |
|
free(params); |
|
return 0; |
|
} |
|
} |
|
DWORD dwRes = WaitForMultipleObjects( |
|
params->size, |
|
handles, |
|
FALSE, |
|
INFINITE |
|
); |
|
if (dwRes != WAIT_FAILED) |
|
{ |
|
unsigned int i = dwRes - WAIT_OBJECT_0; |
|
if (i >= 1 && i < params->size) |
|
{ |
|
params->settings[i].callback(params->settings[i].data); |
|
} |
|
else if (i == 0) |
|
{ |
|
bShouldExit = TRUE; |
|
} |
|
for (unsigned int j = 1; j < params->size; ++j) |
|
{ |
|
if (WaitForSingleObject(handles[j], 0) == WAIT_OBJECT_0) |
|
{ |
|
params->settings[j].callback(params->settings[j].data); |
|
} |
|
} |
|
} |
|
free(handles); |
|
for (unsigned int i = 1; i < params->size; ++i) |
|
{ |
|
if (params->settings[i].hEvent) |
|
{ |
|
CloseHandle(params->settings[i].hEvent); |
|
} |
|
if (params->settings[i].hKey) |
|
{ |
|
RegCloseKey(params->settings[i].hKey); |
|
} |
|
} |
|
if (bShouldExit) |
|
{ |
|
break; |
|
} |
|
} |
|
else |
|
{ |
|
free(params->settings); |
|
free(params); |
|
return 0; |
|
} |
|
} |
|
free(params->settings); |
|
free(params); |
|
return 0; |
|
} |
|
|
|
|