Improved implementation of LoadLibrary functions.
authorArmin Novak <armin.novak@thincast.com>
Thu, 7 Feb 2019 16:08:18 +0000 (17:08 +0100)
committerArmin Novak <armin.novak@thincast.com>
Fri, 5 Apr 2019 07:14:35 +0000 (09:14 +0200)
winpr/include/winpr/library.h
winpr/libwinpr/library/library.c

index 34df3c7..de591b8 100644 (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
index 3966e81..326737c 100644 (file)
 
 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;