diff options
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 ); |
