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