| 651 | } |
| 652 | |
| 653 | bool ProcessAccessHelp::getProcessModules(HANDLE hProcess, std::vector<ModuleInfo> &moduleList) |
| 654 | { |
| 655 | ModuleInfo module; |
| 656 | WCHAR filename[MAX_PATH*2] = {0}; |
| 657 | DWORD cbNeeded = 0; |
| 658 | bool retVal = false; |
| 659 | DeviceNameResolver deviceNameResolver; |
| 660 | |
| 661 | moduleList.reserve(20); |
| 662 | |
| 663 | EnumProcessModules(hProcess, 0, 0, &cbNeeded); |
| 664 | |
| 665 | HMODULE* hMods=(HMODULE*)malloc(cbNeeded*sizeof(HMODULE)); |
| 666 | |
| 667 | if (hMods) |
| 668 | { |
| 669 | if(EnumProcessModules(hProcess, hMods, cbNeeded, &cbNeeded)) |
| 670 | { |
| 671 | for(unsigned int i = 1; i < (cbNeeded/sizeof(HMODULE)); i++) //skip first module! |
| 672 | { |
| 673 | module.modBaseAddr = (DWORD_PTR)hMods[i]; |
| 674 | module.modBaseSize = (DWORD)getSizeOfImageProcess(hProcess, module.modBaseAddr); |
| 675 | module.isAlreadyParsed = false; |
| 676 | module.parsing = false; |
| 677 | |
| 678 | filename[0] = 0; |
| 679 | module.fullPath[0] = 0; |
| 680 | |
| 681 | if (GetMappedFileNameW(hProcess, (LPVOID)module.modBaseAddr, filename, _countof(filename)) > 0) |
| 682 | { |
| 683 | if (!deviceNameResolver.resolveDeviceLongNameToShort(filename, module.fullPath)) |
| 684 | { |
| 685 | if (!GetModuleFileNameExW(hProcess, (HMODULE)module.modBaseAddr, module.fullPath, _countof(module.fullPath))) |
| 686 | { |
| 687 | wcscpy_s(module.fullPath, filename); |
| 688 | } |
| 689 | } |
| 690 | } |
| 691 | else |
| 692 | { |
| 693 | GetModuleFileNameExW(hProcess, (HMODULE)module.modBaseAddr, module.fullPath, _countof(module.fullPath)); |
| 694 | } |
| 695 | |
| 696 | moduleList.push_back(module); |
| 697 | } |
| 698 | |
| 699 | retVal = true; |
| 700 | } |
| 701 | |
| 702 | free(hMods); |
| 703 | } |
| 704 | |
| 705 | return retVal; |
| 706 | } |
| 707 | |
| 708 | bool ProcessAccessHelp::getMemoryRegionFromAddress(DWORD_PTR address, DWORD_PTR * memoryRegionBase, SIZE_T * memoryRegionSize) |
| 709 | { |
nothing calls this directly
no test coverage detected