Beispiel #1
0
            /// <summary>
            /// Initializes a new instance of the <see cref="ClangLibCpp"/> class.
            /// </summary>
            /// <param name="variable">The variable.</param>
            /// <param name="savedData">Data returned from VerifyCodeType function.</param>
            public ClangLibCpp(Variable variable, object savedData)
            {
                data    = (ExtractedData)savedData;
                address = variable.GetPointerAddress();
                ulong stringAddress = data.Process.ReadPointer(address + (uint)data.PointerOffset);
                bool  localData     = stringAddress == 0;

                if (localData)
                {
                    stringAddress = address + (uint)data.BufferOffset;
                }
                bool bigEndian = true; // TODO:

                if (localData)
                {
                    length = data.ReadShortDataLength(address);
                    if (bigEndian)
                    {
                        length = length >> 1;
                    }
                }
                else
                {
                    length = data.ReadLongDataLength(address);
                }
                if (localData)
                {
                    reserved = data.BufferLength;
                }
                else
                {
                    reserved = data.ReadCapacity(address);
                }
                text = UserMember.Create(() => data.Process.ReadString(stringAddress, data.CharSize, length));
            }
Beispiel #2
0
                /// <summary>
                /// Initializes a new instance of the <see cref="item" /> class.
                /// </summary>
                /// <param name="variable">The variable.</param>
                /// <param name="pairCodeType">The key value pair code type.</param>
                public item(Variable variable, CodeType pairCodeType)
                {
                    left = UserMember.Create(() =>
                    {
                        Variable field = variable.GetField("_M_left");

                        return(field.IsNullPointer() ? null : new item(field, pairCodeType));
                    });
                    right = UserMember.Create(() =>
                    {
                        Variable field = variable.GetField("_M_right");

                        return(field.IsNullPointer() ? null : new item(field, pairCodeType));
                    });
                    parent = UserMember.Create(() =>
                    {
                        Variable field = variable.GetField("_M_parent");

                        return(field.IsNullPointer() ? null : new item(field, pairCodeType));
                    });
                    pair = UserMember.Create(() =>
                    {
                        // Since we cannot get field with address to key value pair, do pointer arithmetic to find address
                        ulong pairAddress = variable.GetPointerAddress() + variable.GetCodeType().ElementType.Size;

                        return(new pair <TKey, TValue>(Variable.Create(pairCodeType, pairAddress)));
                    });
                }
Beispiel #3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="VisualStudio"/> class.
 /// </summary>
 /// <param name="value">The value.</param>
 public VisualStudio(UserMember <Variable> value)
 {
     this.value = value;
     first      = UserMember.Create(() => Value.GetField("_Myfirst"));
     last       = UserMember.Create(() => Value.GetField("_Mylast"));
     end        = UserMember.Create(() => Value.GetField("_Myend"));
 }
Beispiel #4
0
            /// <summary>
            /// Initializes a new instance of the <see cref="VisualStudio"/> class.
            /// </summary>
            /// <param name="variable">The variable.</param>
            /// <param name="savedData">Data returned from VerifyCodeType function.</param>
            public VisualStudio(Variable variable, object savedData)
            {
                ExtractedData data    = (ExtractedData)savedData;
                ulong         address = variable.GetPointerAddress();

                list = UserMember.Create(() => new list <pair <TKey, TValue> >(Variable.Create(data.ListCodeType, address + (uint)data.ListOffset)));
            }
Beispiel #5
0
 /// <summary>
 /// Initializes a new instance of the <see cref="LibStdCpp6" /> class.
 /// </summary>
 /// <param name="variable">The variable.</param>
 public LibStdCpp6(Variable variable)
 {
     value = UserMember.Create(() => variable.GetField("_M_impl"));
     first = UserMember.Create(() => Value.GetField("_M_start"));
     last  = UserMember.Create(() => Value.GetField("_M_finish"));
     end   = UserMember.Create(() => Value.GetField("_M_end_of_storage"));
 }
