OLD | NEW |
1 /* dso_win32.c -*- mode:C; c-file-style: "eay" -*- */ | 1 /* dso_win32.c -*- mode:C; c-file-style: "eay" -*- */ |
2 /* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL | 2 /* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL |
3 * project 2000. | 3 * project 2000. |
4 */ | 4 */ |
5 /* ==================================================================== | 5 /* ==================================================================== |
6 * Copyright (c) 2000 The OpenSSL Project. All rights reserved. | 6 * Copyright (c) 2000 The OpenSSL Project. All rights reserved. |
7 * | 7 * |
8 * Redistribution and use in source and binary forms, with or without | 8 * Redistribution and use in source and binary forms, with or without |
9 * modification, are permitted provided that the following conditions | 9 * modification, are permitted provided that the following conditions |
10 * are met: | 10 * are met: |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 static HINSTANCE LoadLibraryA(LPCSTR lpLibFileName) | 89 static HINSTANCE LoadLibraryA(LPCSTR lpLibFileName) |
90 { | 90 { |
91 WCHAR *fnamw; | 91 WCHAR *fnamw; |
92 size_t len_0=strlen(lpLibFileName)+1,i; | 92 size_t len_0=strlen(lpLibFileName)+1,i; |
93 | 93 |
94 #ifdef _MSC_VER | 94 #ifdef _MSC_VER |
95 fnamw = (WCHAR *)_alloca (len_0*sizeof(WCHAR)); | 95 fnamw = (WCHAR *)_alloca (len_0*sizeof(WCHAR)); |
96 #else | 96 #else |
97 fnamw = (WCHAR *)alloca (len_0*sizeof(WCHAR)); | 97 fnamw = (WCHAR *)alloca (len_0*sizeof(WCHAR)); |
98 #endif | 98 #endif |
99 » if (fnamw == NULL) return NULL; | 99 » if (fnamw == NULL) |
| 100 » » { |
| 101 » » SetLastError(ERROR_NOT_ENOUGH_MEMORY); |
| 102 » » return NULL; |
| 103 » » } |
100 | 104 |
101 #if defined(_WIN32_WCE) && _WIN32_WCE>=101 | 105 #if defined(_WIN32_WCE) && _WIN32_WCE>=101 |
102 if (!MultiByteToWideChar(CP_ACP,0,lpLibFileName,len_0,fnamw,len_0)) | 106 if (!MultiByteToWideChar(CP_ACP,0,lpLibFileName,len_0,fnamw,len_0)) |
103 #endif | 107 #endif |
104 for (i=0;i<len_0;i++) fnamw[i]=(WCHAR)lpLibFileName[i]; | 108 for (i=0;i<len_0;i++) fnamw[i]=(WCHAR)lpLibFileName[i]; |
105 | 109 |
106 return LoadLibraryW(fnamw); | 110 return LoadLibraryW(fnamw); |
107 } | 111 } |
108 #endif | 112 #endif |
109 | 113 |
110 /* Part of the hack in "win32_load" ... */ | 114 /* Part of the hack in "win32_load" ... */ |
111 #define DSO_MAX_TRANSLATED_SIZE 256 | 115 #define DSO_MAX_TRANSLATED_SIZE 256 |
112 | 116 |
113 static int win32_load(DSO *dso); | 117 static int win32_load(DSO *dso); |
114 static int win32_unload(DSO *dso); | 118 static int win32_unload(DSO *dso); |
115 static void *win32_bind_var(DSO *dso, const char *symname); | 119 static void *win32_bind_var(DSO *dso, const char *symname); |
116 static DSO_FUNC_TYPE win32_bind_func(DSO *dso, const char *symname); | 120 static DSO_FUNC_TYPE win32_bind_func(DSO *dso, const char *symname); |
117 #if 0 | 121 #if 0 |
118 static int win32_unbind_var(DSO *dso, char *symname, void *symptr); | 122 static int win32_unbind_var(DSO *dso, char *symname, void *symptr); |
119 static int win32_unbind_func(DSO *dso, char *symname, DSO_FUNC_TYPE symptr); | 123 static int win32_unbind_func(DSO *dso, char *symname, DSO_FUNC_TYPE symptr); |
120 static int win32_init(DSO *dso); | 124 static int win32_init(DSO *dso); |
121 static int win32_finish(DSO *dso); | 125 static int win32_finish(DSO *dso); |
122 static long win32_ctrl(DSO *dso, int cmd, long larg, void *parg); | 126 static long win32_ctrl(DSO *dso, int cmd, long larg, void *parg); |
123 #endif | 127 #endif |
124 static char *win32_name_converter(DSO *dso, const char *filename); | 128 static char *win32_name_converter(DSO *dso, const char *filename); |
125 static char *win32_merger(DSO *dso, const char *filespec1, | 129 static char *win32_merger(DSO *dso, const char *filespec1, |
126 const char *filespec2); | 130 const char *filespec2); |
| 131 static int win32_pathbyaddr(void *addr,char *path,int sz); |
| 132 static void *win32_globallookup(const char *name); |
127 | 133 |
128 static const char *openssl_strnchr(const char *string, int c, size_t len); | 134 static const char *openssl_strnchr(const char *string, int c, size_t len); |
129 | 135 |
130 static DSO_METHOD dso_meth_win32 = { | 136 static DSO_METHOD dso_meth_win32 = { |
131 "OpenSSL 'win32' shared library method", | 137 "OpenSSL 'win32' shared library method", |
132 win32_load, | 138 win32_load, |
133 win32_unload, | 139 win32_unload, |
134 win32_bind_var, | 140 win32_bind_var, |
135 win32_bind_func, | 141 win32_bind_func, |
136 /* For now, "unbind" doesn't exist */ | 142 /* For now, "unbind" doesn't exist */ |
137 #if 0 | 143 #if 0 |
138 NULL, /* unbind_var */ | 144 NULL, /* unbind_var */ |
139 NULL, /* unbind_func */ | 145 NULL, /* unbind_func */ |
140 #endif | 146 #endif |
141 NULL, /* ctrl */ | 147 NULL, /* ctrl */ |
142 win32_name_converter, | 148 win32_name_converter, |
143 win32_merger, | 149 win32_merger, |
144 NULL, /* init */ | 150 NULL, /* init */ |
145 » NULL /* finish */ | 151 » NULL, /* finish */ |
| 152 » win32_pathbyaddr, |
| 153 » win32_globallookup |
146 }; | 154 }; |
147 | 155 |
148 DSO_METHOD *DSO_METHOD_win32(void) | 156 DSO_METHOD *DSO_METHOD_win32(void) |
149 { | 157 { |
150 return(&dso_meth_win32); | 158 return(&dso_meth_win32); |
151 } | 159 } |
152 | 160 |
153 /* For this DSO_METHOD, our meth_data STACK will contain; | 161 /* For this DSO_METHOD, our meth_data STACK will contain; |
154 * (i) a pointer to the handle (HINSTANCE) returned from | 162 * (i) a pointer to the handle (HINSTANCE) returned from |
155 * LoadLibrary(), and copied. | 163 * LoadLibrary(), and copied. |
(...skipping 17 matching lines...) Expand all Loading... |
173 ERR_add_error_data(3, "filename(", filename, ")"); | 181 ERR_add_error_data(3, "filename(", filename, ")"); |
174 goto err; | 182 goto err; |
175 } | 183 } |
176 p = (HINSTANCE *)OPENSSL_malloc(sizeof(HINSTANCE)); | 184 p = (HINSTANCE *)OPENSSL_malloc(sizeof(HINSTANCE)); |
177 if(p == NULL) | 185 if(p == NULL) |
178 { | 186 { |
179 DSOerr(DSO_F_WIN32_LOAD,ERR_R_MALLOC_FAILURE); | 187 DSOerr(DSO_F_WIN32_LOAD,ERR_R_MALLOC_FAILURE); |
180 goto err; | 188 goto err; |
181 } | 189 } |
182 *p = h; | 190 *p = h; |
183 » if(!sk_push(dso->meth_data, (char *)p)) | 191 » if(!sk_void_push(dso->meth_data, p)) |
184 { | 192 { |
185 DSOerr(DSO_F_WIN32_LOAD,DSO_R_STACK_ERROR); | 193 DSOerr(DSO_F_WIN32_LOAD,DSO_R_STACK_ERROR); |
186 goto err; | 194 goto err; |
187 } | 195 } |
188 /* Success */ | 196 /* Success */ |
189 dso->loaded_filename = filename; | 197 dso->loaded_filename = filename; |
190 return(1); | 198 return(1); |
191 err: | 199 err: |
192 /* Cleanup !*/ | 200 /* Cleanup !*/ |
193 if(filename != NULL) | 201 if(filename != NULL) |
194 OPENSSL_free(filename); | 202 OPENSSL_free(filename); |
195 if(p != NULL) | 203 if(p != NULL) |
196 OPENSSL_free(p); | 204 OPENSSL_free(p); |
197 if(h != NULL) | 205 if(h != NULL) |
198 FreeLibrary(h); | 206 FreeLibrary(h); |
199 return(0); | 207 return(0); |
200 } | 208 } |
201 | 209 |
202 static int win32_unload(DSO *dso) | 210 static int win32_unload(DSO *dso) |
203 { | 211 { |
204 HINSTANCE *p; | 212 HINSTANCE *p; |
205 if(dso == NULL) | 213 if(dso == NULL) |
206 { | 214 { |
207 DSOerr(DSO_F_WIN32_UNLOAD,ERR_R_PASSED_NULL_PARAMETER); | 215 DSOerr(DSO_F_WIN32_UNLOAD,ERR_R_PASSED_NULL_PARAMETER); |
208 return(0); | 216 return(0); |
209 } | 217 } |
210 » if(sk_num(dso->meth_data) < 1) | 218 » if(sk_void_num(dso->meth_data) < 1) |
211 return(1); | 219 return(1); |
212 » p = (HINSTANCE *)sk_pop(dso->meth_data); | 220 » p = sk_void_pop(dso->meth_data); |
213 if(p == NULL) | 221 if(p == NULL) |
214 { | 222 { |
215 DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_NULL_HANDLE); | 223 DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_NULL_HANDLE); |
216 return(0); | 224 return(0); |
217 } | 225 } |
218 if(!FreeLibrary(*p)) | 226 if(!FreeLibrary(*p)) |
219 { | 227 { |
220 DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_UNLOAD_FAILED); | 228 DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_UNLOAD_FAILED); |
221 /* We should push the value back onto the stack in | 229 /* We should push the value back onto the stack in |
222 * case of a retry. */ | 230 * case of a retry. */ |
223 » » sk_push(dso->meth_data, (char *)p); | 231 » » sk_void_push(dso->meth_data, p); |
224 return(0); | 232 return(0); |
225 } | 233 } |
226 /* Cleanup */ | 234 /* Cleanup */ |
227 OPENSSL_free(p); | 235 OPENSSL_free(p); |
228 return(1); | 236 return(1); |
229 } | 237 } |
230 | 238 |
231 /* Using GetProcAddress for variables? TODO: Check this out in | 239 /* Using GetProcAddress for variables? TODO: Check this out in |
232 * the Win32 API docs, there's probably a variant for variables. */ | 240 * the Win32 API docs, there's probably a variant for variables. */ |
233 static void *win32_bind_var(DSO *dso, const char *symname) | 241 static void *win32_bind_var(DSO *dso, const char *symname) |
234 { | 242 { |
235 HINSTANCE *ptr; | 243 HINSTANCE *ptr; |
236 void *sym; | 244 void *sym; |
237 | 245 |
238 if((dso == NULL) || (symname == NULL)) | 246 if((dso == NULL) || (symname == NULL)) |
239 { | 247 { |
240 DSOerr(DSO_F_WIN32_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER); | 248 DSOerr(DSO_F_WIN32_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER); |
241 return(NULL); | 249 return(NULL); |
242 } | 250 } |
243 » if(sk_num(dso->meth_data) < 1) | 251 » if(sk_void_num(dso->meth_data) < 1) |
244 { | 252 { |
245 DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_STACK_ERROR); | 253 DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_STACK_ERROR); |
246 return(NULL); | 254 return(NULL); |
247 } | 255 } |
248 » ptr = (HINSTANCE *)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1); | 256 » ptr = sk_void_value(dso->meth_data, sk_void_num(dso->meth_data) - 1); |
249 if(ptr == NULL) | 257 if(ptr == NULL) |
250 { | 258 { |
251 DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_NULL_HANDLE); | 259 DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_NULL_HANDLE); |
252 return(NULL); | 260 return(NULL); |
253 } | 261 } |
254 sym = GetProcAddress(*ptr, symname); | 262 sym = GetProcAddress(*ptr, symname); |
255 if(sym == NULL) | 263 if(sym == NULL) |
256 { | 264 { |
257 DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_SYM_FAILURE); | 265 DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_SYM_FAILURE); |
258 ERR_add_error_data(3, "symname(", symname, ")"); | 266 ERR_add_error_data(3, "symname(", symname, ")"); |
259 return(NULL); | 267 return(NULL); |
260 } | 268 } |
261 return(sym); | 269 return(sym); |
262 } | 270 } |
263 | 271 |
264 static DSO_FUNC_TYPE win32_bind_func(DSO *dso, const char *symname) | 272 static DSO_FUNC_TYPE win32_bind_func(DSO *dso, const char *symname) |
265 { | 273 { |
266 HINSTANCE *ptr; | 274 HINSTANCE *ptr; |
267 void *sym; | 275 void *sym; |
268 | 276 |
269 if((dso == NULL) || (symname == NULL)) | 277 if((dso == NULL) || (symname == NULL)) |
270 { | 278 { |
271 DSOerr(DSO_F_WIN32_BIND_FUNC,ERR_R_PASSED_NULL_PARAMETER); | 279 DSOerr(DSO_F_WIN32_BIND_FUNC,ERR_R_PASSED_NULL_PARAMETER); |
272 return(NULL); | 280 return(NULL); |
273 } | 281 } |
274 » if(sk_num(dso->meth_data) < 1) | 282 » if(sk_void_num(dso->meth_data) < 1) |
275 { | 283 { |
276 DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_STACK_ERROR); | 284 DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_STACK_ERROR); |
277 return(NULL); | 285 return(NULL); |
278 } | 286 } |
279 » ptr = (HINSTANCE *)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1); | 287 » ptr = sk_void_value(dso->meth_data, sk_void_num(dso->meth_data) - 1); |
280 if(ptr == NULL) | 288 if(ptr == NULL) |
281 { | 289 { |
282 DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_NULL_HANDLE); | 290 DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_NULL_HANDLE); |
283 return(NULL); | 291 return(NULL); |
284 } | 292 } |
285 sym = GetProcAddress(*ptr, symname); | 293 sym = GetProcAddress(*ptr, symname); |
286 if(sym == NULL) | 294 if(sym == NULL) |
287 { | 295 { |
288 DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_SYM_FAILURE); | 296 DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_SYM_FAILURE); |
289 ERR_add_error_data(3, "symname(", symname, ")"); | 297 ERR_add_error_data(3, "symname(", symname, ")"); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 case ':': | 352 case ':': |
345 if(position != IN_DEVICE) | 353 if(position != IN_DEVICE) |
346 { | 354 { |
347 DSOerr(DSO_F_WIN32_SPLITTER, | 355 DSOerr(DSO_F_WIN32_SPLITTER, |
348 DSO_R_INCORRECT_FILE_SYNTAX); | 356 DSO_R_INCORRECT_FILE_SYNTAX); |
349 /*goto err;*/ | 357 /*goto err;*/ |
350 OPENSSL_free(result); | 358 OPENSSL_free(result); |
351 return(NULL); | 359 return(NULL); |
352 } | 360 } |
353 result->device = start; | 361 result->device = start; |
354 » » » result->devicelen = filename - start; | 362 » » » result->devicelen = (int)(filename - start); |
355 position = IN_FILE; | 363 position = IN_FILE; |
356 start = ++filename; | 364 start = ++filename; |
357 result->dir = start; | 365 result->dir = start; |
358 break; | 366 break; |
359 case '\\': | 367 case '\\': |
360 case '/': | 368 case '/': |
361 if(position == IN_NODE) | 369 if(position == IN_NODE) |
362 { | 370 { |
363 » » » » result->nodelen = filename - start; | 371 » » » » result->nodelen = (int)(filename - start); |
364 position = IN_FILE; | 372 position = IN_FILE; |
365 start = ++filename; | 373 start = ++filename; |
366 result->dir = start; | 374 result->dir = start; |
367 } | 375 } |
368 else if(position == IN_DEVICE) | 376 else if(position == IN_DEVICE) |
369 { | 377 { |
370 position = IN_FILE; | 378 position = IN_FILE; |
371 filename++; | 379 filename++; |
372 result->dir = start; | 380 result->dir = start; |
373 » » » » result->dirlen = filename - start; | 381 » » » » result->dirlen = (int)(filename - start); |
374 start = filename; | 382 start = filename; |
375 } | 383 } |
376 else | 384 else |
377 { | 385 { |
378 filename++; | 386 filename++; |
379 » » » » result->dirlen += filename - start; | 387 » » » » result->dirlen += (int)(filename - start); |
380 start = filename; | 388 start = filename; |
381 } | 389 } |
382 break; | 390 break; |
383 case '\0': | 391 case '\0': |
384 if(position == IN_NODE) | 392 if(position == IN_NODE) |
385 { | 393 { |
386 » » » » result->nodelen = filename - start; | 394 » » » » result->nodelen = (int)(filename - start); |
387 } | 395 } |
388 else | 396 else |
389 { | 397 { |
390 if(filename - start > 0) | 398 if(filename - start > 0) |
391 { | 399 { |
392 if (assume_last_is_dir) | 400 if (assume_last_is_dir) |
393 { | 401 { |
394 if (position == IN_DEVICE) | 402 if (position == IN_DEVICE) |
395 { | 403 { |
396 result->dir = start; | 404 result->dir = start; |
397 result->dirlen = 0; | 405 result->dirlen = 0; |
398 } | 406 } |
399 result->dirlen += | 407 result->dirlen += |
400 » » » » » » » filename - start; | 408 » » » » » » » (int)(filename - start); |
401 } | 409 } |
402 else | 410 else |
403 { | 411 { |
404 result->file = start; | 412 result->file = start; |
405 result->filelen = | 413 result->filelen = |
406 » » » » » » » filename - start; | 414 » » » » » » » (int)(filename - start); |
407 } | 415 } |
408 } | 416 } |
409 } | 417 } |
410 break; | 418 break; |
411 default: | 419 default: |
412 filename++; | 420 filename++; |
413 break; | 421 break; |
414 } | 422 } |
415 } | 423 } |
416 while(last); | 424 while(last); |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
490 start = file_split->predir; | 498 start = file_split->predir; |
491 while(file_split->predirlen > (start - file_split->predir)) | 499 while(file_split->predirlen > (start - file_split->predir)) |
492 { | 500 { |
493 const char *end = openssl_strnchr(start, '/', | 501 const char *end = openssl_strnchr(start, '/', |
494 file_split->predirlen - (start - file_split->predir)); | 502 file_split->predirlen - (start - file_split->predir)); |
495 if(!end) | 503 if(!end) |
496 end = start | 504 end = start |
497 + file_split->predirlen | 505 + file_split->predirlen |
498 - (start - file_split->predir); | 506 - (start - file_split->predir); |
499 strncpy(&result[offset], start, | 507 strncpy(&result[offset], start, |
500 » » » end - start); offset += end - start; | 508 » » » end - start); offset += (int)(end - start); |
501 result[offset] = '\\'; offset++; | 509 result[offset] = '\\'; offset++; |
502 start = end + 1; | 510 start = end + 1; |
503 } | 511 } |
504 #if 0 /* Not needed, since the directory converter above already appeneded | 512 #if 0 /* Not needed, since the directory converter above already appeneded |
505 a backslash */ | 513 a backslash */ |
506 if(file_split->predir && (file_split->dir || file_split->file)) | 514 if(file_split->predir && (file_split->dir || file_split->file)) |
507 { | 515 { |
508 result[offset] = '\\'; offset++; | 516 result[offset] = '\\'; offset++; |
509 } | 517 } |
510 #endif | 518 #endif |
511 start = file_split->dir; | 519 start = file_split->dir; |
512 while(file_split->dirlen > (start - file_split->dir)) | 520 while(file_split->dirlen > (start - file_split->dir)) |
513 { | 521 { |
514 const char *end = openssl_strnchr(start, '/', | 522 const char *end = openssl_strnchr(start, '/', |
515 file_split->dirlen - (start - file_split->dir)); | 523 file_split->dirlen - (start - file_split->dir)); |
516 if(!end) | 524 if(!end) |
517 end = start | 525 end = start |
518 + file_split->dirlen | 526 + file_split->dirlen |
519 - (start - file_split->dir); | 527 - (start - file_split->dir); |
520 strncpy(&result[offset], start, | 528 strncpy(&result[offset], start, |
521 » » » end - start); offset += end - start; | 529 » » » end - start); offset += (int)(end - start); |
522 result[offset] = '\\'; offset++; | 530 result[offset] = '\\'; offset++; |
523 start = end + 1; | 531 start = end + 1; |
524 } | 532 } |
525 #if 0 /* Not needed, since the directory converter above already appeneded | 533 #if 0 /* Not needed, since the directory converter above already appeneded |
526 a backslash */ | 534 a backslash */ |
527 if(file_split->dir && file_split->file) | 535 if(file_split->dir && file_split->file) |
528 { | 536 { |
529 result[offset] = '\\'; offset++; | 537 result[offset] = '\\'; offset++; |
530 } | 538 } |
531 #endif | 539 #endif |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
652 size_t i; | 660 size_t i; |
653 const char *p; | 661 const char *p; |
654 for (i = 0, p = string; i < len && *p; i++, p++) | 662 for (i = 0, p = string; i < len && *p; i++, p++) |
655 { | 663 { |
656 if (*p == c) | 664 if (*p == c) |
657 return p; | 665 return p; |
658 } | 666 } |
659 return NULL; | 667 return NULL; |
660 } | 668 } |
661 | 669 |
| 670 #include <tlhelp32.h> |
| 671 #ifdef _WIN32_WCE |
| 672 # define DLLNAME "TOOLHELP.DLL" |
| 673 #else |
| 674 # ifdef MODULEENTRY32 |
| 675 # undef MODULEENTRY32 /* unmask the ASCII version! */ |
| 676 # endif |
| 677 # define DLLNAME "KERNEL32.DLL" |
| 678 #endif |
662 | 679 |
663 #endif /* OPENSSL_SYS_WIN32 */ | 680 typedef HANDLE (WINAPI *CREATETOOLHELP32SNAPSHOT)(DWORD, DWORD); |
| 681 typedef BOOL (WINAPI *CLOSETOOLHELP32SNAPSHOT)(HANDLE); |
| 682 typedef BOOL (WINAPI *MODULE32)(HANDLE, MODULEENTRY32 *); |
| 683 |
| 684 static int win32_pathbyaddr(void *addr,char *path,int sz) |
| 685 » { |
| 686 » HMODULE dll; |
| 687 » HANDLE hModuleSnap = INVALID_HANDLE_VALUE; |
| 688 » MODULEENTRY32 me32; |
| 689 » CREATETOOLHELP32SNAPSHOT create_snap; |
| 690 » CLOSETOOLHELP32SNAPSHOT close_snap; |
| 691 » MODULE32 module_first, module_next; |
| 692 » int len; |
| 693 |
| 694 » if (addr == NULL) |
| 695 » » { |
| 696 » » union» { int(*f)(void*,char*,int); void *p; } t = |
| 697 » » » { win32_pathbyaddr }; |
| 698 » » addr = t.p; |
| 699 » » } |
| 700 |
| 701 » dll = LoadLibrary(TEXT(DLLNAME)); |
| 702 » if (dll == NULL) |
| 703 » » { |
| 704 » » DSOerr(DSO_F_WIN32_PATHBYADDR,DSO_R_UNSUPPORTED); |
| 705 » » return -1; |
| 706 » » } |
| 707 |
| 708 » create_snap = (CREATETOOLHELP32SNAPSHOT) |
| 709 » » GetProcAddress(dll,"CreateToolhelp32Snapshot"); |
| 710 » if (create_snap == NULL) |
| 711 » » { |
| 712 » » FreeLibrary(dll); |
| 713 » » DSOerr(DSO_F_WIN32_PATHBYADDR,DSO_R_UNSUPPORTED); |
| 714 » » return -1; |
| 715 » » } |
| 716 » /* We take the rest for granted... */ |
| 717 #ifdef _WIN32_WCE |
| 718 » close_snap = (CLOSETOOLHELP32SNAPSHOT) |
| 719 » » GetProcAddress(dll,"CloseToolhelp32Snapshot"); |
| 720 #else |
| 721 » close_snap = (CLOSETOOLHELP32SNAPSHOT)CloseHandle; |
| 722 #endif |
| 723 » module_first = (MODULE32)GetProcAddress(dll,"Module32First"); |
| 724 » module_next = (MODULE32)GetProcAddress(dll,"Module32Next"); |
| 725 |
| 726 » hModuleSnap = (*create_snap)(TH32CS_SNAPMODULE,0); |
| 727 » if( hModuleSnap == INVALID_HANDLE_VALUE ) |
| 728 » » { |
| 729 » » FreeLibrary(dll); |
| 730 » » DSOerr(DSO_F_WIN32_PATHBYADDR,DSO_R_UNSUPPORTED); |
| 731 » » return -1; |
| 732 » » } |
| 733 |
| 734 » me32.dwSize = sizeof(me32); |
| 735 |
| 736 » if(!(*module_first)(hModuleSnap,&me32)) |
| 737 » » { |
| 738 » » (*close_snap)(hModuleSnap); |
| 739 » » FreeLibrary(dll); |
| 740 » » DSOerr(DSO_F_WIN32_PATHBYADDR,DSO_R_FAILURE); |
| 741 » » return -1; |
| 742 » » } |
| 743 |
| 744 » do» { |
| 745 » » if ((BYTE *)addr >= me32.modBaseAddr && |
| 746 » » (BYTE *)addr < me32.modBaseAddr+me32.modBaseSize) |
| 747 » » » { |
| 748 » » » (*close_snap)(hModuleSnap); |
| 749 » » » FreeLibrary(dll); |
| 750 #ifdef _WIN32_WCE |
| 751 # if _WIN32_WCE >= 101 |
| 752 » » » return WideCharToMultiByte(CP_ACP,0,me32.szExePath,-1, |
| 753 » » » » » » » path,sz,NULL,NULL); |
| 754 # else |
| 755 » » » len = (int)wcslen(me32.szExePath); |
| 756 » » » if (sz <= 0) return len+1; |
| 757 » » » if (len >= sz) len=sz-1; |
| 758 » » » for(i=0;i<len;i++) |
| 759 » » » » path[i] = (char)me32.szExePath[i]; |
| 760 » » » path[len++] = 0; |
| 761 » » » return len; |
| 762 # endif |
| 763 #else |
| 764 » » » len = (int)strlen(me32.szExePath); |
| 765 » » » if (sz <= 0) return len+1; |
| 766 » » » if (len >= sz) len=sz-1; |
| 767 » » » memcpy(path,me32.szExePath,len); |
| 768 » » » path[len++] = 0; |
| 769 » » » return len; |
| 770 #endif |
| 771 » » » } |
| 772 » » } while((*module_next)(hModuleSnap, &me32)); |
| 773 |
| 774 » (*close_snap)(hModuleSnap); |
| 775 » FreeLibrary(dll); |
| 776 » return 0; |
| 777 » } |
| 778 |
| 779 static void *win32_globallookup(const char *name) |
| 780 » { |
| 781 » HMODULE dll; |
| 782 » HANDLE hModuleSnap = INVALID_HANDLE_VALUE; |
| 783 » MODULEENTRY32 me32; |
| 784 » CREATETOOLHELP32SNAPSHOT create_snap; |
| 785 » CLOSETOOLHELP32SNAPSHOT close_snap; |
| 786 » MODULE32 module_first, module_next; |
| 787 » FARPROC ret=NULL; |
| 788 |
| 789 » dll = LoadLibrary(TEXT(DLLNAME)); |
| 790 » if (dll == NULL) |
| 791 » » { |
| 792 » » DSOerr(DSO_F_WIN32_GLOBALLOOKUP,DSO_R_UNSUPPORTED); |
| 793 » » return NULL; |
| 794 » » } |
| 795 |
| 796 » create_snap = (CREATETOOLHELP32SNAPSHOT) |
| 797 » » GetProcAddress(dll,"CreateToolhelp32Snapshot"); |
| 798 » if (create_snap == NULL) |
| 799 » » { |
| 800 » » FreeLibrary(dll); |
| 801 » » DSOerr(DSO_F_WIN32_GLOBALLOOKUP,DSO_R_UNSUPPORTED); |
| 802 » » return NULL; |
| 803 » » } |
| 804 » /* We take the rest for granted... */ |
| 805 #ifdef _WIN32_WCE |
| 806 » close_snap = (CLOSETOOLHELP32SNAPSHOT) |
| 807 » » GetProcAddress(dll,"CloseToolhelp32Snapshot"); |
| 808 #else |
| 809 » close_snap = (CLOSETOOLHELP32SNAPSHOT)CloseHandle; |
| 810 #endif |
| 811 » module_first = (MODULE32)GetProcAddress(dll,"Module32First"); |
| 812 » module_next = (MODULE32)GetProcAddress(dll,"Module32Next"); |
| 813 |
| 814 » hModuleSnap = (*create_snap)(TH32CS_SNAPMODULE,0); |
| 815 » if( hModuleSnap == INVALID_HANDLE_VALUE ) |
| 816 » » { |
| 817 » » FreeLibrary(dll); |
| 818 » » DSOerr(DSO_F_WIN32_GLOBALLOOKUP,DSO_R_UNSUPPORTED); |
| 819 » » return NULL; |
| 820 » » } |
| 821 |
| 822 » me32.dwSize = sizeof(me32); |
| 823 |
| 824 » if (!(*module_first)(hModuleSnap,&me32)) |
| 825 » » { |
| 826 » » (*close_snap)(hModuleSnap); |
| 827 » » FreeLibrary(dll); |
| 828 » » return NULL; |
| 829 » » } |
| 830 |
| 831 » do» { |
| 832 » » if ((ret = GetProcAddress(me32.hModule,name))) |
| 833 » » » { |
| 834 » » » (*close_snap)(hModuleSnap); |
| 835 » » » FreeLibrary(dll); |
| 836 » » » return ret; |
| 837 » » » } |
| 838 » » } while((*module_next)(hModuleSnap,&me32)); |
| 839 |
| 840 » (*close_snap)(hModuleSnap); |
| 841 » FreeLibrary(dll); |
| 842 » return NULL; |
| 843 » } |
| 844 #endif /* DSO_WIN32 */ |
OLD | NEW |