17 MEMORY_BASIC_INFORMATION m;
18 memset(&m, 0,
sizeof(m));
19 if( !VirtualQuery(_errno, &m,
sizeof(m)) )
return NULL;
20 return m.AllocationBase;
25 w32_dlclose(
void *
ptr)
28 if(
ptr == w32_coredll() )
return 0;
30 if( FreeLibrary((HMODULE)
ptr) )
return 0;
33 #define dlclose(ptr) w32_dlclose(ptr)
37 fiddle_handle_free(
void *
ptr)
41 dlclose(fiddle_handle->
ptr);
47 fiddle_handle_memsize(
const void *
ptr)
54 {0, fiddle_handle_free, fiddle_handle_memsize,},
65 rb_fiddle_handle_close(
VALUE self)
70 if(fiddle_handle->
open) {
71 int ret = dlclose(fiddle_handle->
ptr);
72 fiddle_handle->
open = 0;
76 #if defined(HAVE_DLERROR)
90 rb_fiddle_handle_s_allocate(
VALUE klass)
96 fiddle_handle->
ptr = 0;
97 fiddle_handle->
open = 0;
104 predefined_fiddle_handle(
void *handle)
109 fiddle_handle->
ptr = handle;
110 fiddle_handle->
open = 1;
143 cflag = RTLD_LAZY | RTLD_GLOBAL;
147 cflag = RTLD_LAZY | RTLD_GLOBAL;
154 rb_bug(
"rb_fiddle_handle_new");
159 HANDLE rb_libruby_handle(
void);
160 ptr = rb_libruby_handle();
169 ptr = dlopen(
"coredll.dll", cflag);
177 ptr = dlopen(clib, cflag);
178 #if defined(HAVE_DLERROR)
179 if( !
ptr && (
err = dlerror()) ){
190 dlclose(fiddle_handle->
ptr);
193 fiddle_handle->
open = 1;
209 rb_fiddle_handle_enable_close(
VALUE self)
224 rb_fiddle_handle_disable_close(
VALUE self)
241 rb_fiddle_handle_close_enabled_p(
VALUE self)
257 rb_fiddle_handle_to_i(
VALUE self)
271 rb_fiddle_handle_to_ptr(
VALUE self)
279 static VALUE fiddle_handle_sym(
void *handle,
VALUE symbol);
294 if( ! fiddle_handle->
open ){
298 return fiddle_handle_sym(fiddle_handle->
ptr,
sym);
302 #define RTLD_NEXT NULL
305 #define RTLD_DEFAULT NULL
325 fiddle_handle_sym(
void *handle,
VALUE symbol)
327 #if defined(HAVE_DLERROR)
329 # define CHECK_DLERROR if ((err = dlerror()) != 0) { func = 0; }
331 # define CHECK_DLERROR
339 func = (void (*)())(
VALUE)dlsym(handle,
name);
341 #if defined(FUNC_STDCALL)
346 #if defined(__CYGWIN__) || defined(_WIN32) || defined(__MINGW32__)
349 strcpy(name_a,
name);
352 name_a[
len+1] =
'\0';
353 func = dlsym(handle, name_a);
355 if( func )
goto found;
363 for( i = 0; i < 256; i += 4 ){
364 sprintf(name_n +
len,
"%d", i);
365 func = dlsym(handle, name_n);
369 if( func )
goto found;
372 for( i = 0; i < 256; i += 4 ){
373 sprintf(name_n +
len,
"%d", i);
374 func = dlsym(handle, name_n);
395 rb_fiddle_handle_file_name(
VALUE self)
401 #if defined(HAVE_DLINFO) && defined(HAVE_CONST_RTLD_DI_LINKMAP)
403 struct link_map *lm =
NULL;
404 int res = dlinfo(fiddle_handle->
ptr, RTLD_DI_LINKMAP, &lm);
405 if (res == 0 && lm !=
NULL) {
409 #if defined(HAVE_DLERROR)
416 #elif defined(HAVE_GETMODULEFILENAME)
418 char filename[MAX_PATH];
419 DWORD res = GetModuleFileName(fiddle_handle->
ptr, filename, MAX_PATH);