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;
}