Run entire source base through GNU indent to tidy up the varying
[u/mdw/putty] / noise.c
diff --git a/noise.c b/noise.c
index cf9bba5..856974b 100644 (file)
--- a/noise.c
+++ b/noise.c
@@ -8,41 +8,13 @@
 
 #include "putty.h"
 #include "ssh.h"
-
-static char seedpath[2*MAX_PATH+10] = "\0";
+#include "storage.h"
 
 /*
- * Find the random seed file path and store it in `seedpath'.
+ * GetSystemPowerStatus function.
  */
-static void get_seedpath(void) {
-    HKEY rkey;
-    DWORD type, size;
-
-    size = sizeof(seedpath);
-
-    if (RegOpenKey(HKEY_CURRENT_USER, PUTTY_REG_POS, &rkey)==ERROR_SUCCESS) {
-       int ret = RegQueryValueEx(rkey, "RandSeedFile",
-                                 0, &type, seedpath, &size);
-       if (ret != ERROR_SUCCESS || type != REG_SZ)
-           seedpath[0] = '\0';
-       RegCloseKey(rkey);
-    } else
-       seedpath[0] = '\0';
-
-    if (!seedpath[0]) {
-       int len, ret;
-
-       len = GetEnvironmentVariable("HOMEDRIVE", seedpath, sizeof(seedpath));
-       ret = GetEnvironmentVariable("HOMEPATH", seedpath+len,
-                                     sizeof(seedpath)-len);
-       if (ret == 0) {                /* probably win95; store in \WINDOWS */
-           GetWindowsDirectory(seedpath, sizeof(seedpath));
-           len = strlen(seedpath);
-       } else
-           len += ret;
-       strcpy(seedpath+len, "\\PUTTY.RND");
-    }
-}
+typedef BOOL(WINAPI * gsps_t) (LPSYSTEM_POWER_STATUS);
+static gsps_t gsps;
 
 /*
  * This function is called once, at PuTTY startup, and will do some
@@ -50,11 +22,12 @@ static void get_seedpath(void) {
  * free space and a process snapshot.
  */
 
-void noise_get_heavy(void (*func) (void *, int)) {
+void noise_get_heavy(void (*func) (void *, int))
+{
     HANDLE srch;
-    HANDLE seedf;
     WIN32_FIND_DATA finddata;
-    char winpath[MAX_PATH+3];
+    char winpath[MAX_PATH + 3];
+    HMODULE mod;
 
     GetWindowsDirectory(winpath, sizeof(winpath));
     strcat(winpath, "\\*");
@@ -66,45 +39,22 @@ void noise_get_heavy(void (*func) (void *, int)) {
        FindClose(srch);
     }
 
-    if (!seedpath[0])
-       get_seedpath();
-
-    seedf = CreateFile(seedpath, GENERIC_READ,
-                      FILE_SHARE_READ | FILE_SHARE_WRITE,
-                      NULL, OPEN_EXISTING, 0, NULL);
+    read_random_seed(func);
 
-    if (seedf) {
-       while (1) {
-           char buf[1024];
-           DWORD len;
-
-           if (ReadFile(seedf, buf, sizeof(buf), &len, NULL) && len)
-               func(buf, len);
-           else
-               break;
-       }
-       CloseHandle(seedf);
+    gsps = NULL;
+    mod = GetModuleHandle("KERNEL32");
+    if (mod) {
+       gsps = (gsps_t) GetProcAddress(mod, "GetSystemPowerStatus");
     }
 }
 
-void random_save_seed(void) {
-    HANDLE seedf;
-
-    if (!seedpath[0])
-       get_seedpath();
-
-    seedf = CreateFile(seedpath, GENERIC_WRITE, 0,
-                      NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+void random_save_seed(void)
+{
+    int len;
+    void *data;
 
-    if (seedf) {
-       int len;
-       DWORD lenwritten;
-       void *data;
-
-       random_get_savedata(&data, &len);
-       WriteFile(seedf, data, len, &lenwritten, NULL);
-       CloseHandle(seedf);
-    }
+    random_get_savedata(&data, &len);
+    write_random_seed(data, len);
 }
 
 /*
@@ -112,7 +62,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;
@@ -124,8 +75,50 @@ void noise_get_light(void (*func) (void *, int)) {
     GetSystemTimeAdjustment(&adjust[0], &adjust[1], &rubbish);
     func(&adjust, sizeof(adjust));
 
-    if (GetSystemPowerStatus(&pwrstat))
-       func(&pwrstat, sizeof(pwrstat));
+    /*
+     * 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(&times, sizeof(times));
+    GetProcessTimes(GetCurrentProcess(), times, times + 1, times + 2,
+                   times + 3);
+    random_add_noise(&times, sizeof(times));
 }
 
 /*
@@ -134,7 +127,8 @@ void noise_get_light(void (*func) (void *, int)) {
  * 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;