| 69 | } |
| 70 | |
| 71 | std::vector <std::string> CStackTrace::get_stack_frames_text(void **frames, int num_frames) |
| 72 | { |
| 73 | static std::recursive_mutex mutex; |
| 74 | std::unique_lock<std::recursive_mutex> mutex_lock(mutex); |
| 75 | |
| 76 | auto vBacktraceText = std::vector<std::string>(); |
| 77 | |
| 78 | auto result = LI_FIND(SymInitialize)(NtCurrentProcess, NULL, TRUE); |
| 79 | if (!result) |
| 80 | return vBacktraceText; |
| 81 | |
| 82 | for (auto i = 0; i < num_frames; i++) |
| 83 | { |
| 84 | unsigned char buffer[sizeof(IMAGEHLP_SYMBOL64) + 128]; |
| 85 | auto symbol64 = reinterpret_cast<IMAGEHLP_SYMBOL64*>(buffer); |
| 86 | memset(symbol64, 0, sizeof(IMAGEHLP_SYMBOL64) + 128); |
| 87 | symbol64->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); |
| 88 | symbol64->MaxNameLength = 128; |
| 89 | |
| 90 | DWORD64 displacement = 0; |
| 91 | auto result = LI_FIND(SymGetSymFromAddr64)(NtCurrentProcess, (DWORD64)frames[i], &displacement, symbol64); |
| 92 | if (result) |
| 93 | { |
| 94 | IMAGEHLP_LINE64 line64; |
| 95 | memset(&line64, 0, sizeof(IMAGEHLP_LINE64)); |
| 96 | line64.SizeOfStruct = sizeof(IMAGEHLP_LINE64); |
| 97 | |
| 98 | auto dwDisplacement = 0UL; |
| 99 | result = LI_FIND(SymGetLineFromAddr64)(NtCurrentProcess, (DWORD64)frames[i], &dwDisplacement, &line64); |
| 100 | if (result) |
| 101 | { |
| 102 | vBacktraceText.push_back |
| 103 | ( |
| 104 | CreateFormatString(xorstr("%s (%s, line %u)").crypt_get(), symbol64->Name, line64.FileName, (int)line64.LineNumber) |
| 105 | ); |
| 106 | } |
| 107 | else |
| 108 | { |
| 109 | vBacktraceText.push_back(symbol64->Name); |
| 110 | } |
| 111 | } |
| 112 | } |
| 113 | |
| 114 | LI_FIND(SymCleanup)(NtCurrentProcess); |
| 115 | return vBacktraceText; |
| 116 | } |
| 117 | |
| 118 | std::vector<std::string> CStackTrace::get_stack_trace() |
| 119 | { |
nothing calls this directly
no test coverage detected