62 lines
1.7 KiB
C
62 lines
1.7 KiB
C
/* loadlib.h
|
|
|
|
Copyright 2010, 2011, 2012 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) __attribute__ ((used));
|
|
|
|
static HMODULE
|
|
_load_sys_library (const wchar_t *dll)
|
|
{
|
|
static BOOL WINAPI (*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 WINAPI (*)(LPCWSTR))
|
|
GetProcAddress (k32, "SetDllDirectoryW");
|
|
if (!set_dll_directory)
|
|
set_dll_directory = (BOOL WINAPI (*)(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 */
|