diff options
author | Pali Rohár <pali.rohar@gmail.com> | 2021-02-03 20:59:18 +0100 |
---|---|---|
committer | Pali Rohár <pali.rohar@gmail.com> | 2021-02-03 20:59:18 +0100 |
commit | 0e9d85a9d03bcedade35cced63ec6b969ab3451e (patch) | |
tree | db348fda18e485c88b1f2969a913ddbbac6839eb /src | |
parent | c172ee216cd5d46c1999018e1a3e905eebe3c10c (diff) | |
download | dlfcn-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.
Diffstat (limited to 'src')
-rw-r--r-- | src/dlfcn.c | 39 |
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 */ |
200 | static BOOL MyEnumProcessModules( HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded ) | 200 | static 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 ); |