MCPcopy Create free account
hub / github.com/ddopson/node-segfault-handler / GetModuleListTH32

Method GetModuleListTH32

src/StackWalker.cpp:450–506  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

448 #pragma pack( pop )
449
450 BOOL GetModuleListTH32(HANDLE hProcess, DWORD pid)
451 {
452 // CreateToolhelp32Snapshot()
453 typedef HANDLE (__stdcall *tCT32S)(DWORD dwFlags, DWORD th32ProcessID);
454 // Module32First()
455 typedef BOOL (__stdcall *tM32F)(HANDLE hSnapshot, LPMODULEENTRY32 lpme);
456 // Module32Next()
457 typedef BOOL (__stdcall *tM32N)(HANDLE hSnapshot, LPMODULEENTRY32 lpme);
458
459 // try both dlls...
460 const TCHAR *dllname[] = { _T("kernel32.dll"), _T("tlhelp32.dll") };
461 HINSTANCE hToolhelp = NULL;
462 tCT32S pCT32S = NULL;
463 tM32F pM32F = NULL;
464 tM32N pM32N = NULL;
465
466 HANDLE hSnap;
467 MODULEENTRY32 me;
468 me.dwSize = sizeof(me);
469 BOOL keepGoing;
470 size_t i;
471
472 for (i = 0; i<(sizeof(dllname) / sizeof(dllname[0])); i++ )
473 {
474 hToolhelp = LoadLibrary( dllname[i] );
475 if (hToolhelp == NULL)
476 continue;
477 pCT32S = (tCT32S) GetProcAddress(hToolhelp, "CreateToolhelp32Snapshot");
478 pM32F = (tM32F) GetProcAddress(hToolhelp, "Module32First");
479 pM32N = (tM32N) GetProcAddress(hToolhelp, "Module32Next");
480 if ( (pCT32S != NULL) && (pM32F != NULL) && (pM32N != NULL) )
481 break; // found the functions!
482 FreeLibrary(hToolhelp);
483 hToolhelp = NULL;
484 }
485
486 if (hToolhelp == NULL)
487 return FALSE;
488
489 hSnap = pCT32S( TH32CS_SNAPMODULE, pid );
490 if (hSnap == (HANDLE) -1)
491 return FALSE;
492
493 keepGoing = !!pM32F( hSnap, &me );
494 int cnt = 0;
495 while (keepGoing)
496 {
497 this->LoadModule(hProcess, me.szExePath, me.szModule, (DWORD64) me.modBaseAddr, me.modBaseSize);
498 cnt++;
499 keepGoing = !!pM32N( hSnap, &me );
500 }
501 CloseHandle(hSnap);
502 FreeLibrary(hToolhelp);
503 if (cnt <= 0)
504 return FALSE;
505 return TRUE;
506 } // GetModuleListTH32
507

Callers

nothing calls this directly

Calls 1

LoadModuleMethod · 0.95

Tested by

no test coverage detected