/*ARGSUSED*/ static int membcmp(const char *name, ctf_id_t type, ulong_t offset, void *arg) { ctf_bundle_t *ctb = arg; ctf_membinfo_t ctm; return (ctf_member_info(ctb->ctb_file, ctb->ctb_type, name, &ctm) == CTF_ERR || ctm.ctm_offset != offset); }
RTR0DECL(int) RTR0DbgKrnlInfoQueryMember(RTDBGKRNLINFO hKrnlInfo, const char *pszStructure, const char *pszMember, size_t *poffMember) { PRTDBGKRNLINFOINT pThis = hKrnlInfo; AssertPtrReturn(pThis, VERR_INVALID_HANDLE); AssertMsgReturn(pThis->u32Magic == RTDBGKRNLINFO_MAGIC, ("%p: u32Magic=%RX32\n", pThis, pThis->u32Magic), VERR_INVALID_HANDLE); AssertPtrReturn(pszMember, VERR_INVALID_PARAMETER); AssertPtrReturn(pszStructure, VERR_INVALID_PARAMETER); AssertPtrReturn(poffMember, VERR_INVALID_PARAMETER); RT_ASSERT_PREEMPTIBLE(); int rc = VERR_NOT_FOUND; ctf_id_t TypeIdent = ctf_lookup_by_name(pThis->pGenUnixCTF, pszStructure); if (TypeIdent != CTF_ERR) { ctf_membinfo_t MemberInfo; RT_ZERO(MemberInfo); if (ctf_member_info(pThis->pGenUnixCTF, TypeIdent, pszMember, &MemberInfo) != CTF_ERR) { *poffMember = (MemberInfo.ctm_offset >> 3); return VINF_SUCCESS; }
RTR0DECL(int) RTR0DbgKrnlInfoQueryMember(RTDBGKRNLINFO hKrnlInfo, const char *pszModule, const char *pszStructure, const char *pszMember, size_t *poffMember) { PRTDBGKRNLINFOINT pThis = hKrnlInfo; AssertPtrReturn(pThis, VERR_INVALID_HANDLE); AssertMsgReturn(pThis->u32Magic == RTDBGKRNLINFO_MAGIC, ("%p: u32Magic=%RX32\n", pThis, pThis->u32Magic), VERR_INVALID_HANDLE); AssertPtrReturn(pszMember, VERR_INVALID_PARAMETER); AssertPtrReturn(pszStructure, VERR_INVALID_PARAMETER); AssertPtrReturn(poffMember, VERR_INVALID_PARAMETER); if (g_frtSolInitDone) RT_ASSERT_PREEMPTIBLE(); ctf_file_t *pCtf = NULL; modctl_t *pMod = NULL; if (!pszModule) { pCtf = pThis->pGenUnixCTF; pMod = pThis->pGenUnixMod; } else { int rc2 = rtR0DbgKrnlInfoModRetainEx(pszModule, &pMod, &pCtf); if (RT_FAILURE(rc2)) return rc2; Assert(pMod); Assert(pCtf); } int rc = VERR_NOT_FOUND; ctf_id_t TypeIdent = ctf_lookup_by_name(pCtf, pszStructure); if (TypeIdent != CTF_ERR) { ctf_membinfo_t MemberInfo; RT_ZERO(MemberInfo); if (ctf_member_info(pCtf, TypeIdent, pszMember, &MemberInfo) != CTF_ERR) { *poffMember = (MemberInfo.ctm_offset >> 3); rc = VINF_SUCCESS; }