Beispiel #6
0
            /// <summary>
            /// Initializes a new instance of the <see cref="LibStdCpp6"/> class.
            /// </summary>
            /// <param name="variable">The variable.</param>
            public LibStdCpp6(Variable variable)
            {
                // Initialize members
                pointer                 = UserMember.Create(() => variable.GetField("_M_ptr"));
                element                 = UserMember.Create(() => pointer.Value.DereferencePointer().CastAs <T>());
                sharedCount             = UserMember.Create(() => (int)variable.GetField("_M_refcount").GetField("_M_pi").GetField("_M_use_count"));
                weakCount               = UserMember.Create(() => (int)variable.GetField("_M_refcount").GetField("_M_pi").GetField("_M_weak_count"));
                isCreatedWithMakeShared = UserMember.Create(() =>
                {
                    CodeType codeType = variable.GetField("_M_refcount").GetField("_M_pi").DowncastInterface().GetCodeType();

                    if (codeType.Name.StartsWith("std::_Sp_counted_ptr_inplace<"))
                    {
                        return(true);
                    }

                    if (!codeType.Name.StartsWith("std::_Sp_counted_deleter<"))
                    {
                        return(false);
                    }

                    try
                    {
                        codeType = (CodeType)codeType.TemplateArguments[1];
                        return(codeType.Name.StartsWith("std::__shared_ptr<") && codeType.Name.Contains("::_Deleter<"));
                    }
                    catch
                    {
                        return(false);
                    }
                });
            }
Beispiel #7
0
 /// <summary>
 /// Initializes a new instance of the <see cref="VisualStudio"/> class.
 /// </summary>
 /// <param name="value">The value variable.</param>
 public VisualStudio(UserMember <Variable> value)
 {
     this.value = value;
     length     = UserMember.Create(() => (int)Value.GetField("_Mysize"));
     reserved   = UserMember.Create(() => (int)Value.GetField("_Myres"));
     text       = UserMember.Create(GetText);
 }
Beispiel #8
0
 /// <summary>
 /// Initializes a new instance of the <see cref="LibStdCpp6"/> class.
 /// </summary>
 /// <param name="variable">The variable.</param>
 public LibStdCpp6(Variable variable)
 {
     length      = UserMember.Create(() => (int)variable.GetField("_M_string_length"));
     text        = UserMember.Create(() => variable.GetField("_M_dataplus").GetField("_M_p"));
     localBuffer = UserMember.Create(() => variable.GetField("_M_local_buf"));
     capacity    = UserMember.Create(() => (int)variable.GetField("_M_allocated_capacity"));
 }
Beispiel #9
0
 /// <summary>
 /// Initializes a new instance of the <see cref="item"/> class.
 /// </summary>
 /// <param name="variable">The variable.</param>
 public item(Variable variable)
 {
     isnil  = UserMember.Create(() => (bool)variable.GetField("_Isnil"));
     left   = UserMember.Create(() => new item(variable.GetField("_Left")));
     right  = UserMember.Create(() => new item(variable.GetField("_Right")));
     parent = UserMember.Create(() => new item(variable.GetField("_Parent")));
     pair   = UserMember.Create(() => new pair <TKey, TValue>(variable.GetField("_Myval")));
 }
Beispiel #10
0
 /// <summary>
 /// Initializes a new instance of the <see cref="VisualStudio"/> class.
 /// </summary>
 /// <param name="variable">The variable.</param>
 /// <param name="savedData">Data returned from VerifyCodeType function.</param>
 public VisualStudio(Variable variable, object savedData)
 {
     data     = (ExtractedData)savedData;
     address  = variable.GetPointerAddress();
     length   = data.ReadSize(address);
     reserved = data.ReadReserved(address);
     text     = UserMember.Create(() => GetText());
 }
