|
1 | | -From f85366b1044fff7b4ea9162c3edcd8278c3e06ff Mon Sep 17 00:00:00 2001 |
2 | | -From: Alwin Esch <alwin.esch@web.de> |
3 | | -Date: Thu, 22 Aug 2019 19:30:12 +0100 |
4 | | -Subject: [PATCH] [win10] fixed uwp build |
5 | | - |
6 | | ---- |
7 | | - dlfcn.c | 43 ++++++++++++++++++++++++++++++++++++++----- |
8 | | - 1 file changed, 38 insertions(+), 5 deletions(-) |
9 | | - |
10 | | -diff --git a/dlfcn.c b/dlfcn.c |
11 | | -index 69670d1..2d77ca8 100644 |
12 | | ---- a/dlfcn.c |
13 | | -+++ b/dlfcn.c |
14 | | -@@ -19,6 +19,7 @@ |
15 | | - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| 1 | +From 4a4ba9ce9f666a66d027d84a26bb49bd6f92205a Mon Sep 17 00:00:00 2001 |
| 2 | +From: Alwin Esch <alwin.esch@web.de> |
| 3 | +Date: Thu, 22 Aug 2019 19:30:12 +0100 |
| 4 | +Subject: [PATCH] [win10] fixed uwp build |
| 5 | + |
| 6 | +--- |
| 7 | + src/dlfcn.c | 43 ++++++++++++++++++++++++++++++++++++++----- |
| 8 | + 1 file changed, 38 insertions(+), 5 deletions(-) |
| 9 | + |
| 10 | +diff --git a/src/dlfcn.c b/src/dlfcn.c |
| 11 | +index cb9f9bb..74cac34 100644 |
| 12 | +--- a/src/dlfcn.c |
| 13 | ++++ b/src/dlfcn.c |
| 14 | +@@ -24,6 +24,7 @@ |
| 15 | + * THE SOFTWARE. |
16 | 16 | */ |
17 | 17 |
|
18 | 18 | +#define _CRT_SECURE_NO_WARNINGS |
19 | 19 | #ifdef _DEBUG |
20 | 20 | #define _CRTDBG_MAP_ALLOC |
21 | 21 | #include <stdlib.h> |
22 | | -@@ -193,6 +194,7 @@ static void save_err_ptr_str( const void *ptr ) |
| 22 | +@@ -311,6 +312,7 @@ static HMODULE MyGetModuleHandleFromAddress( const void *addr ) |
23 | 23 | /* Load Psapi.dll at runtime, this avoids linking caveat */ |
24 | 24 | static BOOL MyEnumProcessModules( HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded ) |
25 | 25 | { |
26 | 26 | +#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY != WINAPI_FAMILY_APP) |
27 | | - static BOOL (WINAPI *EnumProcessModulesPtr)(HANDLE, HMODULE *, DWORD, LPDWORD); |
28 | | - HMODULE psapi; |
29 | | - |
30 | | -@@ -206,20 +208,26 @@ static BOOL MyEnumProcessModules( HANDLE hProcess, HMODULE *lphModule, DWORD cb, |
| 27 | + static BOOL (WINAPI *EnumProcessModulesPtr)(HANDLE, HMODULE *, DWORD, LPDWORD) = NULL; |
| 28 | + static BOOL failed = FALSE; |
| 29 | + UINT uMode; |
| 30 | +@@ -349,21 +351,27 @@ static BOOL MyEnumProcessModules( HANDLE hProcess, HMODULE *lphModule, DWORD cb, |
31 | 31 | } |
32 | 32 |
|
33 | 33 | return EnumProcessModulesPtr( hProcess, lphModule, cb, lpcbNeeded ); |
34 | 34 | +#else |
35 | | -+ return 0; |
| 35 | ++ return 0; |
36 | 36 | +#endif |
37 | 37 | } |
38 | 38 |
|
| 39 | + DLFCN_EXPORT |
39 | 40 | void *dlopen( const char *file, int mode ) |
40 | 41 | { |
41 | 42 | - HMODULE hModule; |
42 | 43 | - UINT uMode; |
43 | 44 | + HMODULE hModule = NULL; |
44 | 45 | + UINT uMode = 0; |
45 | 46 |
|
46 | | - current_error = NULL; |
| 47 | + error_occurred = FALSE; |
47 | 48 |
|
48 | 49 | /* Do not let Windows display the critical-error-handler message box */ |
49 | 50 | +#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY != WINAPI_FAMILY_APP) |
50 | | - uMode = SetErrorMode( SEM_FAILCRITICALERRORS ); |
| 51 | + uMode = MySetErrorMode( SEM_FAILCRITICALERRORS ); |
51 | 52 | +#endif |
52 | 53 |
|
53 | | - if( file == 0 ) |
| 54 | + if( file == NULL ) |
54 | 55 | { |
55 | 56 | +#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY != WINAPI_FAMILY_APP) // what is replacement of GMH on UWP? |
56 | | - /* POSIX says that if the value of file is 0, a handle on a global |
| 57 | + /* POSIX says that if the value of file is NULL, a handle on a global |
57 | 58 | * symbol object must be provided. That object must be able to access |
58 | 59 | * all symbols from the original program file, and any objects loaded |
59 | | -@@ -234,6 +242,7 @@ void *dlopen( const char *file, int mode ) |
| 60 | +@@ -378,6 +386,7 @@ void *dlopen( const char *file, int mode ) |
60 | 61 |
|
61 | 62 | if( !hModule ) |
62 | | - save_err_ptr_str( file ); |
| 63 | + save_err_str( "(null)", GetLastError( ) ); |
63 | 64 | +#endif |
64 | 65 | } |
65 | 66 | else |
66 | 67 | { |
67 | | -@@ -264,11 +273,29 @@ void *dlopen( const char *file, int mode ) |
68 | | - * to UNIX's search paths (start with system folders instead of current |
69 | | - * folder). |
70 | | - */ |
| 68 | +@@ -415,8 +424,25 @@ void *dlopen( const char *file, int mode ) |
| 69 | + * to UNIX's search paths (start with system folders instead of current |
| 70 | + * folder). |
| 71 | + */ |
| 72 | +- hModule = LoadLibraryExA( lpFileName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH ); |
71 | 73 | +#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) |
72 | | -+ int result = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, lpFileName, strlen(lpFileName), NULL, 0); |
73 | | -+ if (result == 0) |
74 | | -+ return NULL; |
75 | | -+ |
76 | | -+ wchar_t* newStr = (wchar_t*)malloc(result*sizeof(wchar_t)); |
77 | | -+ result = MultiByteToWideChar( CP_UTF8, MB_ERR_INVALID_CHARS, lpFileName, strlen(lpFileName), newStr, result ); |
78 | | -+ if (result == 0) |
79 | | -+ { |
80 | | -+ free( newStr ); |
81 | | -+ return NULL; |
82 | | -+ } |
| 74 | ++ int result = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, lpFileName, strlen(lpFileName), NULL, 0); |
| 75 | ++ if (result == 0) |
| 76 | ++ return NULL; |
83 | 77 | + |
84 | | -+ hModule = LoadPackagedLibrary( newStr, 0 ); |
85 | | -+ free( newStr ); |
86 | | -+ dwProcModsAfter = 0; |
| 78 | ++ wchar_t* newStr = (wchar_t*)malloc(result*sizeof(wchar_t)); |
| 79 | ++ result = MultiByteToWideChar( CP_UTF8, MB_ERR_INVALID_CHARS, lpFileName, strlen(lpFileName), newStr, result ); |
| 80 | ++ if (result == 0) |
| 81 | ++ { |
| 82 | ++ free( newStr ); |
| 83 | ++ return NULL; |
| 84 | ++ } |
| 85 | + |
| 86 | ++ hModule = LoadPackagedLibrary( newStr, 0 ); |
| 87 | ++ free( newStr ); |
| 88 | ++ dwProcModsAfter = 0; |
87 | 89 | +#else // WINAPI_PARTITION_DESKTOP |
88 | | - hModule = LoadLibraryExA(lpFileName, NULL, |
89 | | - LOAD_WITH_ALTERED_SEARCH_PATH ); |
90 | | - |
91 | | - if( MyEnumProcessModules( hCurrentProc, NULL, 0, &dwProcModsAfter ) == 0 ) |
92 | | - dwProcModsAfter = 0; |
| 90 | ++ hModule = LoadLibraryExA( lpFileName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH ); |
93 | 91 | +#endif |
94 | | - |
95 | | - /* If the object was loaded with RTLD_LOCAL, add it to list of local |
96 | | - * objects, so that its symbols cannot be retrieved even if the handle for |
97 | | -@@ -288,7 +315,9 @@ void *dlopen( const char *file, int mode ) |
| 92 | + if( !hModule ) |
| 93 | + { |
| 94 | + save_err_str( lpFileName, GetLastError( ) ); |
| 95 | +@@ -453,7 +479,9 @@ void *dlopen( const char *file, int mode ) |
98 | 96 | } |
99 | 97 |
|
100 | 98 | /* Return to previous state of the error-mode bit flags. */ |
101 | 99 | +#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY != WINAPI_FAMILY_APP) |
102 | | - SetErrorMode( uMode ); |
| 100 | + MySetErrorMode( uMode ); |
103 | 101 | +#endif |
104 | 102 |
|
105 | 103 | return (void *) hModule; |
106 | 104 | } |
107 | | -@@ -321,12 +350,14 @@ void *dlsym( void *handle, const char *name ) |
| 105 | +@@ -488,13 +516,15 @@ void *dlsym( void *handle, const char *name ) |
108 | 106 | { |
109 | 107 | FARPROC symbol; |
110 | 108 | HMODULE hCaller; |
111 | 109 | - HMODULE hModule; |
112 | | -- HANDLE hCurrentProc; |
| 110 | +- DWORD dwMessageId; |
113 | 111 | + HMODULE hModule = 0; |
114 | | -+ HANDLE hCurrentProc = 0; |
| 112 | ++ DWORD dwMessageId = 0; |
| 113 | + |
| 114 | + error_occurred = FALSE; |
115 | 115 |
|
116 | | - current_error = NULL; |
117 | 116 | symbol = NULL; |
118 | 117 | hCaller = NULL; |
119 | 118 | + |
120 | 119 | +#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY != WINAPI_FAMILY_APP) // what is replacement of GMH on UWP? |
121 | 120 | hModule = GetModuleHandle( NULL ); |
122 | | - hCurrentProc = GetCurrentProcess( ); |
| 121 | + dwMessageId = 0; |
123 | 122 |
|
124 | | -@@ -358,6 +389,7 @@ void *dlsym( void *handle, const char *name ) |
125 | | - if(!hCaller) |
| 123 | +@@ -525,6 +555,7 @@ void *dlsym( void *handle, const char *name ) |
126 | 124 | goto end; |
| 125 | + } |
127 | 126 | } |
128 | 127 | +#endif |
129 | 128 |
|
130 | 129 | if( handle != RTLD_NEXT ) |
131 | 130 | { |
132 | | -@@ -370,7 +402,7 @@ void *dlsym( void *handle, const char *name ) |
133 | | - /* If the handle for the original program file is passed, also search |
| 131 | +@@ -538,6 +569,7 @@ void *dlsym( void *handle, const char *name ) |
134 | 132 | * in all globally loaded objects. |
135 | 133 | */ |
136 | | -- |
| 134 | + |
137 | 135 | +#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY != WINAPI_FAMILY_APP) |
138 | 136 | if( hModule == handle || handle == RTLD_NEXT ) |
139 | 137 | { |
140 | | - HMODULE *modules; |
141 | | -@@ -410,6 +442,7 @@ void *dlsym( void *handle, const char *name ) |
| 138 | + HANDLE hCurrentProc; |
| 139 | +@@ -588,6 +620,7 @@ void *dlsym( void *handle, const char *name ) |
142 | 140 | } |
143 | 141 | } |
144 | 142 | } |
145 | 143 | +#endif |
146 | 144 |
|
147 | 145 | end: |
148 | 146 | if( symbol == NULL ) |
149 | | --- |
150 | | -2.19.2.windows.1 |
151 | | - |
| 147 | +-- |
| 148 | +2.47.1.windows.1 |
| 149 | + |
0 commit comments