示例#1
0
        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);
        }
示例#2
0
        /// <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);
        }