X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/d5859615f641e5bbd853cd42aafd4fa577da17eb..1408a8777732536ede3b60bf21c8606af2782339:/noise.c diff --git a/noise.c b/noise.c index 88b13a97..c5966a71 100644 --- a/noise.c +++ b/noise.c @@ -11,6 +11,12 @@ #include "storage.h" /* + * GetSystemPowerStatus function. + */ +typedef BOOL (WINAPI *gsps_t)(LPSYSTEM_POWER_STATUS); +static gsps_t gsps; + +/* * This function is called once, at PuTTY startup, and will do some * seriously silly things like listing directories and getting disk * free space and a process snapshot. @@ -20,6 +26,7 @@ void noise_get_heavy(void (*func) (void *, int)) { HANDLE srch; WIN32_FIND_DATA finddata; char winpath[MAX_PATH+3]; + HMODULE mod; GetWindowsDirectory(winpath, sizeof(winpath)); strcat(winpath, "\\*"); @@ -32,6 +39,12 @@ void noise_get_heavy(void (*func) (void *, int)) { } read_random_seed(func); + + gsps = NULL; + mod = GetModuleHandle("KERNEL32"); + if (mod) { + gsps = (gsps_t)GetProcAddress(mod, "GetSystemPowerStatus"); + } } void random_save_seed(void) { @@ -59,10 +72,41 @@ void noise_get_light(void (*func) (void *, int)) { GetSystemTimeAdjustment(&adjust[0], &adjust[1], &rubbish); func(&adjust, sizeof(adjust)); -#ifndef WIN32S_COMPAT - if (GetSystemPowerStatus(&pwrstat)) - func(&pwrstat, sizeof(pwrstat)); -#endif + /* + * Call GetSystemPowerStatus if present. + */ + if (gsps) { + if (gsps(&pwrstat)) + func(&pwrstat, sizeof(pwrstat)); + } +} + +/* + * This function is called on a timer, and it will monitor + * frequently changing quantities such as the state of physical and + * virtual memory, the state of the process's message queue, which + * window is in the foreground, which owns the clipboard, etc. + */ +void noise_regular(void) { + HWND w; + DWORD z; + POINT pt; + MEMORYSTATUS memstat; + FILETIME times[4]; + + w = GetForegroundWindow(); random_add_noise(&w, sizeof(w)); + w = GetCapture(); random_add_noise(&w, sizeof(w)); + w = GetClipboardOwner(); random_add_noise(&w, sizeof(w)); + z = GetQueueStatus(QS_ALLEVENTS); random_add_noise(&z, sizeof(z)); + + GetCursorPos(&pt); random_add_noise(&pt, sizeof(pt)); + + GlobalMemoryStatus(&memstat); random_add_noise(&memstat, sizeof(memstat)); + + GetThreadTimes(GetCurrentThread(), times, times+1, times+2, times+3); + random_add_noise(×, sizeof(times)); + GetProcessTimes(GetCurrentProcess(), times, times+1, times+2, times+3); + random_add_noise(×, sizeof(times)); } /*