aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 );