From b2b4dfcca6cf2230107a711f7af1cd8ee3f74229 Mon Sep 17 00:00:00 2001 From: Pecio Date: Mon, 19 Mar 2018 09:34:35 +0100 Subject: [PATCH] Enabled OneCore Conf for Console Apps (removed nonUniversal API) Reviewed-by: Rich Salz Reviewed-by: Andy Polyakov Reviewed-by: Richard Levitte (Merged from https://github.com/openssl/openssl/pull/5625) --- Configurations/50-win-onecore.conf | 22 ++++++++++----- crypto/cryptlib.c | 45 +++++++++++++++++++++++++----- 2 files changed, 53 insertions(+), 14 deletions(-) diff --git a/Configurations/50-win-onecore.conf b/Configurations/50-win-onecore.conf index 1207621e67..c71d3646f2 100644 --- a/Configurations/50-win-onecore.conf +++ b/Configurations/50-win-onecore.conf @@ -4,7 +4,11 @@ # Mobile[?] Windows editions. It's a set up "umbrella" libraries that # export subset of Win32 API that are common to all Windows 10 devices. # -# TODO: drop onecore_downlevel.lib. +# OneCore Configuration temporarly dedicated for console applications +# due to disabled event logging, which is incompatible with one core. +# Error messages are provided via standard error only. +# TODO: extend error handling to use ETW based eventing +# (Or rework whole error messaging) my %targets = ( "VC-WIN32-ONECORE" => { @@ -13,12 +17,14 @@ my %targets = ( # hidden reference to kernel32.lib, but we don't actually want # it in "onecore" build. lflags => add("/NODEFAULTLIB:kernel32.lib"), - ex_libs => "onecore.lib onecore_downlevel.lib", + defines => add("OPENSSL_SYS_WIN_CORE"), + ex_libs => "onecore.lib", }, "VC-WIN64A-ONECORE" => { inherit_from => [ "VC-WIN64A" ], lflags => add("/NODEFAULTLIB:kernel32.lib"), - ex_libs => "onecore.lib onecore_downlevel.lib", + defines => add("OPENSSL_SYS_WIN_CORE"), + ex_libs => "onecore.lib", }, # Windows on ARM targets. ARM compilers are additional components in @@ -39,18 +45,20 @@ my %targets = ( "VC-WIN32-ARM" => { inherit_from => [ "VC-noCE-common" ], - defines => add("_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE"), + defines => add("_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE", + "OPENSSL_SYS_WIN_CORE"), bn_ops => "BN_LLONG RC4_CHAR EXPORT_VAR_AS_FN", lflags => add("/NODEFAULTLIB:kernel32.lib"), - ex_libs => "onecore.lib onecore_downlevel.lib", + ex_libs => "onecore.lib", multilib => "-arm", }, "VC-WIN64-ARM" => { inherit_from => [ "VC-noCE-common" ], - defines => add("_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE"), + defines => add("_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE", + "OPENSSL_SYS_WIN_CORE"), bn_ops => "SIXTY_FOUR_BIT RC4_CHAR EXPORT_VAR_AS_FN", lflags => add("/NODEFAULTLIB:kernel32.lib"), - ex_libs => "onecore.lib onecore_downlevel.lib", + ex_libs => "onecore.lib", multilib => "-arm64", }, ); diff --git a/crypto/cryptlib.c b/crypto/cryptlib.c index a4d96d868e..0470597b6e 100644 --- a/crypto/cryptlib.c +++ b/crypto/cryptlib.c @@ -120,6 +120,14 @@ void OPENSSL_cpuid_setup(void) # endif # if defined(_WIN32_WINNT) && _WIN32_WINNT>=0x0333 +# ifdef OPENSSL_SYS_WIN_CORE + +int OPENSSL_isservice(void) +{ + /* OneCore API cannot interact with GUI */ + return 1; +} +# else int OPENSSL_isservice(void) { HWINSTA h; @@ -160,7 +168,7 @@ int OPENSSL_isservice(void) len++, len &= ~1; /* paranoia */ name[len / sizeof(WCHAR)] = L'\0'; /* paranoia */ -# if 1 +# if 1 /* * This doesn't cover "interactive" services [working with real * WinSta0's] nor programs started non-interactively by Task Scheduler @@ -168,14 +176,15 @@ int OPENSSL_isservice(void) */ if (wcsstr(name, L"Service-0x")) return 1; -# else +# else /* This covers all non-interactive programs such as services. */ if (!wcsstr(name, L"WinSta0")) return 1; -# endif +# endif else return 0; } +# endif # else int OPENSSL_isservice(void) { @@ -272,6 +281,24 @@ void OPENSSL_showfatal(const char *fmta, ...) va_end(ap); # if defined(_WIN32_WINNT) && _WIN32_WINNT>=0x0333 +# ifdef OPENSSL_SYS_WIN_CORE + /* ONECORE is always NONGUI and NT >= 0x0601 */ + + /* + * TODO: (For non GUI and no std error cases) + * Add event logging feature here. + */ + +# if !defined(NDEBUG) + /* + * We are in a situation where we tried to report a critical + * error and this failed for some reason. As a last resort, + * in debug builds, send output to the debugger or any other + * tool like DebugView which can monitor the output. + */ + OutputDebugString(buf); +# endif +# else /* this -------------v--- guards NT-specific calls */ if (check_winnt() && OPENSSL_isservice() > 0) { HANDLE hEventLog = RegisterEventSource(NULL, _T("OpenSSL")); @@ -281,7 +308,7 @@ void OPENSSL_showfatal(const char *fmta, ...) if (!ReportEvent(hEventLog, EVENTLOG_ERROR_TYPE, 0, 0, NULL, 1, 0, &pmsg, NULL)) { -#if defined(DEBUG) +# if !defined(NDEBUG) /* * We are in a situation where we tried to report a critical * error and this failed for some reason. As a last resort, @@ -289,14 +316,18 @@ void OPENSSL_showfatal(const char *fmta, ...) * tool like DebugView which can monitor the output. */ OutputDebugString(pmsg); -#endif +# endif } (void)DeregisterEventSource(hEventLog); } - } else -# endif + } else { MessageBox(NULL, buf, _T("OpenSSL: FATAL"), MB_OK | MB_ICONERROR); + } +# endif +# else + MessageBox(NULL, buf, _T("OpenSSL: FATAL"), MB_OK | MB_ICONERROR); +# endif } #else void OPENSSL_showfatal(const char *fmta, ...) -- 2.25.1