uint GetMemberType(member_t *m) { char cm; switch(m->eoff - m->soff) { case 4: return T_I32; case 2: { if (get_member_cmt(m->id, false, &cm, 1) == -1) return T_UNK; if (cm == 'S') return T_I16; return T_U16; } case 1: { if (get_member_cmt(m->id, false, &cm, 1) == -1) return T_UNK; if (cm == 'S') return T_I8; return T_U8; } } return T_UNK; }
std::vector<IDAStructure> GetStructsFromDb() { std::vector<IDAStructure> structures; constexpr size_t bufferSize = 256; std::array<char, bufferSize> buffer; for (auto i = get_first_struc_idx(); i != -1; i = get_next_struc_idx(i)) { IDAStructure newStruct; const struc_t* idaStruct = get_struc(get_struc_by_idx(i)); get_struc_name(idaStruct->id, buffer.data(), bufferSize); newStruct.m_name = std::string(buffer.data()); get_struc_cmt(idaStruct->id, true, buffer.data(), bufferSize); newStruct.m_comment = std::string(buffer.data()); newStruct.m_size = get_struc_size(idaStruct->id); msg("Struct %d = %s (%s) [%d bytes]\n", i, newStruct.m_name.c_str(), newStruct.m_comment.c_str(), newStruct.m_size); size_t offset = 0; member_t* idaStructMember = get_member(idaStruct, offset); while (idaStructMember != nullptr) { IDAStructure::Member newMember; get_member_fullname(idaStructMember->id, buffer.data(), bufferSize); newMember.m_name = std::string(buffer.data()); { tinfo_t typeInfo; get_member_tinfo2(idaStructMember, &typeInfo); qstring typeName; if (typeInfo.get_type_name(&typeName)) { newMember.m_type = std::string(typeName.c_str()); } else { newMember.m_type = "undefined"; } } get_member_cmt(idaStructMember->id, true, buffer.data(), bufferSize); newMember.m_comment = std::string(buffer.data()); newMember.m_size = get_member_size(idaStructMember); offset += newMember.m_size; msg(" %s {%s} (%s) [%d bytes]\n", newMember.m_name.c_str(), newMember.m_type.c_str(), newMember.m_comment.c_str(), newMember.m_size); newStruct.m_members.push_back(std::move(newMember)); idaStructMember = get_member(idaStruct, offset); } structures.push_back(std::move(newStruct)); } return std::move(structures); }