Beispiel #11
0
 /// <summary>
 /// Initializes a new instance of the <see cref="VisualStudio"/> class.
 /// </summary>
 /// <param name="variable">The variable.</param>
 public VisualStudio(Variable variable)
 {
     // Initialize members
     pointer                 = UserMember.Create(() => variable.GetField("_Ptr"));
     element                 = UserMember.Create(() => pointer.Value.DereferencePointer().CastAs <T>());
     sharedCount             = UserMember.Create(() => (int)variable.GetField("_Rep").GetField("_Uses"));
     weakCount               = UserMember.Create(() => (int)variable.GetField("_Rep").GetField("_Weaks"));
     isCreatedWithMakeShared = UserMember.Create(() => variable.GetField("_Rep").DowncastInterface().GetCodeType().Name.StartsWith("std::_Ref_count_obj<"));
 }
Beispiel #12
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ClangLibCpp"/> class.
 /// </summary>
 /// <param name="variable">The variable.</param>
 public ClangLibCpp(Variable variable)
 {
     // Initialize members
     pointer                 = UserMember.Create(() => variable.GetField("__ptr_"));
     element                 = UserMember.Create(() => pointer.Value.DereferencePointer().CastAs <T>());
     sharedCount             = UserMember.Create(() => (int)variable.GetField("__cntrl_").GetField("__shared_owners_") + 1);
     weakCount               = UserMember.Create(() => (int)variable.GetField("__cntrl_").GetField("__shared_weak_owners_") + 1);
     isCreatedWithMakeShared = UserMember.Create(() => variable.GetField("__cntrl_").DowncastInterface().GetCodeType().Name.StartsWith("std::__1::__shared_ptr_emplace<"));
 }
Beispiel #13
0
 /// <summary>
 /// Initializes a new instance of the <see cref="VisualStudio"/> class.
 /// </summary>
 /// <param name="variable">The variable.</param>
 public LibStdCpp6(Variable variable)
 {
     // Initialize members
     pointer                 = UserMember.Create(() => variable.GetField("_M_ptr"));
     element                 = UserMember.Create(() => pointer.Value.DereferencePointer().CastAs <T>());
     sharedCount             = UserMember.Create(() => (int)variable.GetField("_M_refcount").GetField("_M_pi").GetField("_M_use_count"));
     weakCount               = UserMember.Create(() => (int)variable.GetField("_M_refcount").GetField("_M_pi").GetField("_M_weak_count"));
     isCreatedWithMakeShared = UserMember.Create(() => variable.GetField("_M_refcount").GetField("_M_pi").DowncastInterface().GetCodeType().Name.StartsWith("std::_Sp_counted_ptr_inplace<"));
 }
Beispiel #14
0
            /// <summary>
            /// Initializes a new instance of the <see cref="LibStdCpp6"/> class.
            /// </summary>
            /// <param name="variable">The variable.</param>
            public LibStdCpp6(Variable variable)
            {
                CodeType codeType         = variable.GetCodeType();
                CodeType templateCodeType = (CodeType)codeType.TemplateArguments[0];
                CodeType intCodeType      = (CodeType)codeType.GetFieldType("_M_impl").GetFieldType("_M_node").GetFieldType("_M_storage").TemplateArguments[0];

                count = UserMember.Create(() => new list <int> .LibStdCpp6.item(variable.GetField("_M_impl").GetField("_M_node"), intCodeType).Value);
                head  = UserMember.Create(() => new item(variable.GetField("_M_impl").GetField("_M_node"), templateCodeType).Next);
            }
Beispiel #15
0
            /// <summary>
            /// Initializes a new instance of the <see cref="SharedPtrBase"/> class.
            /// </summary>
            /// <param name="variable">The variable.</param>
            /// <param name="savedData">Data returned from VerifyCodeType function.</param>
            public SharedPtrBase(Variable variable, object savedData)
            {
                data = (ExtractedData)savedData;
                ulong address = variable.GetPointerAddress();

                pointerAddress          = data.Process.ReadPointer(address + (uint)data.PointerOffset);
                referenceCountAddress   = data.Process.ReadPointer(address + (uint)data.ReferenceCountPointerOffset);
                isCreatedWithMakeShared = UserMember.Create(() => data.TestCreatedWithMakeShared(Variable.Create(data.ReferenceCountCodeType, referenceCountAddress).DowncastInterface().GetCodeType()));
            }
