blob: 44b4957339f82c393f36581d81dbd78f3c1bafbb [file] [log] [blame]
/**
* @file dll.c Dynamic library loading for Windows
*
* Copyright (C) 2010 Creytiv.com
*/
#include <windows.h>
#include <re_types.h>
#include "../mod_internal.h"
#define DEBUG_MODULE "dll"
#define DEBUG_LEVEL 5
#include <re_dbg.h>
/**
* Open a DLL file
*
* @param name Name of DLL to open
*
* @return Handle (NULL if failed)
*/
void *_mod_open(const char *name)
{
HINSTANCE DllHandle = 0;
DEBUG_INFO("loading %s\n", name);
DllHandle = LoadLibraryA(name);
if (!DllHandle) {
DEBUG_WARNING("open: %s LoadLibraryA() failed\n", name);
return NULL;
}
return DllHandle;
}
/**
* Resolve a symbol address in a DLL
*
* @param h DLL Handle
* @param symbol Symbol to resolve
*
* @return Address of symbol
*/
void *_mod_sym(void *h, const char *symbol)
{
HINSTANCE DllHandle = (HINSTANCE)h;
union {
FARPROC sym;
void *ptr;
} u;
if (!DllHandle)
return NULL;
DEBUG_INFO("get symbol: %s\n", symbol);
u.sym = GetProcAddress(DllHandle, symbol);
if (!u.sym) {
DEBUG_WARNING("GetProcAddress: no symbol %s\n", symbol);
return NULL;
}
return u.ptr;
}
/**
* Close a DLL
*
* @param h DLL Handle
*/
void _mod_close(void *h)
{
HINSTANCE DllHandle = (HINSTANCE)h;
DEBUG_INFO("unloading %p\n", h);
if (!DllHandle)
return;
FreeLibrary(DllHandle);
}