public Version? GetVersionInfo()

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