Beispiel #16
0
            /// <summary>
            /// Initializes a new instance of the <see cref="LibStdCpp6_NoAbi"/> class.
            /// </summary>
            /// <param name="variable">The variable.</param>
            public LibStdCpp6_NoAbi(Variable variable)
            {
                CodeType codeType = variable.GetCodeType();
                CodeType _Rep     = CodeType.Create($"{codeType.Name}::_Rep", codeType.Module);

                header   = UserMember.Create(() => text.Value.AdjustPointer(-(int)_Rep.Size).CastAs(_Rep));
                length   = UserMember.Create(() => (int)header.Value.GetField("_M_length"));
                text     = UserMember.Create(() => variable.GetField("_M_dataplus").GetField("_M_p"));
                capacity = UserMember.Create(() => (int)header.Value.GetField("_M_capacity"));
            }
Beispiel #17
0
            /// <summary>
            /// Initializes a new instance of the <see cref="LibStdCpp6_NoAbi"/> class.
            /// </summary>
            /// <param name="variable">The variable.</param>
            /// <param name="savedData">Data returned from VerifyCodeType function.</param>
            public LibStdCpp6_NoAbi(Variable variable, object savedData)
            {
                data    = (ExtractedData)savedData;
                address = variable.GetPointerAddress();
                ulong stringAddress = data.Process.ReadPointer(address + (uint)data.PointerOffset);

                length   = data.ReadLength(stringAddress);
                reserved = data.ReadCapacity(stringAddress);
                text     = UserMember.Create(() => data.Process.ReadString(stringAddress, data.CharSize, length));
            }
Beispiel #18
0
        /// <summary>
        /// Initializes a new instance of the <see cref="pair{TFirst, TSecond}"/> class.
        /// </summary>
        /// <param name="variable">The variable.</param>
        /// <exception cref="WrongCodeTypeException">std::pair</exception>
        public pair(Variable variable)
        {
            // Verify code type
            if (!VerifyCodeType(variable.GetCodeType()))
            {
                throw new WrongCodeTypeException(variable, nameof(variable), "std::pair");
            }

            // Initialize members
            first  = UserMember.Create(() => variable.GetField("first").CastAs <TFirst>());
            second = UserMember.Create(() => variable.GetField("second").CastAs <TSecond>());
        }
Beispiel #19
0
            /// <summary>
            /// Initializes a new instance of the <see cref="LibStdCpp6"/> class.
            /// </summary>
            /// <param name="variable">The variable.</param>
            public LibStdCpp6(Variable variable)
            {
                value = UserMember.Create(() =>
                {
                    Variable t = variable.GetField("_M_t");

                    pairCodeType = (CodeType)t.GetCodeType().TemplateArguments[1];
                    return(t.GetField("_M_impl"));
                });
                size = UserMember.Create(() => (int)Value.GetField("_M_node_count"));
                root = UserMember.Create(() => new item(Value.GetField("_M_header"), pairCodeType).Parent);
            }
Beispiel #20
0
        /// <summary>
        /// Initializes a new instance of the <see cref="list{T}"/> class.
        /// </summary>
        /// <param name="variable">The variable.</param>
        public list(Variable variable)
        {
            // Verify code type
            if (!VerifyCodeType(variable.GetCodeType()))
            {
                throw new Exception("Wrong code type of passed variable " + variable.GetCodeType().Name);
            }

            // Initialize members
            value  = UserMember.Create(() => variable.GetField("_Mypair").GetField("_Myval2"));
            length = UserMember.Create(() => (int)Value.GetField("_Mysize"));
            head   = UserMember.Create(() => new item(Value.GetField("_Myhead")));
        }
