X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=noise.c;h=a094d25e4dcc03ca9b43341e9e594fef6b21f28f;hb=869989e7e66524b8d412e70be0b72080cf0e9fac;hp=ad257f56ca41d9f66a425cac7f2574f5911fb9c8;hpb=1be519196536161d88c6a9a6032a25fff5db44fc;p=PuTTY.git diff --git a/noise.c b/noise.c index ad257f56..a094d25e 100644 --- a/noise.c +++ b/noise.c @@ -13,8 +13,8 @@ /* * GetSystemPowerStatus function. */ -typedef BOOL (WINAPI *gsps_t)(LPSYSTEM_POWER_STATUS); -gsps_t gsps; +typedef BOOL(WINAPI * gsps_t) (LPSYSTEM_POWER_STATUS); +static gsps_t gsps; /* * This function is called once, at PuTTY startup, and will do some @@ -22,10 +22,11 @@ gsps_t gsps; * free space and a process snapshot. */ -void noise_get_heavy(void (*func) (void *, int)) { +void noise_get_heavy(void (*func) (void *, int)) +{ HANDLE srch; WIN32_FIND_DATA finddata; - char winpath[MAX_PATH+3]; + char winpath[MAX_PATH + 3]; HMODULE mod; GetWindowsDirectory(winpath, sizeof(winpath)); @@ -43,16 +44,19 @@ void noise_get_heavy(void (*func) (void *, int)) { gsps = NULL; mod = GetModuleHandle("KERNEL32"); if (mod) { - gsps = (gsps_t)GetProcAddress(mod, "GetSystemPowerStatus"); + gsps = (gsps_t) GetProcAddress(mod, "GetSystemPowerStatus"); } } -void random_save_seed(void) { +void random_save_seed(void) +{ int len; void *data; - random_get_savedata(&data, &len); - write_random_seed(data, len); + if (random_active) { + random_get_savedata(&data, &len); + write_random_seed(data, len); + } } /* @@ -60,7 +64,8 @@ void random_save_seed(void) { * stirring, and will acquire the system time in all available * forms and the battery status. */ -void noise_get_light(void (*func) (void *, int)) { +void noise_get_light(void (*func) (void *, int)) +{ SYSTEMTIME systime; DWORD adjust[2]; BOOL rubbish; @@ -76,18 +81,56 @@ void noise_get_light(void (*func) (void *, int)) { * Call GetSystemPowerStatus if present. */ if (gsps) { - if (gsps(&pwrstat)) - func(&pwrstat, sizeof(pwrstat)); + 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)); +} + /* * This function is called on every keypress or mouse move, and * will add the current Windows time and performance monitor * counter to the noise pool. It gets the scan code or mouse * position passed in. */ -void noise_ultralight(DWORD data) { +void noise_ultralight(DWORD data) +{ DWORD wintime; LARGE_INTEGER perftime;