/// <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)); }
/// <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))); }); }
/// <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")); }
/// <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))); }
/// <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")); }
/// <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); } }); }
/// <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); }
/// <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")); }
/// <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"))); }
/// <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()); }
/// <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<")); }
/// <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<")); }
/// <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<")); }
/// <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); }
/// <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())); }
/// <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")); }
/// <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)); }
/// <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>()); }
/// <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); }
/// <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"))); }
/// <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); }
/// <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")); }
/// <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<")); }
/// <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")); }
/// <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)); }); }
/// <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>()); }); }
/// <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)); }
/// <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"))) { }
/// <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>()); }
/// <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)) { }