Beispiel #21
0
        /// <summary>
        /// Initializes a new instance of the <see cref="basic_string"/> class.
        /// </summary>
        /// <param name="variable">The variable.</param>
        public basic_string(Variable variable)
        {
            // Verify code type
            if (!VerifyCodeType(variable.GetCodeType()))
            {
                throw new Exception("Wrong code type of passed variable " + variable.GetCodeType().Name);
            }

            // Initialize members
            value    = UserMember.Create(() => variable.GetField("_Mypair").GetField("_Myval2"));
            length   = UserMember.Create(() => (int)Value.GetField("_Mysize"));
            reserved = UserMember.Create(() => (int)Value.GetField("_Myres"));
            text     = UserMember.Create(GetText);
        }
Beispiel #22
0
        /// <summary>
        /// Initializes a new instance of the <see cref="vector{T}"/> class.
        /// </summary>
        /// <param name="variable">The variable.</param>
        public vector(Variable variable)
        {
            // Verify code type
            if (!VerifyCodeType(variable.GetCodeType()))
            {
                throw new Exception("Wrong code type of passed variable " + variable.GetCodeType().Name);
            }

            // Initialize members
            value = UserMember.Create(() => variable.GetField("_Mypair").GetField("_Myval2"));
            first = UserMember.Create(() => Value.GetField("_Myfirst"));
            last  = UserMember.Create(() => Value.GetField("_Mylast"));
            end   = UserMember.Create(() => Value.GetField("_Myend"));
        }
Beispiel #23
0
        /// <summary>
        /// Initializes a new instance of the <see cref="shared_ptr{T}"/> class.
        /// </summary>
        /// <param name="variable">The variable.</param>
        public shared_ptr(Variable variable)
        {
            // Verify code type
            if (!VerifyCodeType(variable.GetCodeType()))
            {
                throw new WrongCodeTypeException(variable, nameof(variable), "std::shared_ptr");
            }

            // Initialize members
            pointer                 = UserMember.Create(() => variable.GetField("_Ptr"));
            element                 = UserMember.Create(() => pointer.Value.DereferencePointer().CastAs <T>());
            sharedCount             = UserMember.Create(() => (int)variable.GetField("_Rep").GetField("_Uses"));
            weakCount               = UserMember.Create(() => (int)variable.GetField("_Rep").GetField("_Weaks"));
            isCreatedWithMakeShared = UserMember.Create(() => variable.GetField("_Rep").DowncastInterface().GetCodeType().Name.StartsWith("std::_Ref_count_obj<"));
        }
Beispiel #24
0
            /// <summary>
            /// Initializes a new instance of the <see cref="LibStdCpp6"/> class.
            /// </summary>
            /// <param name="variable">The variable.</param>
            public LibStdCpp6(Variable variable)
            {
                buckets = UserMember.Create(() =>
                {
                    Variable h = variable.GetField("_M_h");
                    Variable b = h.GetField("_M_buckets");
                    int count  = (int)h.GetField("_M_bucket_count");

                    elementCodeType = (CodeType)h.GetCodeType().TemplateArguments[1];
                    return(new CodeArray <Variable>(b, count));
                });
                beforeBegin = UserMember.Create(() =>
                {
                    Variable h = variable.GetField("_M_h");

                    elementCodeType = (CodeType)h.GetCodeType().TemplateArguments[1];
                    return(h.GetField("_M_before_begin"));
                });
                elementCount = UserMember.Create(() => (int)variable.GetField("_M_h").GetField("_M_element_count"));
            }
