annotate extern/libcompat/win/dlfcn/dlfcn.c @ 1004:3ea3361f0fc7

irccd: now track modes
author David Demelier <markand@malikania.fr>
date Tue, 16 Feb 2021 18:37:22 +0100
parents 21a91311c8ea
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
948
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * dlfcn-win32
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 * Copyright (c) 2007 Ramiro Polla
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2015 Tiancheng "Timothy" Gu
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 * Copyright (c) 2019 Pali Rohár <pali.rohar@gmail.com>
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 *
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * of this software and associated documentation files (the "Software"), to deal
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 * in the Software without restriction, including without limitation the rights
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * copies of the Software, and to permit persons to whom the Software is
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * furnished to do so, subject to the following conditions:
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 *
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * The above copyright notice and this permission notice shall be included in
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * all copies or substantial portions of the Software.
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 *
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 * THE SOFTWARE.
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
25
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #ifndef _WIN32_WINNT
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #define _WIN32_WINNT 0x0501
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #endif
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 #ifdef _DEBUG
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 #define _CRTDBG_MAP_ALLOC
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 #include <stdlib.h>
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 #include <crtdbg.h>
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 #endif
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 #include <windows.h>
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 #include <stdio.h>
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 #include <stdlib.h>
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
37
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 #ifdef _MSC_VER
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 /* https://docs.microsoft.com/en-us/cpp/intrinsics/returnaddress */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 #pragma intrinsic(_ReturnAddress)
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 #else
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 /* https://gcc.gnu.org/onlinedocs/gcc/Return-Address.html */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 #ifndef _ReturnAddress
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 #define _ReturnAddress() (__builtin_extract_return_addr(__builtin_return_address(0)))
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 #endif
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 #endif
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
47
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 #ifdef SHARED
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 #define DLFCN_WIN32_EXPORTS
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 #endif
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 #include "dlfcn.h"
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
52
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 /* Note:
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 * MSDN says these functions are not thread-safe. We make no efforts to have
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 * any kind of thread safety.
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
57
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 typedef struct local_object {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 HMODULE hModule;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 struct local_object *previous;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 struct local_object *next;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 } local_object;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
63
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 static local_object first_object;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
65
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 /* These functions implement a double linked list for the local objects. */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 static local_object *local_search( HMODULE hModule )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 local_object *pobject;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 if( hModule == NULL )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 return NULL;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
73
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 for( pobject = &first_object; pobject; pobject = pobject->next )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 if( pobject->hModule == hModule )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 return pobject;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
77
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 return NULL;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
80
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 static BOOL local_add( HMODULE hModule )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 local_object *pobject;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 local_object *nobject;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
85
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 if( hModule == NULL )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 return TRUE;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
88
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 pobject = local_search( hModule );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
90
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 /* Do not add object again if it's already on the list */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 if( pobject )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 return TRUE;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
94
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 for( pobject = &first_object; pobject->next; pobject = pobject->next );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
96
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 nobject = (local_object*) malloc( sizeof( local_object ) );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
98
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 if( !nobject )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 SetLastError( ERROR_NOT_ENOUGH_MEMORY );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 return FALSE;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
104
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 pobject->next = nobject;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 nobject->next = NULL;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 nobject->previous = pobject;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 nobject->hModule = hModule;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
109
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 return TRUE;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
112
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 static void local_rem( HMODULE hModule )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 local_object *pobject;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
116
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 if( hModule == NULL )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 return;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
119
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 pobject = local_search( hModule );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
121
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 if( !pobject )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 return;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
124
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 if( pobject->next )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 pobject->next->previous = pobject->previous;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 if( pobject->previous )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 pobject->previous->next = pobject->next;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
129
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 free( pobject );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
132
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 /* POSIX says dlerror( ) doesn't have to be thread-safe, so we use one
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 * static buffer.
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 * MSDN says the buffer cannot be larger than 64K bytes, so we set it to
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 * the limit.
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 static char error_buffer[65535];
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 static BOOL error_occurred;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
140
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 static void save_err_str( const char *str )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 DWORD dwMessageId;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 DWORD ret;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 size_t pos, len;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
146
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 dwMessageId = GetLastError( );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
148
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 if( dwMessageId == 0 )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 return;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
151
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 len = strlen( str );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 if( len > sizeof( error_buffer ) - 5 )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 len = sizeof( error_buffer ) - 5;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
155
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 /* Format error message to:
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 * "<argument to function that failed>": <Windows localized error message>
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 pos = 0;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 error_buffer[pos++] = '"';
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 memcpy( error_buffer+pos, str, len );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 pos += len;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 error_buffer[pos++] = '"';
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 error_buffer[pos++] = ':';
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 error_buffer[pos++] = ' ';
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
166
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 ret = FormatMessageA( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwMessageId,
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 error_buffer+pos, (DWORD) (sizeof(error_buffer)-pos), NULL );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 pos += ret;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
171
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 /* When FormatMessageA() fails it returns zero and does not touch buffer
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 * so add trailing null byte */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 if( ret == 0 )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 error_buffer[pos] = '\0';
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
176
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 if( pos > 1 )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 /* POSIX says the string must not have trailing <newline> */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 if( error_buffer[pos-2] == '\r' && error_buffer[pos-1] == '\n' )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 error_buffer[pos-2] = '\0';
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
183
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 error_occurred = TRUE;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
186
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 static void save_err_ptr_str( const void *ptr )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 char ptr_buf[19]; /* 0x<pointer> up to 64 bits. */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
190
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 #ifdef _MSC_VER
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 /* Supress warning C4996: 'sprintf': This function or variable may be unsafe */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 #pragma warning( suppress: 4996 )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 #endif
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 sprintf( ptr_buf, "0x%p", ptr );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
196
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 save_err_str( ptr_buf );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
199
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 /* Load Psapi.dll at runtime, this avoids linking caveat */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 static BOOL MyEnumProcessModules( HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 static BOOL (WINAPI *EnumProcessModulesPtr)(HANDLE, HMODULE *, DWORD, LPDWORD);
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 HMODULE psapi;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
205
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 if( !EnumProcessModulesPtr )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 psapi = LoadLibraryA( "Psapi.dll" );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 if( psapi )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 EnumProcessModulesPtr = (BOOL (WINAPI *)(HANDLE, HMODULE *, DWORD, LPDWORD)) GetProcAddress( psapi, "EnumProcessModules" );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 if( !EnumProcessModulesPtr )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 return 0;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
214
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 return EnumProcessModulesPtr( hProcess, lphModule, cb, lpcbNeeded );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
217
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 void *dlopen( const char *file, int mode )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 HMODULE hModule;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 UINT uMode;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
222
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 error_occurred = FALSE;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
224
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 /* Do not let Windows display the critical-error-handler message box */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 uMode = SetErrorMode( SEM_FAILCRITICALERRORS );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
227
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 if( file == 0 )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 /* POSIX says that if the value of file is 0, a handle on a global
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 * symbol object must be provided. That object must be able to access
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 * all symbols from the original program file, and any objects loaded
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 * with the RTLD_GLOBAL flag.
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 * The return value from GetModuleHandle( ) allows us to retrieve
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 * symbols only from the original program file. EnumProcessModules() is
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 * used to access symbols from other libraries. For objects loaded
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 * with the RTLD_LOCAL flag, we create our own list later on. They are
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 * excluded from EnumProcessModules() iteration.
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 hModule = GetModuleHandle( NULL );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
241
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 if( !hModule )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 save_err_str( "(null)" );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 else
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 HANDLE hCurrentProc;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 DWORD dwProcModsBefore, dwProcModsAfter;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 char lpFileName[MAX_PATH];
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 size_t i, len;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
251
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 len = strlen( file );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
253
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 if( len >= sizeof( lpFileName ) )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 SetLastError( ERROR_FILENAME_EXCED_RANGE );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 save_err_str( file );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 hModule = NULL;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 else
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 /* MSDN says backslashes *must* be used instead of forward slashes. */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 for( i = 0; i < len; i++ )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 if( file[i] == '/' )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 lpFileName[i] = '\\';
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 else
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
268 lpFileName[i] = file[i];
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 lpFileName[len] = '\0';
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
271
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 hCurrentProc = GetCurrentProcess( );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
273
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 if( MyEnumProcessModules( hCurrentProc, NULL, 0, &dwProcModsBefore ) == 0 )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
275 dwProcModsBefore = 0;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
276
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
277 /* POSIX says the search path is implementation-defined.
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 * LOAD_WITH_ALTERED_SEARCH_PATH is used to make it behave more closely
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 * to UNIX's search paths (start with system folders instead of current
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
280 * folder).
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 hModule = LoadLibraryExA( lpFileName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
283
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 if( !hModule )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 save_err_str( lpFileName );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 else
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
289 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 if( MyEnumProcessModules( hCurrentProc, NULL, 0, &dwProcModsAfter ) == 0 )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 dwProcModsAfter = 0;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
292
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
293 /* If the object was loaded with RTLD_LOCAL, add it to list of local
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 * objects, so that its symbols cannot be retrieved even if the handle for
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
295 * the original program file is passed. POSIX says that if the same
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
296 * file is specified in multiple invocations, and any of them are
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
297 * RTLD_GLOBAL, even if any further invocations use RTLD_LOCAL, the
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
298 * symbols will remain global. If number of loaded modules was not
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
299 * changed after calling LoadLibraryEx(), it means that library was
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
300 * already loaded.
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
301 */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
302 if( (mode & RTLD_LOCAL) && dwProcModsBefore != dwProcModsAfter )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
303 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
304 if( !local_add( hModule ) )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
306 save_err_str( lpFileName );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
307 FreeLibrary( hModule );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
308 hModule = NULL;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
309 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
310 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
311 else if( !(mode & RTLD_LOCAL) && dwProcModsBefore == dwProcModsAfter )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
313 local_rem( hModule );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
314 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
315 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
316 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
317 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
318
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
319 /* Return to previous state of the error-mode bit flags. */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
320 SetErrorMode( uMode );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
321
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
322 return (void *) hModule;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
323 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
324
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
325 int dlclose( void *handle )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
326 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
327 HMODULE hModule = (HMODULE) handle;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
328 BOOL ret;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
329
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
330 error_occurred = FALSE;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
331
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
332 ret = FreeLibrary( hModule );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
333
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
334 /* If the object was loaded with RTLD_LOCAL, remove it from list of local
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
335 * objects.
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
336 */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
337 if( ret )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
338 local_rem( hModule );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
339 else
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
340 save_err_ptr_str( handle );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
341
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
342 /* dlclose's return value in inverted in relation to FreeLibrary's. */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
343 ret = !ret;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
344
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
345 return (int) ret;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
346 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
347
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
348 __declspec(noinline) /* Needed for _ReturnAddress() */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
349 void *dlsym( void *handle, const char *name )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
350 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
351 FARPROC symbol;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
352 HMODULE hCaller;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
353 HMODULE hModule;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
354 HANDLE hCurrentProc;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
355
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
356 error_occurred = FALSE;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
357
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
358 symbol = NULL;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
359 hCaller = NULL;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
360 hModule = GetModuleHandle( NULL );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
361 hCurrentProc = GetCurrentProcess( );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
362
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
363 if( handle == RTLD_DEFAULT )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
364 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
365 /* The symbol lookup happens in the normal global scope; that is,
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
366 * a search for a symbol using this handle would find the same
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
367 * definition as a direct use of this symbol in the program code.
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
368 * So use same lookup procedure as when filename is NULL.
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
369 */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
370 handle = hModule;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
371 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
372 else if( handle == RTLD_NEXT )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
373 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
374 /* Specifies the next object after this one that defines name.
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
375 * This one refers to the object containing the invocation of dlsym().
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
376 * The next object is the one found upon the application of a load
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
377 * order symbol resolution algorithm. To get caller function of dlsym()
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
378 * use _ReturnAddress() intrinsic. To get HMODULE of caller function
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
379 * use standard GetModuleHandleExA() function.
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
380 */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
381 if( !GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCSTR) _ReturnAddress( ), &hCaller ) )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
382 goto end;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
383 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
384
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
385 if( handle != RTLD_NEXT )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
386 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
387 symbol = GetProcAddress( (HMODULE) handle, name );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
388
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
389 if( symbol != NULL )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
390 goto end;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
391 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
392
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
393 /* If the handle for the original program file is passed, also search
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
394 * in all globally loaded objects.
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
395 */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
396
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
397 if( hModule == handle || handle == RTLD_NEXT )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
398 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
399 HMODULE *modules;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
400 DWORD cbNeeded;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
401 DWORD dwSize;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
402 size_t i;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
403
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
404 /* GetModuleHandle( NULL ) only returns the current program file. So
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
405 * if we want to get ALL loaded module including those in linked DLLs,
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
406 * we have to use EnumProcessModules( ).
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
407 */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
408 if( MyEnumProcessModules( hCurrentProc, NULL, 0, &dwSize ) != 0 )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
409 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
410 modules = malloc( dwSize );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
411 if( modules )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
412 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
413 if( MyEnumProcessModules( hCurrentProc, modules, dwSize, &cbNeeded ) != 0 && dwSize == cbNeeded )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
414 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
415 for( i = 0; i < dwSize / sizeof( HMODULE ); i++ )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
416 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
417 if( handle == RTLD_NEXT && hCaller )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
418 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
419 /* Next modules can be used for RTLD_NEXT */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
420 if( hCaller == modules[i] )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
421 hCaller = NULL;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
422 continue;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
423 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
424 if( local_search( modules[i] ) )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
425 continue;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
426 symbol = GetProcAddress( modules[i], name );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
427 if( symbol != NULL )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
428 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
429 free( modules );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
430 goto end;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
431 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
432 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
433
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
434 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
435 free( modules );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
436 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
437 else
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
438 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
439 SetLastError( ERROR_NOT_ENOUGH_MEMORY );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
440 goto end;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
441 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
442 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
443 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
444
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
445 end:
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
446 if( symbol == NULL )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
447 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
448 if( GetLastError() == 0 )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
449 SetLastError( ERROR_PROC_NOT_FOUND );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
450 save_err_str( name );
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
451 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
452
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
453 return *(void **) (&symbol);
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
454 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
455
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
456 char *dlerror( void )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
457 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
458 /* If this is the second consecutive call to dlerror, return NULL */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
459 if( !error_occurred )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
460 return NULL;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
461
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
462 /* POSIX says that invoking dlerror( ) a second time, immediately following
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
463 * a prior invocation, shall result in NULL being returned.
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
464 */
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
465 error_occurred = FALSE;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
466
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
467 return error_buffer;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
468 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
469
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
470 #ifdef SHARED
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
471 BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
472 {
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
473 (void) hinstDLL;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
474 (void) fdwReason;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
475 (void) lpvReserved;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
476 return TRUE;
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
477 }
21a91311c8ea cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff changeset
478 #endif