Пример #1
0
        public override ClrType GetObjectType(ulong objRef)
        {
            ulong mt;

            if (_lastObject.Address == objRef)
            {
                return(_lastObject.Type);
            }

            if (IsHeapCached)
            {
                return(base.GetObjectType(objRef));
            }

            MemoryReader cache = MemoryReader;

            if (cache.Contains(objRef))
            {
                if (!cache.ReadPtr(objRef, out mt))
                {
                    return(null);
                }
            }
            else if (DesktopRuntime.MemoryReader.Contains(objRef))
            {
                cache = DesktopRuntime.MemoryReader;
                if (!cache.ReadPtr(objRef, out mt))
                {
                    return(null);
                }
            }
            else
            {
                cache = null;
                mt    = DesktopRuntime.DataReader.ReadPointerUnsafe(objRef);
            }

            unchecked
            {
                if (((byte)mt & 3) != 0)
                {
                    mt &= ~3UL;
                }
            }

            ClrType type = GetTypeByMethodTable(mt, 0, objRef);

            _lastObject = ClrObject.Create(objRef, type);

            return(type);
        }
Пример #2
0
        public override ClrType GetObjectType(ulong objRef)
        {
            ulong mt, cmt = 0;

            if (_lastObject.Address == objRef)
            {
                return(_lastObject.Type);
            }

            if (IsHeapCached)
            {
                return(base.GetObjectType(objRef));
            }

            MemoryReader cache = MemoryReader;

            if (cache.Contains(objRef))
            {
                if (!cache.ReadPtr(objRef, out mt))
                {
                    return(null);
                }
            }
            else if (DesktopRuntime.MemoryReader.Contains(objRef))
            {
                cache = DesktopRuntime.MemoryReader;
                if (!cache.ReadPtr(objRef, out mt))
                {
                    return(null);
                }
            }
            else
            {
                cache = null;
                mt    = DesktopRuntime.DataReader.ReadPointerUnsafe(objRef);
            }

            if (((int)mt & 3) != 0)
            {
                mt &= ~3UL;
            }

            if (mt == DesktopRuntime.ArrayMethodTable)
            {
                uint elemenTypeOffset = (uint)PointerSize * 2;
                if (cache == null)
                {
                    cmt = DesktopRuntime.DataReader.ReadPointerUnsafe(objRef + elemenTypeOffset);
                }
                else if (!cache.ReadPtr(objRef + elemenTypeOffset, out cmt))
                {
                    return(null);
                }
            }
            else
            {
                cmt = 0;
            }

            ClrType type = GetTypeByMethodTable(mt, cmt, objRef);

            _lastObject = ClrObject.Create(objRef, type);

            return(type);
        }