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