internal static int GetReadableBytesCount()

in src/Microsoft.Diagnostics.Runtime/Extensions/ProcessReaderExtensions.cs [10:64]


        internal static int GetReadableBytesCount<TRegion>(this CommonMemoryReader _, ImmutableArray<TRegion>.Builder regions, ulong address, int bytesToRead)
            where TRegion : struct, IRegion
        {
            if (bytesToRead <= 0)
            {
                return 0;
            }

            int i = GetRegionContaining(regions, address);
            if (i < 0)
            {
                return 0;
            }

            int bytesReadable;
            ulong prevEndAddr;
            {
                ref readonly TRegion region = ref regions.ItemRef(i);
                ulong regionEndAddr = region.EndAddress;

                long regionSize = (long)(regionEndAddr - address);
                if (regionSize >= bytesToRead)
                {
                    return bytesToRead;
                }

                bytesToRead -= (int)regionSize;
                bytesReadable = (int)regionSize;
                prevEndAddr = regionEndAddr;
            }

            for (i += 1; i < regions.Count; i += 1)
            {
                ref readonly TRegion region = ref regions.ItemRef(i);
                ulong regionBeginAddr = region.BeginAddress;
                ulong regionEndAddr = region.EndAddress;
                if (regionBeginAddr != prevEndAddr || !region.IsReadable)
                {
                    break;
                }

                int regionSize = (int)(regionEndAddr - regionBeginAddr);
                if (regionSize >= bytesToRead)
                {
                    bytesReadable += bytesToRead;
                    break;
                }

                bytesToRead -= regionSize;
                bytesReadable += regionSize;
                prevEndAddr = regionEndAddr;
            }

            return bytesReadable;
        }