Broaden compatibility among Windows SDK versions. Elder versions don't have
[openssl.git] / crypto / rand / rand_win.c
index 29472c6ddd1194c88ab8da30025fa788816e1393..692a13eac594d363bc2601fa1a0a95ab4aba12b7 100644 (file)
@@ -156,6 +156,7 @@ typedef struct tagCURSORINFO
 #define CURSOR_SHOWING     0x00000001
 #endif /* CURSOR_SHOWING */
 
+#if !defined(OPENSSL_SYS_WINCE)
 typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTW)(HCRYPTPROV *, LPCWSTR, LPCWSTR,
                                    DWORD, DWORD);
 typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV, DWORD, BYTE *);
@@ -167,7 +168,7 @@ typedef DWORD (WINAPI *GETQUEUESTATUS)(UINT);
 
 typedef HANDLE (WINAPI *CREATETOOLHELP32SNAPSHOT)(DWORD, DWORD);
 typedef BOOL (WINAPI *CLOSETOOLHELP32SNAPSHOT)(HANDLE);
-typedef BOOL (WINAPI *HEAP32FIRST)(LPHEAPENTRY32, DWORD, DWORD);
+typedef BOOL (WINAPI *HEAP32FIRST)(LPHEAPENTRY32, DWORD, SIZE_T);
 typedef BOOL (WINAPI *HEAP32NEXT)(LPHEAPENTRY32);
 typedef BOOL (WINAPI *HEAP32LIST)(HANDLE, LPHEAPLIST32);
 typedef BOOL (WINAPI *PROCESS32)(HANDLE, LPPROCESSENTRY32);
@@ -175,9 +176,7 @@ typedef BOOL (WINAPI *THREAD32)(HANDLE, LPTHREADENTRY32);
 typedef BOOL (WINAPI *MODULE32)(HANDLE, LPMODULEENTRY32);
 
 #include <lmcons.h>
-#ifndef OPENSSL_SYS_WINCE
 #include <lmstats.h>
-#endif
 #if 1 /* The NET API is Unicode only.  It requires the use of the UNICODE
        * macro.  When UNICODE is defined LPTSTR becomes LPWSTR.  LMSTR was
        * was added to the Platform SDK to allow the NET API to be used in
@@ -188,28 +187,15 @@ typedef NET_API_STATUS (NET_API_FUNCTION * NETSTATGET)
         (LPWSTR, LPWSTR, DWORD, DWORD, LPBYTE*);
 typedef NET_API_STATUS (NET_API_FUNCTION * NETFREE)(LPBYTE);
 #endif /* 1 */
+#endif /* !OPENSSL_SYS_WINCE */
 
 int RAND_poll(void)
 {
        MEMORYSTATUS m;
        HCRYPTPROV hProvider = 0;
-       BYTE buf[64];
        DWORD w;
-       HWND h;
        int good = 0;
 
-       HMODULE advapi, kernel, user, netapi;
-       CRYPTACQUIRECONTEXTW acquire = 0;
-       CRYPTGENRANDOM gen = 0;
-       CRYPTRELEASECONTEXT release = 0;
-#if 1 /* There was previously a problem with NETSTATGET.  Currently, this
-       * section is still experimental, but if all goes well, this conditional
-       * will be removed
-       */
-       NETSTATGET netstatget = 0;
-       NETFREE netfree = 0;
-#endif /* 1 */
-
        /* Determine the OS version we are on so we can turn off things 
         * that do not work properly.
         */
@@ -217,21 +203,24 @@ int RAND_poll(void)
         osverinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO) ;
         GetVersionEx( &osverinfo ) ;
 
