diff options
Diffstat (limited to 'winsup/utils/loadlib.h')
-rw-r--r-- | winsup/utils/loadlib.h | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/winsup/utils/loadlib.h b/winsup/utils/loadlib.h new file mode 100644 index 000000000..405b4b28d --- /dev/null +++ b/winsup/utils/loadlib.h @@ -0,0 +1,59 @@ +/* loadlib.h + + Copyright 2010 Red Hat, Inc. + + This file is part of Cygwin. + + This software is a copyrighted work licensed under the terms of the + Cygwin license. Please consult the file "CYGWIN_LICENSE" for + details. */ + +#ifndef _LOADLIB_H +#define _LOADLIB_H + +#include <windows.h> +#include <wchar.h> + +/* Load all system libs from the windows system directory by prepending the + full path. This doesn't work for loadling cygwin1.dll. For this case, + instead of prepending the path, make sure that the CWD is removed from + the DLL search path, if possible (XP SP1++, Vista++). */ +static HMODULE +_load_sys_library (const wchar_t *dll) +{ + static BOOL (*set_dll_directory)(LPCWSTR); + static WCHAR sysdir[MAX_PATH]; + static UINT sysdir_len; + + WCHAR dllpath[MAX_PATH]; + + if (!sysdir_len) + { + sysdir_len = GetSystemDirectoryW (sysdir, MAX_PATH); + sysdir[sysdir_len++] = L'\\'; + sysdir[sysdir_len] = L'\0'; + } + if (!set_dll_directory) + { + HMODULE k32 = GetModuleHandleW (L"kernel32.dll"); + if (k32) + set_dll_directory = (BOOL (*)(LPCWSTR)) + GetProcAddress (k32, "SetDllDirectoryW"); + if (!set_dll_directory) + set_dll_directory = (BOOL (*)(LPCWSTR)) -1; + else + set_dll_directory (L""); + } + + if (wcscmp (dll, L"cygwin1.dll") == 0) + return LoadLibraryExW (L"cygwin1.dll", NULL, LOAD_WITH_ALTERED_SEARCH_PATH); + + wcscpy (dllpath, sysdir); + wcscpy (dllpath + sysdir_len, dll); + return LoadLibraryExW (dllpath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); +} + +#define LoadLibraryW(d) _load_sys_library(d) +#define LoadLibraryA(d) _load_sys_library(L##d) + +#endif /* _LOADLIB_H */ |