in src/Microsoft.Diagnostics.Runtime.Utilities/DbgEng/DbgEngIDataReader.cs [291:348]
public Version? GetVersionInfo(ulong baseAddress, uint moduleSize)
{
if (TargetPlatform == OSPlatform.Windows)
{
if (!FindModuleIndex(baseAddress, out int index))
return null;
byte[] buffer = ArrayPool<byte>.Shared.Rent(256);
try
{
HResult hr = DebugSymbols.GetModuleVersionInformation(index, baseAddress, "\\\\\0", buffer);
if (!hr)
return new Version();
int minor = Unsafe.As<byte, ushort>(ref buffer[8]);
int major = Unsafe.As<byte, ushort>(ref buffer[10]);
int patch = Unsafe.As<byte, ushort>(ref buffer[12]);
int revision = Unsafe.As<byte, ushort>(ref buffer[14]);
return new Version(major, minor, revision, patch);
}
finally
{
ArrayPool<byte>.Shared.Return(buffer);
}
}
else
{
// GetModuleVersionInformation has a bug which we are working around here
byte[] versionString = Encoding.ASCII.GetBytes(VersionString);
if (DebugDataSpaces.Search(baseAddress, moduleSize, versionString, 1, out ulong offsetFound))
{
byte[] bufferArray = ArrayPool<byte>.Shared.Rent(256);
Span<byte> buffer = bufferArray;
try
{
if (DebugDataSpaces.ReadVirtual(offsetFound + (uint)VersionString.Length, buffer, out int read))
{
string versionStr = Encoding.ASCII.GetString(buffer[0..read]);
int space = versionStr.IndexOf(' ');
if (space > 0)
{
versionStr = versionStr[0..space];
Version version = new(versionStr);
return version;
}
}
}
finally
{
ArrayPool<byte>.Shared.Return(bufferArray);
}
}
return null;
}
}