From fe1e475144c895341ffecd8af14b7b1f4d8f4c38 Mon Sep 17 00:00:00 2001 From: Pali Rohár Date: Tue, 21 Dec 2021 01:07:19 +0100 Subject: Try to avoid compile warning: cast between incompatible function types from ‘FARPROC’ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warning: cast between incompatible function types from ‘FARPROC’ {aka ‘long long int (*)()’} to ‘BOOL (*)(DWORD, const CHAR *, struct HINSTANCE__ **)’ {aka ‘int (*)(long unsigned int, const char *, struct HINSTANCE__ **)’} [-Wcast-function-type] --- src/dlfcn.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dlfcn.c b/src/dlfcn.c index 7bca267..9f5bde1 100644 --- a/src/dlfcn.c +++ b/src/dlfcn.c @@ -229,7 +229,7 @@ static HMODULE MyGetModuleHandleFromAddress( const void *addr ) { kernel32 = GetModuleHandleA( "Kernel32.dll" ); if( kernel32 != NULL ) - GetModuleHandleExAPtr = (BOOL (WINAPI *)(DWORD, LPCSTR, HMODULE *)) GetProcAddress( kernel32, "GetModuleHandleExA" ); + GetModuleHandleExAPtr = (BOOL (WINAPI *)(DWORD, LPCSTR, HMODULE *)) (LPVOID) GetProcAddress( kernel32, "GetModuleHandleExA" ); if( GetModuleHandleExAPtr == NULL ) failed = TRUE; } @@ -270,7 +270,7 @@ static BOOL MyEnumProcessModules( HANDLE hProcess, HMODULE *lphModule, DWORD cb, /* Windows 7 and newer versions have K32EnumProcessModules in Kernel32.dll which is always pre-loaded */ psapi = GetModuleHandleA( "Kernel32.dll" ); if( psapi != NULL ) - EnumProcessModulesPtr = (BOOL (WINAPI *)(HANDLE, HMODULE *, DWORD, LPDWORD)) GetProcAddress( psapi, "K32EnumProcessModules" ); + EnumProcessModulesPtr = (BOOL (WINAPI *)(HANDLE, HMODULE *, DWORD, LPDWORD)) (LPVOID) GetProcAddress( psapi, "K32EnumProcessModules" ); /* Windows Vista and older version have EnumProcessModules in Psapi.dll which needs to be loaded */ if( EnumProcessModulesPtr == NULL ) @@ -280,7 +280,7 @@ static BOOL MyEnumProcessModules( HANDLE hProcess, HMODULE *lphModule, DWORD cb, psapi = LoadLibraryA( "Psapi.dll" ); if( psapi != NULL ) { - EnumProcessModulesPtr = (BOOL (WINAPI *)(HANDLE, HMODULE *, DWORD, LPDWORD)) GetProcAddress( psapi, "EnumProcessModules" ); + EnumProcessModulesPtr = (BOOL (WINAPI *)(HANDLE, HMODULE *, DWORD, LPDWORD)) (LPVOID) GetProcAddress( psapi, "EnumProcessModules" ); if( EnumProcessModulesPtr == NULL ) FreeLibrary( psapi ); } -- cgit v1.2.3-55-g6feb From 318030d5419b1064941700a1c3c21d7f9bd30149 Mon Sep 17 00:00:00 2001 From: Pali Rohár Date: Tue, 21 Dec 2021 01:09:09 +0100 Subject: Prefer usage of thread-safe function SetThreadErrorMode() instead of process-global function SetErrorMode() Use GetProcAddress() wrapper as SetThreadErrorMode() is not available on older Windows versions. --- src/dlfcn.c | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/src/dlfcn.c b/src/dlfcn.c index 9f5bde1..ad8dc3f 100644 --- a/src/dlfcn.c +++ b/src/dlfcn.c @@ -216,6 +216,35 @@ static void save_err_ptr_str( const void *ptr, DWORD dwMessageId ) save_err_str( ptr_buf, dwMessageId ); } +static UINT MySetErrorMode( UINT uMode ) +{ + static BOOL (WINAPI *SetThreadErrorModePtr)(DWORD, DWORD *) = NULL; + static BOOL failed = FALSE; + HMODULE kernel32; + DWORD oldMode; + + if( !failed && SetThreadErrorModePtr == NULL ) + { + kernel32 = GetModuleHandleA( "Kernel32.dll" ); + if( kernel32 != NULL ) + SetThreadErrorModePtr = (BOOL (WINAPI *)(DWORD, DWORD *)) (LPVOID) GetProcAddress( kernel32, "SetThreadErrorMode" ); + if( SetThreadErrorModePtr == NULL ) + failed = TRUE; + } + + if( !failed ) + { + if( !SetThreadErrorModePtr( uMode, &oldMode ) ) + return 0; + else + return oldMode; + } + else + { + return SetErrorMode( uMode ); + } +} + static HMODULE MyGetModuleHandleFromAddress( const void *addr ) { static BOOL (WINAPI *GetModuleHandleExAPtr)(DWORD, LPCSTR, HMODULE *) = NULL; @@ -276,7 +305,7 @@ static BOOL MyEnumProcessModules( HANDLE hProcess, HMODULE *lphModule, DWORD cb, if( EnumProcessModulesPtr == NULL ) { /* Do not let Windows display the critical-error-handler message box */ - uMode = SetErrorMode( SEM_FAILCRITICALERRORS ); + uMode = MySetErrorMode( SEM_FAILCRITICALERRORS ); psapi = LoadLibraryA( "Psapi.dll" ); if( psapi != NULL ) { @@ -284,7 +313,7 @@ static BOOL MyEnumProcessModules( HANDLE hProcess, HMODULE *lphModule, DWORD cb, if( EnumProcessModulesPtr == NULL ) FreeLibrary( psapi ); } - SetErrorMode( uMode ); + MySetErrorMode( uMode ); } if( EnumProcessModulesPtr == NULL ) @@ -306,7 +335,7 @@ void *dlopen( const char *file, int mode ) error_occurred = FALSE; /* Do not let Windows display the critical-error-handler message box */ - uMode = SetErrorMode( SEM_FAILCRITICALERRORS ); + uMode = MySetErrorMode( SEM_FAILCRITICALERRORS ); if( file == NULL ) { @@ -399,7 +428,7 @@ void *dlopen( const char *file, int mode ) } /* Return to previous state of the error-mode bit flags. */ - SetErrorMode( uMode ); + MySetErrorMode( uMode ); return (void *) hModule; } -- cgit v1.2.3-55-g6feb