From 1cb77c3684388724273c034b5acdd562d9938219 Mon Sep 17 00:00:00 2001 From: George Marques Date: Sat, 3 Sep 2016 19:41:36 -0300 Subject: [PATCH] Patch thirdy-party libraries to build for WinRT - Patch enet code. - Patch OpenSSL code and add shims for unavailable API. - Add extra definition header for Freetype. --- drivers/builtin_openssl2/SCsub | 4 + drivers/builtin_openssl2/winrt.cpp | 127 ++++++++++++++++++++++ drivers/builtin_openssl2/winrt_fix.patch | 64 +++++++++++ drivers/freetype/winrtdef.h | 32 ++++++ thirdparty/openssl/crypto/rand/rand_win.c | 9 +- thirdparty/openssl/openssl/dtls1.h | 3 + 6 files changed, 237 insertions(+), 2 deletions(-) create mode 100644 drivers/builtin_openssl2/winrt.cpp create mode 100644 drivers/builtin_openssl2/winrt_fix.patch create mode 100644 drivers/freetype/winrtdef.h diff --git a/drivers/builtin_openssl2/SCsub b/drivers/builtin_openssl2/SCsub index 9720369baba..bddf33146a2 100644 --- a/drivers/builtin_openssl2/SCsub +++ b/drivers/builtin_openssl2/SCsub @@ -642,6 +642,7 @@ openssl_sources = [ # env.drivers_sources+=openssl_sources +env.Append(CPPPATH=["#drivers/builtin_openssl2"]) env_drivers.Append(CPPPATH=["#drivers/builtin_openssl2/crypto"]) env_drivers.Append(CPPPATH=["#drivers/builtin_openssl2/openssl"]) env_drivers.Append(CPPPATH=["#drivers/builtin_openssl2/crypto/evp"]) @@ -650,6 +651,9 @@ env_drivers.Append(CPPPATH=["#drivers/builtin_openssl2/crypto/modes"]) # env_ssl.Append(CPPPATH=["#drivers/builtin_openssl2/crypto/store"]) env_drivers.Append(CPPFLAGS=["-DOPENSSL_NO_ASM", "-DOPENSSL_THREADS", "-DL_ENDIAN"]) +if "platform" in env and env["platform"] == "winrt": + openssl_sources += ['winrt.cpp'] + # Workaround for compilation error with GCC/Clang when -Werror is too greedy (GH-4517) import os if not (os.name == "nt" and os.getenv("VSINSTALLDIR") != None): # not Windows and not MSVC diff --git a/drivers/builtin_openssl2/winrt.cpp b/drivers/builtin_openssl2/winrt.cpp new file mode 100644 index 00000000000..d451476b324 --- /dev/null +++ b/drivers/builtin_openssl2/winrt.cpp @@ -0,0 +1,127 @@ +/* Snippets extracted from https://github.com/Microsoft/openssl/blob/ec7e430e06e4e3ac87c183dee33cb216814cf980/ms/winrt.cpp + * Adapted for Godot definitions + */ +/* winrt.cpp + * Copyright 2014 Microsoft Corporation + * C++/CX Entropy/shims for Windows Phone/Windows Store platform + * written by Alejandro Jimenez Martinez + * (aljim@microsoft.com) for the OpenSSL project 2014. + */ + +#include +#if defined(WINAPI_FAMILY) +extern "C" { +unsigned entropyRT(BYTE *buffer, unsigned len); +void RAND_add(const void *buf, int num, double entropy); +int RAND_poll(void); +} +#endif + +unsigned entropyRT(BYTE *buffer, unsigned len) { + using namespace Platform; + using namespace Windows::Foundation; + using namespace Windows::Foundation::Collections; + using namespace Windows::Security::Cryptography; + using namespace Windows::Storage::Streams; + IBuffer ^ buf = CryptographicBuffer::GenerateRandom(len); + Array ^ arr; + CryptographicBuffer::CopyToByteArray(buf, &arr); + unsigned arrayLen = arr->Length; + + // Make sure not to overflow the copy + arrayLen = (arrayLen > len) ? len : arrayLen; + memcpy(buffer, arr->Data, arrayLen); + return arrayLen; +} + +int RAND_poll(void) { + BYTE buf[60]; + unsigned collected = entropyRT(buf, sizeof(buf)); + RAND_add(buf, collected, collected); + return 1; +} + +#if defined(WINRT_ENABLED) +extern "C" { +#include +#include +#include + +void *GetModuleHandle( + _In_opt_ LPCTSTR lpModuleName) { + return NULL; +} +//no log for phone +int RegisterEventSource( + _In_ LPCTSTR lpUNCServerName, + _In_ LPCTSTR lpSourceName) { + return NULL; +} + +int ReportEvent( + _In_ HANDLE hEventLog, + _In_ WORD wType, + _In_ WORD wCategory, + _In_ DWORD dwEventID, + _In_ PSID lpUserSid, + _In_ WORD wNumStrings, + _In_ DWORD dwDataSize, + _In_ LPCTSTR *lpStrings, + _In_ LPVOID lpRawData) { + return 0; +} +int MessageBox( + _In_opt_ HWND hWnd, + _In_opt_ LPCTSTR lpText, + _In_opt_ LPCTSTR lpCaption, + _In_ UINT uType) { + return 0; +} +int __cdecl GetProcessWindowStation(void) { + return NULL; +} +BOOL __cdecl GetUserObjectInformationW( + _In_ HANDLE hObj, + _In_ int nIndex, + _Out_opt_ PVOID pvInfo, + _In_ DWORD nLength, + _Out_opt_ LPDWORD lpnLengthNeeded) { + return 0; +} +int __cdecl GetStdHandle( + _In_ DWORD nStdHandle) { + return 0; +} +BOOL DeregisterEventSource( + _Inout_ HANDLE hEventLog) { + return 0; +} +char *getenv( + const char *varname) { + //hardcoded environmental variables used for the appx testing application for store/phone + if (!strcmp(varname, "OPENSSL_CONF")) { + return "./openssl.cnf"; + } + return 0; +} +int setenv(const char *envname, const char *envval, int overwrite) { + return -1; +} +int _getch(void) { + return 0; +} +int _kbhit() { + return 0; +} +BOOL __cdecl FlushConsoleInputBuffer( + _In_ HANDLE hConsoleInput) { + return 0; +} +int winrt_GetTickCount(void) { + LARGE_INTEGER t; + return (int)(QueryPerformanceCounter(&t) ? t.QuadPart : 0); +} +void *OPENSSL_UplinkTable[26] = { 0 }; +} //extern C + +#endif /*defined(WINRT_ENABLED)*/ diff --git a/drivers/builtin_openssl2/winrt_fix.patch b/drivers/builtin_openssl2/winrt_fix.patch new file mode 100644 index 00000000000..caf180a75bb --- /dev/null +++ b/drivers/builtin_openssl2/winrt_fix.patch @@ -0,0 +1,64 @@ +diff --git a/drivers/builtin_openssl2/crypto/rand/rand_win.c b/drivers/builtin_openssl2/crypto/rand/rand_win.c +index 06670ae..70fd52a 100644 +--- a/drivers/builtin_openssl2/crypto/rand/rand_win.c ++++ b/drivers/builtin_openssl2/crypto/rand/rand_win.c +@@ -118,8 +118,10 @@ + # ifndef _WIN32_WINNT + # define _WIN32_WINNT 0x0400 + # endif ++#ifndef WINRT_ENABLED + # include + # include ++#endif + + /* + * Limit the time spent walking through the heap, processes, threads and +@@ -161,7 +163,7 @@ typedef struct tagCURSORINFO { + # define CURSOR_SHOWING 0x00000001 + # endif /* CURSOR_SHOWING */ + +-# if !defined(OPENSSL_SYS_WINCE) ++# if !defined(OPENSSL_SYS_WINCE) && !defined(WINRT_ENABLED) + typedef BOOL(WINAPI *CRYPTACQUIRECONTEXTW) (HCRYPTPROV *, LPCWSTR, LPCWSTR, + DWORD, DWORD); + typedef BOOL(WINAPI *CRYPTGENRANDOM) (HCRYPTPROV, DWORD, BYTE *); +@@ -196,6 +198,7 @@ typedef NET_API_STATUS(NET_API_FUNCTION *NETFREE) (LPBYTE); + # endif /* 1 */ + # endif /* !OPENSSL_SYS_WINCE */ + ++#if !defined(WINRT_ENABLED) + int RAND_poll(void) + { + MEMORYSTATUS m; +@@ -580,6 +583,8 @@ int RAND_poll(void) + return (1); + } + ++#endif // WINRT_ENABLED ++ + int RAND_event(UINT iMsg, WPARAM wParam, LPARAM lParam) + { + double add_entropy = 0; +@@ -682,7 +687,7 @@ static void readtimer(void) + + static void readscreen(void) + { +-# if !defined(OPENSSL_SYS_WINCE) && !defined(OPENSSL_SYS_WIN32_CYGWIN) ++# if !defined(OPENSSL_SYS_WINCE) && !defined(OPENSSL_SYS_WIN32_CYGWIN) && !defined(WINRT_ENABLED) + HDC hScrDC; /* screen DC */ + HBITMAP hBitmap; /* handle for our bitmap */ + BITMAP bm; /* bitmap properties */ +diff --git a/drivers/builtin_openssl2/openssl/dtls1.h b/drivers/builtin_openssl2/openssl/dtls1.h +index 64ad3c8..a58aca2 100644 +--- a/drivers/builtin_openssl2/openssl/dtls1.h ++++ b/drivers/builtin_openssl2/openssl/dtls1.h +@@ -81,6 +81,9 @@ + # include + # endif + # endif ++#ifdef WINRT_ENABLED ++#include ++#endif + + #ifdef __cplusplus + extern "C" { diff --git a/drivers/freetype/winrtdef.h b/drivers/freetype/winrtdef.h new file mode 100644 index 00000000000..69c6baf5329 --- /dev/null +++ b/drivers/freetype/winrtdef.h @@ -0,0 +1,32 @@ +/*************************************************************************/ +/* winrtdef.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +// "generic" is a reserved keyword in C++/CX code +// this avoids the errors in the variable name from Freetype code +#define generic freetype_generic diff --git a/thirdparty/openssl/crypto/rand/rand_win.c b/thirdparty/openssl/crypto/rand/rand_win.c index 06670ae017a..70fd52a7aaf 100644 --- a/thirdparty/openssl/crypto/rand/rand_win.c +++ b/thirdparty/openssl/crypto/rand/rand_win.c @@ -118,8 +118,10 @@ # ifndef _WIN32_WINNT # define _WIN32_WINNT 0x0400 # endif +#ifndef WINRT_ENABLED # include # include +#endif /* * Limit the time spent walking through the heap, processes, threads and @@ -161,7 +163,7 @@ typedef struct tagCURSORINFO { # define CURSOR_SHOWING 0x00000001 # endif /* CURSOR_SHOWING */ -# if !defined(OPENSSL_SYS_WINCE) +# if !defined(OPENSSL_SYS_WINCE) && !defined(WINRT_ENABLED) typedef BOOL(WINAPI *CRYPTACQUIRECONTEXTW) (HCRYPTPROV *, LPCWSTR, LPCWSTR, DWORD, DWORD); typedef BOOL(WINAPI *CRYPTGENRANDOM) (HCRYPTPROV, DWORD, BYTE *); @@ -196,6 +198,7 @@ typedef NET_API_STATUS(NET_API_FUNCTION *NETFREE) (LPBYTE); # endif /* 1 */ # endif /* !OPENSSL_SYS_WINCE */ +#if !defined(WINRT_ENABLED) int RAND_poll(void) { MEMORYSTATUS m; @@ -580,6 +583,8 @@ int RAND_poll(void) return (1); } +#endif // WINRT_ENABLED + int RAND_event(UINT iMsg, WPARAM wParam, LPARAM lParam) { double add_entropy = 0; @@ -682,7 +687,7 @@ static void readtimer(void) static void readscreen(void) { -# if !defined(OPENSSL_SYS_WINCE) && !defined(OPENSSL_SYS_WIN32_CYGWIN) +# if !defined(OPENSSL_SYS_WINCE) && !defined(OPENSSL_SYS_WIN32_CYGWIN) && !defined(WINRT_ENABLED) HDC hScrDC; /* screen DC */ HBITMAP hBitmap; /* handle for our bitmap */ BITMAP bm; /* bitmap properties */ diff --git a/thirdparty/openssl/openssl/dtls1.h b/thirdparty/openssl/openssl/dtls1.h index 64ad3c87d06..a58aca248dc 100644 --- a/thirdparty/openssl/openssl/dtls1.h +++ b/thirdparty/openssl/openssl/dtls1.h @@ -81,6 +81,9 @@ # include # endif # endif +#ifdef WINRT_ENABLED +#include +#endif #ifdef __cplusplus extern "C" {