示例#1
0
        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);
        }
示例#2
0
        public int GetTypeIndexFromName(ulong baseAddress, string name)
        {
            var symbol = SymbolInfo.Create();

            return(Win32.SymGetTypeFromName(_hProcess, baseAddress, name, ref symbol) ? symbol.TypeIndex : 0);
        }
示例#3
0
 public bool GetTypeFromName(ulong baseAddress, string name, ref SymbolInfo type)
 => Win32.SymGetTypeFromName(_hProcess, baseAddress, name, ref type);
示例#4
0
 public bool GetSymbolFromName(string name, ref SymbolInfo symbol)
 {
     return(Win32.SymFromName(_hProcess, name, ref symbol));
 }
示例#5
0
 public bool GetSymbolFromIndex(ulong dllBase, int index, ref SymbolInfo symbol)
 {
     return(Win32.SymFromIndex(_hProcess, dllBase, index, ref symbol));
 }
示例#6
0
 public bool TryGetSymbolFromAddress(ulong address, ref SymbolInfo symbol, out ulong displacement)
 {
     symbol.Init();
     return(Win32.SymFromAddr(_hProcess, address, out displacement, ref symbol));
 }
示例#7
0
 public static extern bool SymGetTypeFromName(IntPtr hProcess, ulong dllBase, string name, ref SymbolInfo symbol);
示例#8
0
 public static extern bool SymFromIndex(IntPtr hProcess, ulong dllBase, int index, ref SymbolInfo symbol);
示例#9
0
 public static extern bool SymFromName(IntPtr hProcess, string name, ref SymbolInfo symbol);
示例#10
0
 public static extern bool SymFromAddr(IntPtr hProcess, ulong address, out ulong displacement, ref SymbolInfo symbol);