Improved implementation of LoadLibrary functions.

This commit is contained in:
Armin Novak 2019-02-07 17:08:18 +01:00
parent 7b246121b4
commit ebb93a1273
2 changed files with 54 additions and 18 deletions

View File

@ -32,6 +32,18 @@ typedef HANDLE DLL_DIRECTORY_COOKIE;
#define LOAD_LIBRARY_SEARCH_SYSTEM32 0x00000800
#define LOAD_LIBRARY_SEARCH_USER_DIRS 0x00000400
#define DONT_RESOLVE_DLL_REFERENCES 0x00000001
#define LOAD_LIBRARY_AS_DATAFILE 0x00000002
#define LOAD_WITH_ALTERED_SEARCH_PATH 0x00000008
#define LOAD_IGNORE_CODE_AUTHZ_LEVEL 0x00000010
#define LOAD_LIBRARY_AS_IMAGE_RESOURCE 0x00000020
#define LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 0x00000040
#define LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR 0x00000100
#define LOAD_LIBRARY_SEARCH_APPLICATION_DIR 0x00000200
#define LOAD_LIBRARY_SEARCH_USER_DIRS 0x00000400
#define LOAD_LIBRARY_SEARCH_SYSTEM32 0x00000800
#define LOAD_LIBRARY_SEARCH_DEFAULT_DIRS 0x00001000
#ifdef __cplusplus
extern "C" {
#endif

View File

@ -83,17 +83,26 @@
DLL_DIRECTORY_COOKIE AddDllDirectory(PCWSTR NewDirectory)
{
/* TODO: Implement */
WLog_ERR(TAG, "%s not implemented", __FUNCTION__);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return NULL;
}
BOOL RemoveDllDirectory(DLL_DIRECTORY_COOKIE Cookie)
{
return TRUE;
/* TODO: Implement */
WLog_ERR(TAG, "%s not implemented", __FUNCTION__);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}
BOOL SetDefaultDllDirectories(DWORD DirectoryFlags)
{
return TRUE;
/* TODO: Implement */
WLog_ERR(TAG, "%s not implemented", __FUNCTION__);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}
HMODULE LoadLibraryA(LPCSTR lpLibFileName)
@ -111,7 +120,7 @@ HMODULE LoadLibraryA(LPCSTR lpLibFileName)
if (status < 1)
return NULL;
hModule = LoadPackagedLibrary(filenameW, 0);
hModule = LoadLibraryW(filenameW);
free(filenameW);
return hModule;
#else
@ -120,7 +129,7 @@ HMODULE LoadLibraryA(LPCSTR lpLibFileName)
if (!library)
{
WLog_ERR(TAG, "LoadLibraryA: %s", dlerror());
WLog_ERR(TAG, "%s failed with %s", __FUNCTION__, dlerror());
return NULL;
}
@ -133,31 +142,39 @@ HMODULE LoadLibraryW(LPCWSTR lpLibFileName)
#if defined(_UWP)
return LoadPackagedLibrary(lpLibFileName, 0);
#else
return (HMODULE) NULL;
char* name = NULL;
HMODULE module;
int rc = ConvertFromUnicode(CP_UTF8, 0, lpLibFileName, -1, &name, 0, NULL, NULL);
if (rc < 0)
return NULL;
module = LoadLibraryA(name);
free(name);
return module;
#endif
}
HMODULE LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
{
#if !defined(_UWP)
HMODULE library;
library = dlopen(lpLibFileName, RTLD_LOCAL | RTLD_LAZY);
if (dwFlags != 0)
WLog_WARN(TAG, "%s does not support dwFlags 0x%08"PRIx32, __FUNCTION__, dwFlags);
if (!library)
{
WLog_ERR(TAG, "LoadLibraryExA: failed to open %s: %s", lpLibFileName, dlerror());
return NULL;
}
if (hFile)
WLog_WARN(TAG, "%s does not support hFile != NULL", __FUNCTION__);
return library;
#else
return (HMODULE)NULL;
#endif
return LoadLibraryA(lpLibFileName);
}
HMODULE LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
{
return (HMODULE) NULL;
if (dwFlags != 0)
WLog_WARN(TAG, "%s does not support dwFlags 0x%08"PRIx32, __FUNCTION__, dwFlags);
if (hFile)
WLog_WARN(TAG, "%s does not support hFile != NULL", __FUNCTION__);
return LoadLibraryW(lpLibFileName);
}
#endif
@ -191,11 +208,17 @@ BOOL FreeLibrary(HMODULE hLibModule)
HMODULE GetModuleHandleA(LPCSTR lpModuleName)
{
/* TODO: Implement */
WLog_ERR(TAG, "%s not implemented", __FUNCTION__);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return NULL;
}
HMODULE GetModuleHandleW(LPCWSTR lpModuleName)
{
/* TODO: Implement */
WLog_ERR(TAG, "%s not implemented", __FUNCTION__);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return NULL;
}
@ -209,6 +232,7 @@ HMODULE GetModuleHandleW(LPCWSTR lpModuleName)
DWORD GetModuleFileNameW(HMODULE hModule, LPWSTR lpFilename, DWORD nSize)
{
/* TODO: Implement */
WLog_ERR(TAG, "%s is not implemented", __FUNCTION__);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;