| 826 | } |
| 827 | |
| 828 | BOOL GetModuleInfo(HANDLE hProcess, DWORD64 baseAddr, IMAGEHLP_MODULE64_V3* pModuleInfo) |
| 829 | { |
| 830 | memset(pModuleInfo, 0, sizeof(IMAGEHLP_MODULE64_V3)); |
| 831 | if (this->pSGMI == NULL) |
| 832 | { |
| 833 | SetLastError(ERROR_DLL_INIT_FAILED); |
| 834 | return FALSE; |
| 835 | } |
| 836 | // First try to use the larger ModuleInfo-Structure |
| 837 | pModuleInfo->SizeOfStruct = sizeof(IMAGEHLP_MODULE64_V3); |
| 838 | void* pData = malloc( |
| 839 | 4096); // reserve enough memory, so the bug in v6.3.5.1 does not lead to memory-overwrites... |
| 840 | if (pData == NULL) |
| 841 | { |
| 842 | SetLastError(ERROR_NOT_ENOUGH_MEMORY); |
| 843 | return FALSE; |
| 844 | } |
| 845 | memcpy(pData, pModuleInfo, sizeof(IMAGEHLP_MODULE64_V3)); |
| 846 | static bool s_useV3Version = true; |
| 847 | if (s_useV3Version) |
| 848 | { |
| 849 | if (this->pSGMI(hProcess, baseAddr, (IMAGEHLP_MODULE64_V3*)pData) != FALSE) |
| 850 | { |
| 851 | // only copy as much memory as is reserved... |
| 852 | memcpy(pModuleInfo, pData, sizeof(IMAGEHLP_MODULE64_V3)); |
| 853 | pModuleInfo->SizeOfStruct = sizeof(IMAGEHLP_MODULE64_V3); |
| 854 | free(pData); |
| 855 | return TRUE; |
| 856 | } |
| 857 | s_useV3Version = false; // to prevent unnecessary calls with the larger struct... |
| 858 | } |
| 859 | |
| 860 | // could not retrieve the bigger structure, try with the smaller one (as defined in VC7.1)... |
| 861 | pModuleInfo->SizeOfStruct = sizeof(IMAGEHLP_MODULE64_V2); |
| 862 | memcpy(pData, pModuleInfo, sizeof(IMAGEHLP_MODULE64_V2)); |
| 863 | if (this->pSGMI(hProcess, baseAddr, (IMAGEHLP_MODULE64_V3*)pData) != FALSE) |
| 864 | { |
| 865 | // only copy as much memory as is reserved... |
| 866 | memcpy(pModuleInfo, pData, sizeof(IMAGEHLP_MODULE64_V2)); |
| 867 | pModuleInfo->SizeOfStruct = sizeof(IMAGEHLP_MODULE64_V2); |
| 868 | free(pData); |
| 869 | return TRUE; |
| 870 | } |
| 871 | free(pData); |
| 872 | SetLastError(ERROR_DLL_INIT_FAILED); |
| 873 | return FALSE; |
| 874 | } |
| 875 | }; |
| 876 | |
| 877 | // ############################################################# |
no outgoing calls
no test coverage detected