MCPcopy Create free account
hub / github.com/cuberite/cuberite / GetModuleListTH32

Method GetModuleListTH32

src/StackWalker.cpp:556–615  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

554 #pragma pack( pop )
555
556 BOOL GetModuleListTH32(HANDLE hProcess, DWORD pid)
557 {
558 // CreateToolhelp32Snapshot()
559 typedef HANDLE (__stdcall *tCT32S)(DWORD dwFlags, DWORD th32ProcessID);
560 // Module32First()
561 typedef BOOL (__stdcall *tM32F)(HANDLE hSnapshot, LPMODULEENTRY32 lpme);
562 // Module32Next()
563 typedef BOOL (__stdcall *tM32N)(HANDLE hSnapshot, LPMODULEENTRY32 lpme);
564
565 // try both dlls...
566 const TCHAR *dllname[] = { _T("kernel32.dll"), _T("tlhelp32.dll") };
567 HINSTANCE hToolhelp = NULL;
568 tCT32S pCT32S = NULL;
569 tM32F pM32F = NULL;
570 tM32N pM32N = NULL;
571
572 HANDLE hSnap;
573 MODULEENTRY32 me;
574 me.dwSize = sizeof(me);
575 BOOL keepGoing;
576 size_t i;
577
578 for (i = 0; i<(sizeof(dllname) / sizeof(dllname[0])); i++ )
579 {
580 hToolhelp = LoadLibrary( dllname[i] );
581 if (hToolhelp == NULL)
582 continue;
583 pCT32S = (tCT32S) GetProcAddress(hToolhelp, "CreateToolhelp32Snapshot");
584 pM32F = (tM32F) GetProcAddress(hToolhelp, "Module32First");
585 pM32N = (tM32N) GetProcAddress(hToolhelp, "Module32Next");
586 if ( (pCT32S != NULL) && (pM32F != NULL) && (pM32N != NULL) )
587 break; // found the functions!
588 FreeLibrary(hToolhelp);
589 hToolhelp = NULL;
590 }
591
592 if (hToolhelp == NULL)
593 return FALSE;
594
595 hSnap = pCT32S( TH32CS_SNAPMODULE, pid );
596 if (hSnap == (HANDLE) -1)
597 {
598 FreeLibrary(hToolhelp);
599 return FALSE;
600 }
601
602 keepGoing = !!pM32F( hSnap, &me );
603 int cnt = 0;
604 while (keepGoing)
605 {
606 this->LoadModule(hProcess, me.szExePath, me.szModule, (DWORD64) me.modBaseAddr, me.modBaseSize);
607 cnt++;
608 keepGoing = !!pM32N( hSnap, &me );
609 }
610 CloseHandle(hSnap);
611 FreeLibrary(hToolhelp);
612 if (cnt <= 0)
613 return FALSE;

Callers

nothing calls this directly

Calls 1

LoadModuleMethod · 0.95

Tested by

no test coverage detected