public StructDescriptor BuildStructDescriptor(ulong dllBase, int typeIndex) { if (Win32.SymGetTypeInfo(_hProcess, dllBase, typeIndex, SymbolTypeInfo.ChildrenCount, out int childrenCount)) { var structDesc = new StructDescriptor(childrenCount); if (Win32.SymGetTypeInfo(_hProcess, dllBase, typeIndex, SymbolTypeInfo.Length, out ulong size)) { structDesc.Length = (int)size; } var childrenParams = new FindChildrenParams { Count = childrenCount }; structDesc.Length = (int)size; if (Win32.SymGetTypeInfo(_hProcess, dllBase, typeIndex, SymbolTypeInfo.FindChildren, ref childrenParams)) { for (var i = 0; i < childrenParams.Count; i++) { var sym = SymbolInfo.Create(); var child = childrenParams.Child[i]; if (GetSymbolFromIndex(dllBase, child, ref sym)) { if (Win32.SymGetTypeInfo(_hProcess, dllBase, child, SymbolTypeInfo.Offset, out int offset) && Win32.SymGetTypeInfo(_hProcess, dllBase, child, SymbolTypeInfo.Tag, out SymbolTag tag)) { sym.Tag = tag; sym.TypeIndex = child; var member = new StructMember(sym, offset); structDesc.AddMember(member); } else if (Win32.SymGetTypeInfo(_hProcess, dllBase, child, SymbolTypeInfo.Value, out Variant value)) { sym.Tag = SymbolTag.Enum; sym.Value = value.lValue; sym.TypeIndex = child; var member = new StructMember(sym, 0); switch (sym.Size) { case 8: member.Value = value.lValue; break; case 2: member.Value = value.sValue; break; case 1: member.Value = value.bValue; break; default: member.Value = value.iValue; break; } structDesc.AddMember(member); } } } } return(structDesc); } return(null); }
public static extern bool SymGetTypeInfo(IntPtr hProcess, ulong baseOfDll, int typeId, SymbolTypeInfo typeinfo, ref FindChildrenParams value);