Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(248)

Side by Side Diff: openssl/crypto/dso/dso_win32.c

Issue 9254031: Upgrade chrome's OpenSSL to same version Android ships with. (Closed) Base URL: http://src.chromium.org/svn/trunk/deps/third_party/openssl/
Patch Set: '' Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « openssl/crypto/dso/dso_vms.c ('k') | openssl/crypto/dyn_lck.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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 */
OLDNEW
« no previous file with comments | « openssl/crypto/dso/dso_vms.c ('k') | openssl/crypto/dyn_lck.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698