| 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 |
nothing calls this directly
no test coverage detected