| 175 | } |
| 176 | |
| 177 | DWORD SymbolHandler::GetStructMemberSize(std::string name, std::string memberName) { |
| 178 | DWORD size = 0; |
| 179 | |
| 180 | auto symbol = std::make_unique<SymbolInfo>(); |
| 181 | auto info = symbol->GetSymbolInfo(); |
| 182 | SymGetTypeFromName(m_hProcess, _address, name.c_str(), symbol->GetSymbolInfo()); |
| 183 | |
| 184 | ULONG childrenCount; |
| 185 | SymGetTypeInfo(m_hProcess, _address, info->TypeIndex, TI_GET_CHILDRENCOUNT, &childrenCount); |
| 186 | TI_FINDCHILDREN_PARAMS* childrenParams = (TI_FINDCHILDREN_PARAMS*)malloc(sizeof(TI_FINDCHILDREN_PARAMS) + sizeof(ULONG) * childrenCount); |
| 187 | if (childrenParams == nullptr) { |
| 188 | return size; |
| 189 | } |
| 190 | childrenParams->Count = childrenCount; |
| 191 | childrenParams->Start = 0; |
| 192 | PSYMBOL_INFO pMemberInfo = (PSYMBOL_INFO)malloc((sizeof(SYMBOL_INFO) + |
| 193 | MAX_SYM_NAME * sizeof(TCHAR) + |
| 194 | sizeof(ULONG64) - 1) / |
| 195 | sizeof(ULONG64)); |
| 196 | if (pMemberInfo == nullptr) { |
| 197 | free(childrenParams); |
| 198 | return size; |
| 199 | } |
| 200 | pMemberInfo->SizeOfStruct = sizeof(SYMBOL_INFO); |
| 201 | pMemberInfo->MaxNameLen = MAX_SYM_NAME; |
| 202 | SymGetTypeInfo(m_hProcess, _address, info->TypeIndex, TI_FINDCHILDREN, childrenParams); |
| 203 | |
| 204 | for (ULONG i = 0; i < childrenParams->Count; i++) { |
| 205 | ULONG child = childrenParams->ChildId[i]; |
| 206 | SymFromIndex(m_hProcess, _address, child, pMemberInfo); |
| 207 | if (!::strcmp(pMemberInfo->Name, memberName.c_str())) { |
| 208 | size = pMemberInfo->Size; |
| 209 | |
| 210 | break; |
| 211 | } |
| 212 | } |
| 213 | |
| 214 | free(pMemberInfo); |
| 215 | free(childrenParams); |
| 216 | |
| 217 | return size; |
| 218 | } |
| 219 | |
| 220 | std::unique_ptr<SymbolInfo> SymbolHandler::GetSymbolFromAddress(DWORD64 address, PDWORD64 offset) { |
| 221 | auto symbol = std::make_unique<SymbolInfo>(); |
no test coverage detected