PointerInfo IDumpDataReader.Read(CancellationToken token, IProgress <int> prog)
        {
            var sw = new System.Diagnostics.Stopwatch();

            sw.Start();
            PointerInfo pointerInfo = new PointerInfo();
            const int   readMaxSize = 4096;

            ReadIndicate();

            //foreach (NoexsDumpIndex x in indices)
            for (int index = 0; index < indices.Count; index++)
            {
                NoexsDumpIndex x = indices[index];
                if (token.IsCancellationRequested)
                {
                    token.ThrowIfCancellationRequested();
                }
                if (!IsMainHeapAddress(x.address))
                {
                    continue;
                }
                fileStream.BaseStream.Seek(x.pos, SeekOrigin.Begin);
                MemoryType type         = GetMemoryType(x.address);
                long       startAddress = GetStartAddress(type);
                long       address      = x.address - startAddress;
                long       rem          = x.size;

                while (rem > 0)
                {
                    if (token.IsCancellationRequested)
                    {
                        token.ThrowIfCancellationRequested();
                    }
                    int readSize = readMaxSize;
                    if (rem < readSize)
                    {
                        readSize = (int)rem;
                    }
                    rem -= readSize;
                    byte[] buff = fileStream.ReadBytes(readSize);
                    //pickup pointer from heap
                    int loopcnt = readSize / 8;
                    for (int i = 0; i < loopcnt; i++)
                    {
                        long tmp_data = BitConverter.ToInt64(buff, i << 3);
                        if (IsHeapAddress(tmp_data))
                        {
                            Address from = new Address(type, address);
                            Address to   = new Address(MemoryType.HEAP, tmp_data - heapStartAddress);
                            pointerInfo.AddPointer(from, to);
                        }
                        address += 8;
                    }
                }
                prog.Report((int)(100 * (index + 1) / indices.Count));
            }
            pointerInfo.MakeList();
            sw.Stop();
            TimeSpan ts = sw.Elapsed;

            //3.28.24
            return(pointerInfo);
        }