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