From: Armin Novak Date: Thu, 7 Feb 2019 16:08:18 +0000 (+0100) Subject: Improved implementation of LoadLibrary functions. X-Git-Tag: 2.0.0~495^2~22 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ebb93a1273efc461261ca0f664365e9a7e4af1b7;p=platform%2Fupstream%2Ffreerdp.git Improved implementation of LoadLibrary functions. --- diff --git a/winpr/include/winpr/library.h b/winpr/include/winpr/library.h index 34df3c7..de591b8 100644 --- a/winpr/include/winpr/library.h +++ b/winpr/include/winpr/library.h @@ -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 diff --git a/winpr/libwinpr/library/library.c b/winpr/libwinpr/library/library.c index 3966e81..326737c 100644 --- a/winpr/libwinpr/library/library.c +++ b/winpr/libwinpr/library/library.c @@ -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;