public unsafe 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 int GetTypeIndexFromName(ulong baseAddress, string name) { var symbol = SymbolInfo.Create(); return(Win32.SymGetTypeFromName(_hProcess, baseAddress, name, ref symbol) ? symbol.TypeIndex : 0); }
public bool GetTypeFromName(ulong baseAddress, string name, ref SymbolInfo type) => Win32.SymGetTypeFromName(_hProcess, baseAddress, name, ref type);
public bool GetSymbolFromName(string name, ref SymbolInfo symbol) { return(Win32.SymFromName(_hProcess, name, ref symbol)); }
public bool GetSymbolFromIndex(ulong dllBase, int index, ref SymbolInfo symbol) { return(Win32.SymFromIndex(_hProcess, dllBase, index, ref symbol)); }
public bool TryGetSymbolFromAddress(ulong address, ref SymbolInfo symbol, out ulong displacement) { symbol.Init(); return(Win32.SymFromAddr(_hProcess, address, out displacement, ref symbol)); }
public static extern bool SymGetTypeFromName(IntPtr hProcess, ulong dllBase, string name, ref SymbolInfo symbol);
public static extern bool SymFromIndex(IntPtr hProcess, ulong dllBase, int index, ref SymbolInfo symbol);
public static extern bool SymFromName(IntPtr hProcess, string name, ref SymbolInfo symbol);
public static extern bool SymFromAddr(IntPtr hProcess, ulong address, out ulong displacement, ref SymbolInfo symbol);