Beispiel #25
0
                /// <summary>
                /// Initializes a new instance of the <see cref="item"/> class.
                /// </summary>
                /// <param name="address">The address of item.</param>
                /// <param name="data">Data returned from VerifyCodeType function.</param>
                public item(ulong address, ExtractedData data)
                {
                    isnil = UserMember.Create(() => data.ReadItemIsNil != null && data.ReadItemIsNil(address) != 0);
                    left  = UserMember.Create(() =>
                    {
                        ulong leftAddress = data.Process.ReadPointer(address + (uint)data.ItemLeftOffset);

                        if (leftAddress == 0)
                        {
                            return(null);
                        }
                        return(new item(leftAddress, data));
                    });
                    right = UserMember.Create(() =>
                    {
                        ulong rightAddress = data.Process.ReadPointer(address + (uint)data.ItemRightOffset);

                        if (rightAddress == 0)
                        {
                            return(null);
                        }
                        return(new item(rightAddress, data));
                    });
                    parent = UserMember.Create(() =>
                    {
                        ulong parentAddress = data.Process.ReadPointer(address + (uint)data.ItemParentOffset);

                        if (parentAddress == 0)
                        {
                            return(null);
                        }
                        return(new item(parentAddress, data));
                    });
                    pair = UserMember.Create(() =>
                    {
                        ulong pairAddress     = address + (uint)data.ItemValueOffset;
                        Variable pairVariable = Variable.Create(data.ItemValueCodeType, pairAddress);

                        return(new pair <TKey, TValue>(pairVariable));
                    });
                }
Beispiel #26
0
                /// <summary>
                /// Initializes a new instance of the <see cref="item"/> class.
                /// </summary>
                /// <param name="address">The address of item.</param>
                /// <param name="data">Data returned from VerifyCodeType function.</param>
                public item(ulong address, ExtractedData data)
                {
                    next = UserMember.Create(() =>
                    {
                        ulong nextAddress = data.Process.ReadPointer(address + (uint)data.ItemNextOffset);

                        return(new item(nextAddress, data));
                    });
                    previous = UserMember.Create(() =>
                    {
                        ulong previousAddress = data.Process.ReadPointer(address + (uint)data.ItemPreviousOffset);

                        return(new item(previousAddress, data));
                    });
                    value = UserMember.Create(() =>
                    {
                        ulong valueAddress = address + (uint)data.ItemValueOffset;

                        return(Variable.Create(data.ItemValueCodeType, valueAddress).CastAs <T>());
                    });
                }
Beispiel #27
0
            /// <summary>
            /// Initializes a new instance of the <see cref="LibStdCpp6_NoAbi"/> class.
            /// </summary>
            /// <param name="variable">The variable.</param>
            public LibStdCpp6_NoAbi(Variable variable)
            {
                CodeType codeType         = variable.GetCodeType();
                CodeType templateCodeType = (CodeType)codeType.TemplateArguments[0];
                CodeType listNodeCodeType = GetListNodeCodeType(codeType);

                count = UserMember.Create(() =>
                {
                    int count      = 0;
                    Variable start = anchor.Value;
                    Variable next  = start.GetField("_M_next");

                    while (next.GetPointerAddress() != start.GetPointerAddress())
                    {
                        next = next.GetField("_M_next");
                        count++;
                    }
                    return(count);
                });
                anchor = UserMember.Create(() => variable.GetField("_M_impl").GetField("_M_node"));
                head   = UserMember.Create(() => new item(anchor.Value.GetField("_M_next").CastAs(listNodeCodeType), templateCodeType));
            }
Beispiel #28
0
 /// <summary>
 /// Initializes a new instance of the <see cref="VisualStudio2015" /> class.
 /// </summary>
 /// <param name="variable">The variable.</param>
 public VisualStudio2015(Variable variable)
     : base(UserMember.Create(() => variable.GetField("_Mypair").GetField("_Myval2")))
 {
 }
Beispiel #29
0
 /// <summary>
 /// Initializes a new instance of the <see cref="item"/> class.
 /// </summary>
 /// <param name="variable">The variable.</param>
 public item(Variable variable)
 {
     next     = UserMember.Create(() => new item(variable.GetField("_Next")));
     previous = UserMember.Create(() => new item(variable.GetField("_Prev")));
     value    = UserMember.Create(() => variable.GetField("_Myval").CastAs <T>());
 }
Beispiel #30
0
 /// <summary>
 /// Initializes a new instance of the <see cref="VisualStudio2013" /> class.
 /// </summary>
 /// <param name="variable">The variable.</param>
 public VisualStudio2013(Variable variable)
     : base(UserMember.Create(() => variable))
 {
 }