public void Find_Matching_Frames_By_Register_values() { var frameAccess = new FrameAccess(); var builder = new ContextFactoryBuilder(); builder.WithFrame(new FrameEntity { PosHi = 0, PosLo = 0, ThreadId = 1, Rax = ((ulong)0).ToHexString(), Rbx = ((ulong)1).ToHexString(), Rcx = ((ulong)2).ToHexString(), Rdx = ((ulong)3).ToHexString() }).WithFrame(new FrameEntity { PosHi = 0, PosLo = 0, ThreadId = 2, Rax = ((ulong)0).ToHexString(), Rbx = ((ulong)2).ToHexString(), Rcx = ((ulong)4).ToHexString(), Rdx = ((ulong)6).ToHexString() }).WithFrame(new FrameEntity { PosHi = 1, PosLo = 0, ThreadId = 2 }).WithFrame(new FrameEntity { PosHi = 1, PosLo = 1, ThreadId = 2, Rax = ((ulong)0).ToHexString(), Rbx = ((ulong)1).ToHexString(), Rcx = ((ulong)2).ToHexString(), Rdx = ((ulong)3).ToHexString() }); frameAccess.ContextFactory = builder.Build(); var between = new RegisterBetweenCriterion(Register.Rax, ((ulong)0).ToHexString(), ((ulong)2).ToHexString()); var notBetween = new NotCriterion(between); var betweenResults = frameAccess.Search("", between); var notBetweenResults = frameAccess.Search("", notBetween); betweenResults.Should().HaveCount(3); notBetweenResults.Should().HaveCount(1); }
/// <summary> /// Visits the specified register between criterion. /// </summary> /// <param name="registerBetweenCriterion">The register between criterion.</param> /// <returns>FramePredicateExpression.</returns> public object Visit(RegisterBetweenCriterion registerBetweenCriterion) { if (registerBetweenCriterion.Register == Register.Rax) { FramePredicateExpression exp = entity => string.Compare(entity.Rax, registerBetweenCriterion.Low, StringComparison.OrdinalIgnoreCase) >= 0 && string.Compare(entity.Rax, registerBetweenCriterion.High, StringComparison.OrdinalIgnoreCase) < 0; return(exp); } if (registerBetweenCriterion.Register == Register.Rbx) { FramePredicateExpression exp = entity => string.Compare(entity.Rbx, registerBetweenCriterion.Low, StringComparison.OrdinalIgnoreCase) >= 0 && string.Compare(entity.Rbx, registerBetweenCriterion.High, StringComparison.OrdinalIgnoreCase) < 0; return(exp); } if (registerBetweenCriterion.Register == Register.Rcx) { FramePredicateExpression exp = entity => string.Compare(entity.Rcx, registerBetweenCriterion.Low, StringComparison.OrdinalIgnoreCase) >= 0 && string.Compare(entity.Rcx, registerBetweenCriterion.High, StringComparison.OrdinalIgnoreCase) < 0; return(exp); } if (registerBetweenCriterion.Register == Register.Rdx) { FramePredicateExpression exp = entity => string.Compare(entity.Rdx, registerBetweenCriterion.Low, StringComparison.OrdinalIgnoreCase) >= 0 && string.Compare(entity.Rdx, registerBetweenCriterion.High, StringComparison.OrdinalIgnoreCase) < 0; return(exp); } /* * todo: PRIORITY FIX */ FramePredicateExpression ret = entity => false; return(ret); }