| 719 | } // GetModuleListPSAPI |
| 720 | |
| 721 | DWORD LoadModule(HANDLE hProcess, LPCSTR img, LPCSTR mod, DWORD64 baseAddr, DWORD size) |
| 722 | { |
| 723 | CHAR* szImg = _strdup(img); |
| 724 | CHAR* szMod = _strdup(mod); |
| 725 | DWORD result = ERROR_SUCCESS; |
| 726 | if ((szImg == NULL) || (szMod == NULL)) |
| 727 | result = ERROR_NOT_ENOUGH_MEMORY; |
| 728 | else |
| 729 | { |
| 730 | if (pSLM(hProcess, 0, szImg, szMod, baseAddr, size) == 0) |
| 731 | result = GetLastError(); |
| 732 | } |
| 733 | ULONGLONG fileVersion = 0; |
| 734 | if ((m_parent != NULL) && (szImg != NULL)) |
| 735 | { |
| 736 | // try to retrieve the file-version: |
| 737 | if ((this->m_parent->m_options & StackWalker::RetrieveFileVersion) != 0) |
| 738 | { |
| 739 | VS_FIXEDFILEINFO* fInfo = NULL; |
| 740 | DWORD dwHandle; |
| 741 | DWORD dwSize = GetFileVersionInfoSizeA(szImg, &dwHandle); |
| 742 | if (dwSize > 0) |
| 743 | { |
| 744 | LPVOID vData = malloc(dwSize); |
| 745 | if (vData != NULL) |
| 746 | { |
| 747 | if (GetFileVersionInfoA(szImg, dwHandle, dwSize, vData) != 0) |
| 748 | { |
| 749 | UINT len; |
| 750 | TCHAR szSubBlock[] = _T("\\"); |
| 751 | if (VerQueryValue(vData, szSubBlock, (LPVOID*)&fInfo, &len) == 0) |
| 752 | fInfo = NULL; |
| 753 | else |
| 754 | { |
| 755 | fileVersion = |
| 756 | ((ULONGLONG)fInfo->dwFileVersionLS) + ((ULONGLONG)fInfo->dwFileVersionMS << 32); |
| 757 | } |
| 758 | } |
| 759 | free(vData); |
| 760 | } |
| 761 | } |
| 762 | } |
| 763 | |
| 764 | // Retrieve some additional-infos about the module |
| 765 | IMAGEHLP_MODULE64_V3 Module; |
| 766 | const char* szSymType = "-unknown-"; |
| 767 | if (this->GetModuleInfo(hProcess, baseAddr, &Module) != FALSE) |
| 768 | { |
| 769 | switch (Module.SymType) |
| 770 | { |
| 771 | case SymNone: |
| 772 | szSymType = "-nosymbols-"; |
| 773 | break; |
| 774 | case SymCoff: // 1 |
| 775 | szSymType = "COFF"; |
| 776 | break; |
| 777 | case SymCv: // 2 |
| 778 | szSymType = "CV"; |
no test coverage detected