Beispiel #1
0
        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);
        }
Beispiel #2
0
 public static extern bool SymGetTypeInfo(IntPtr hProcess, ulong baseOfDll, int typeId, SymbolTypeInfo typeinfo, ref FindChildrenParams value);