From e476f9421288aedee52a65ec813c7683ff0ccf5f Mon Sep 17 00:00:00 2001
From: Andy Polyakov <appro@openssl.org>
Date: Sat, 21 May 2005 13:19:27 +0000
Subject: [PATCH] Move _WIN32_WINNT definition from command line to e_os.h. The
 change is inspired by VC6 failure report. In addition abstain from taking
 screen snapshots when running in NT service context.

---
 crypto/cryptlib.c      |  5 +++--
 crypto/cryptlib.h      |  1 +
 crypto/rand/rand_win.c |  3 ++-
 e_os.h                 | 17 +++++++++++++++++
 util/pl/VC-32.pl       |  2 +-
 5 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/crypto/cryptlib.c b/crypto/cryptlib.c
index 6f8b0ff4e5..e73d086eed 100644
--- a/crypto/cryptlib.c
+++ b/crypto/cryptlib.c
@@ -624,7 +624,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason,
 #include <tchar.h>
 
 #if defined(_WIN32_WINNT) && _WIN32_WINNT>=0x0333
-static int IsService(void)
+int OPENSSL_isservice(void)
 { HWINSTA h;
   DWORD len;
   WCHAR *name;
@@ -722,7 +722,7 @@ void OPENSSL_showfatal (const char *fmta,...)
 
 #if defined(_WIN32_WINNT) && _WIN32_WINNT>=0x0333
     /* this -------------v--- guards NT-specific calls */
-    if (GetVersion() < 0x80000000 && IsService())
+    if (GetVersion() < 0x80000000 && OPENSSL_isservice())
     {	HANDLE h = RegisterEventSource(0,_T("OPENSSL"));
 	const TCHAR *pmsg=buf;
 	ReportEvent(h,EVENTLOG_ERROR_TYPE,0,0,0,1,0,&pmsg,0);
@@ -754,6 +754,7 @@ void OPENSSL_showfatal (const char *fmta,...)
     vfprintf (stderr,fmta,ap);
     va_end (ap);
 }
+int OPENSSL_isservice (void) { return 0; }
 #endif
 
 void OpenSSLDie(const char *file,int line,const char *assertion)
diff --git a/crypto/cryptlib.h b/crypto/cryptlib.h
index fc249c57f3..5ceaa964b5 100644
--- a/crypto/cryptlib.h
+++ b/crypto/cryptlib.h
@@ -103,6 +103,7 @@ extern unsigned long OPENSSL_ia32cap_P;
 void OPENSSL_showfatal(const char *,...);
 void *OPENSSL_stderr(void);
 extern int OPENSSL_NONPIC_relocated;
+int OPENSSL_isservice(void);
 
 #ifdef  __cplusplus
 }
diff --git a/crypto/rand/rand_win.c b/crypto/rand/rand_win.c
index 39523d3005..47bf758282 100644
--- a/crypto/rand/rand_win.c
+++ b/crypto/rand/rand_win.c
@@ -632,7 +632,8 @@ int RAND_event(UINT iMsg, WPARAM wParam, LPARAM lParam)
 void RAND_screen(void) /* function available for backward compatibility */
 {
 	RAND_poll();
-	readscreen();
+	if (GetVersion() >= 0x80000000 || !OPENSSL_isservice())
+		readscreen();
 }
 
 
diff --git a/e_os.h b/e_os.h
index 3ff9f3cd1c..cf76632b1e 100644
--- a/e_os.h
+++ b/e_os.h
@@ -235,6 +235,23 @@ extern "C" {
 #  define NO_DIRENT
 
 #  ifdef WINDOWS
+#    ifndef _WIN32_WINNT
+       /*
+	* Defining _WIN32_WINNT here in e_os.h implies certain "discipline."
+	* Most notably we ought to check for availability of each specific
+	* routine with GetProcAddress() and/or quard NT-specific calls with
+	* GetVersion() < 0x80000000. One can argue that in latter "or" case
+	* we ought to /DELAYLOAD some .DLLs in order to protect ourselves
+	* against run-time link errors. This doesn't seem to be necessary,
+	* because it turned out that already Windows 95, first non-NT Win32
+	* implementation, is equipped with at least NT 3.51 stubs, dummy
+	* routines with same name, but which do nothing. Meaning that it's
+	* apparently appropriate to guard generic NT calls with GetVersion
+	* alone, while NT 4.0 and above calls ought to be additionally
+	* checked upon with GetProcAddress.
+	*/
+#      define _WIN32_WINNT 0x0400
+#    endif
 #    include <windows.h>
 #    include <stddef.h>
 #    include <errno.h>
diff --git a/util/pl/VC-32.pl b/util/pl/VC-32.pl
index 5888dcbfef..710c4cd129 100644
--- a/util/pl/VC-32.pl
+++ b/util/pl/VC-32.pl
@@ -11,7 +11,7 @@ $rm='del';
 
 # C compiler stuff
 $cc='cl';
-$cflags=' /MD /W3 /WX /G5 /Ox /O2 /Ob2 /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=0x0333 -DL_ENDIAN -DDSO_WIN32';
+$cflags=' /MD /W3 /WX /G5 /Ox /O2 /Ob2 /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32';
 $lflags="/nologo /subsystem:console /machine:I386 /opt:ref";
 $mlflags='';
 
-- 
2.25.1