| 265 | } |
| 266 | |
| 267 | DWORD SymbolHandler::GetBitFieldPos(std::string name, std::string fieldName) { |
| 268 | DWORD pos = 0; |
| 269 | |
| 270 | auto symbol = std::make_unique<SymbolInfo>(); |
| 271 | auto info = symbol->GetSymbolInfo(); |
| 272 | SymGetTypeFromName(m_hProcess, _address, name.c_str(), symbol->GetSymbolInfo()); |
| 273 | |
| 274 | ULONG childrenCount; |
| 275 | SymGetTypeInfo(m_hProcess, _address, info->TypeIndex, TI_GET_CHILDRENCOUNT, &childrenCount); |
| 276 | TI_FINDCHILDREN_PARAMS* childrenParams = (TI_FINDCHILDREN_PARAMS*)malloc(sizeof(TI_FINDCHILDREN_PARAMS) + sizeof(ULONG) * childrenCount); |
| 277 | if (childrenParams == nullptr) { |
| 278 | return pos; |
| 279 | } |
| 280 | childrenParams->Count = childrenCount; |
| 281 | childrenParams->Start = 0; |
| 282 | PSYMBOL_INFO pMemberInfo = (PSYMBOL_INFO)malloc((sizeof(SYMBOL_INFO) + |
| 283 | MAX_SYM_NAME * sizeof(TCHAR) + |
| 284 | sizeof(ULONG64) - 1) / |
| 285 | sizeof(ULONG64)); |
| 286 | if (pMemberInfo == nullptr) { |
| 287 | free(childrenParams); |
| 288 | return pos; |
| 289 | } |
| 290 | pMemberInfo->SizeOfStruct = sizeof(SYMBOL_INFO); |
| 291 | pMemberInfo->MaxNameLen = MAX_SYM_NAME; |
| 292 | SymGetTypeInfo(m_hProcess, _address, info->TypeIndex, TI_FINDCHILDREN, childrenParams); |
| 293 | |
| 294 | for (ULONG i = 0; i < childrenParams->Count; i++) { |
| 295 | ULONG child = childrenParams->ChildId[i]; |
| 296 | SymFromIndex(m_hProcess, _address, child, pMemberInfo); |
| 297 | if (!::strcmp(pMemberInfo->Name, fieldName.c_str())) { |
| 298 | SymGetTypeInfo(m_hProcess, _address, child, TI_GET_BITPOSITION, &pos); |
| 299 | break; |
| 300 | } |
| 301 | } |
| 302 | |
| 303 | free(pMemberInfo); |
| 304 | free(childrenParams); |
| 305 | |
| 306 | return pos; |
| 307 | } |
no test coverage detected