aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPali Rohár <pali.rohar@gmail.com>2021-02-03 20:59:18 +0100
committerPali Rohár <pali.rohar@gmail.com>2021-02-03 20:59:18 +0100
commit0e9d85a9d03bcedade35cced63ec6b969ab3451e (patch)
treedb348fda18e485c88b1f2969a913ddbbac6839eb
parentc172ee216cd5d46c1999018e1a3e905eebe3c10c (diff)
downloaddlfcn-win32-0e9d85a9d03bcedade35cced63ec6b969ab3451e.tar.gz
dlfcn-win32-0e9d85a9d03bcedade35cced63ec6b969ab3451e.tar.bz2
dlfcn-win32-0e9d85a9d03bcedade35cced63ec6b969ab3451e.zip
Fix helper function MyEnumProcessModules()
Call SetErrorMode(SEM_FAILCRITICALERRORS) prior opening Psapi.dll library to avoid GUI error messages. Close Psapi.dll library via FreeLibrary() if symbol was not retrieved to prevent possible memory leaks. Try to get K32EnumProcessModules symbol from Kernel32.dll library as it is preferred way how to call EnumProcessModules() on Windows 7 and newer versions. If retrieving EnumProcessModules symbol failed with both methods then do not try it again on next MyEnumProcessModules() function call.
-rw-r--r--src/dlfcn.c39
1 files changed, 32 insertions, 7 deletions
diff --git a/src/dlfcn.c b/src/dlfcn.c
index 33fa325..4e4e10e 100644
--- a/src/dlfcn.c
+++ b/src/dlfcn.c
@@ -199,16 +199,41 @@ static void save_err_ptr_str( const void *ptr, DWORD dwMessageId )
199/* Load Psapi.dll at runtime, this avoids linking caveat */ 199/* Load Psapi.dll at runtime, this avoids linking caveat */
200static BOOL MyEnumProcessModules( HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded ) 200static BOOL MyEnumProcessModules( HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded )
201{ 201{
202 static BOOL (WINAPI *EnumProcessModulesPtr)(HANDLE, HMODULE *, DWORD, LPDWORD); 202 static BOOL (WINAPI *EnumProcessModulesPtr)(HANDLE, HMODULE *, DWORD, LPDWORD) = NULL;
203 static BOOL failed = FALSE;
204 UINT uMode;
203 HMODULE psapi; 205 HMODULE psapi;
204 206
205 if( !EnumProcessModulesPtr ) 207 if( failed )
208 return FALSE;
209
210 if( EnumProcessModulesPtr == NULL )
206 { 211 {
207 psapi = LoadLibraryA( "Psapi.dll" ); 212 /* Windows 7 and newer versions have K32EnumProcessModules in Kernel32.dll which is always pre-loaded */
208 if( psapi ) 213 psapi = GetModuleHandleA( "Kernel32.dll" );
209 EnumProcessModulesPtr = (BOOL (WINAPI *)(HANDLE, HMODULE *, DWORD, LPDWORD)) GetProcAddress( psapi, "EnumProcessModules" ); 214 if( psapi != NULL )
210 if( !EnumProcessModulesPtr ) 215 EnumProcessModulesPtr = (BOOL (WINAPI *)(HANDLE, HMODULE *, DWORD, LPDWORD)) GetProcAddress( psapi, "K32EnumProcessModules" );
211 return 0; 216
217 /* Windows Vista and older version have EnumProcessModules in Psapi.dll which needs to be loaded */
218 if( EnumProcessModulesPtr == NULL )
219 {
220 /* Do not let Windows display the critical-error-handler message box */
221 uMode = SetErrorMode( SEM_FAILCRITICALERRORS );
222 psapi = LoadLibraryA( "Psapi.dll" );
223 if( psapi != NULL )
224 {
225 EnumProcessModulesPtr = (BOOL (WINAPI *)(HANDLE, HMODULE *, DWORD, LPDWORD)) GetProcAddress( psapi, "EnumProcessModules" );
226 if( EnumProcessModulesPtr == NULL )
227 FreeLibrary( psapi );
228 }
229 SetErrorMode( uMode );
230 }
231
232 if( EnumProcessModulesPtr == NULL )
233 {
234 failed = TRUE;
235 return FALSE;
236 }
212 } 237 }
213 238
214 return EnumProcessModulesPtr( hProcess, lphModule, cb, lpcbNeeded ); 239 return EnumProcessModulesPtr( hProcess, lphModule, cb, lpcbNeeded );