-#if defined(OPENSSL_SYS_WINCE) && WCEPLATFORM!=MS_HPC_PRO
-#ifndef CryptAcquireContext
-#define CryptAcquireContext CryptAcquireContextW
-#endif
+#if defined(OPENSSL_SYS_WINCE)
+# if defined(_WIN32_WCE) && _WIN32_WCE>=300
+/* Even though MSDN says _WIN32_WCE>=210, it doesn't seem to be available
+ * in commonly available implementations prior 300... */
+       {
+       BYTE buf[64];
        /* poll the CryptoAPI PRNG */
        /* The CryptoAPI returns sizeof(buf) bytes of randomness */
-       if (CryptAcquireContext(&hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
+       if (CryptAcquireContextW(&hProvider, NULL, NULL, PROV_RSA_FULL,
+                               CRYPT_VERIFYCONTEXT))
                {
                if (CryptGenRandom(hProvider, sizeof(buf), buf))
                        RAND_add(buf, sizeof(buf), sizeof(buf));
                CryptReleaseContext(hProvider, 0); 
                }
-#endif
-
-#ifndef OPENSSL_SYS_WINCE
+       }
+# endif
+#else  /* OPENSSL_SYS_WINCE */
        /*
         * None of below libraries are present on Windows CE, which is
         * why we #ifndef the whole section. This also excuses us from
@@ -245,17 +234,19 @@ int RAND_poll(void)
         * implement own shim routine, which would accept ANSI argument
         * and expand it to Unicode.
         */
-
+       {
        /* load functions dynamically - not available on all systems */
-       advapi = LoadLibrary(TEXT("ADVAPI32.DLL"));
-       kernel = LoadLibrary(TEXT("KERNEL32.DLL"));
-       user = LoadLibrary(TEXT("USER32.DLL"));
-       netapi = LoadLibrary(TEXT("NETAPI32.DLL"));
-
-#if 1 /* There was previously a problem with NETSTATGET.  Currently, this
-       * section is still experimental, but if all goes well, this conditional
-       * will be removed
-       */
+       HMODULE advapi = LoadLibrary(TEXT("ADVAPI32.DLL"));
+       HMODULE kernel = LoadLibrary(TEXT("KERNEL32.DLL"));
+       HMODULE user = NULL;
+       HMODULE netapi = LoadLibrary(TEXT("NETAPI32.DLL"));
+       CRYPTACQUIRECONTEXTW acquire = NULL;
+       CRYPTGENRANDOM gen = NULL;
+       CRYPTRELEASECONTEXT release = NULL;
+       NETSTATGET netstatget = NULL;
+       NETFREE netfree = NULL;
+       BYTE buf[64];
+
        if (netapi)
                {
                netstatget = (NETSTATGET) GetProcAddress(netapi,"NetStatisticsGet");
@@ -285,7 +276,6 @@ int RAND_poll(void)
 
        if (netapi)
                FreeLibrary(netapi);
-#endif /* 1 */
 
         /* It appears like this can cause an exception deep within ADVAPI32.DLL
          * at random times on Windows 2000.  Reported by Jeffrey Altman.  
@@ -361,7 +351,7 @@ int RAND_poll(void)
                {
                /* poll the CryptoAPI PRNG */
                 /* The CryptoAPI returns sizeof(buf) bytes of randomness */
-               if (acquire(&hProvider, 0, 0, PROV_RSA_FULL,
+               if (acquire(&hProvider, NULL, NULL, PROV_RSA_FULL,
                        CRYPT_VERIFYCONTEXT))
                        {
                        if (gen(hProvider, sizeof(buf), buf) != 0)
@@ -393,7 +383,9 @@ int RAND_poll(void)
         if (advapi)
                FreeLibrary(advapi);
 
-       if (user)
+       if ((osverinfo.dwPlatformId != VER_PLATFORM_WIN32_NT ||
+            !OPENSSL_isservice()) &&
+           (user = LoadLibrary(TEXT("USER32.DLL"))))
                {
                GETCURSORINFO cursor;
                GETFOREGROUNDWINDOW win;
@@ -406,7 +398,7 @@ int RAND_poll(void)
                if (win)
                        {
                        /* window handle */
-                       h = win();
+                       HWND h = win();
                        RAND_add(&h, sizeof(h), 0);
                        }
                if (cursor)
@@ -558,7 +550,8 @@ int RAND_poll(void)
                        if (module_first(handle, &m))
                                do
                                        RAND_add(&m, m.dwSize, 9);
-                               while (module_next(handle, &m) && GetTickCount < stoptime);
+                               while (module_next(handle, &m)
+                                               && (GetTickCount() < stoptime));
                        if (close_snap)
                                close_snap(handle);
                        else
@@ -568,6 +561,7 @@ int RAND_poll(void)
 
                FreeLibrary(kernel);
                }
+       }
 #endif /* !OPENSSL_SYS_WINCE */
 
        /* timer data */
@@ -707,6 +701,9 @@ static void readscreen(void)
   int          y;              /* y-coordinate of screen lines to grab */
   int          n = 16;         /* number of screen lines to grab at a time */
 
+  if (GetVersion() >= 0x80000000 || !OPENSSL_isservice())
+    return;
+
   /* Create a screen DC and a memory DC compatible to screen DC */
   hScrDC = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
   hMemDC = CreateCompatibleDC(hScrDC);