File: Windows\Win32\PInvoke.GetModuleFileNameLongPath.cs
Web Access
Project: src\src\System.Windows.Forms.Primitives\src\System.Windows.Forms.Primitives.csproj (System.Windows.Forms.Primitives)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Runtime.CompilerServices;
 
namespace Windows.Win32;
 
internal static partial class PInvoke
{
    [SkipLocalsInit]
    public static unsafe string GetModuleFileNameLongPath(HINSTANCE hModule)
    {
        using BufferScope<char> buffer = new(stackalloc char[(int)PInvokeCore.MAX_PATH]);
 
        // Allocate increasingly larger portions of memory until successful or we hit short.maxvalue.
        while (true)
        {
            fixed (char* lpFilename = buffer)
            {
                int pathLength = (int)GetModuleFileName(hModule, lpFilename, (uint)buffer.Length);
 
                if (pathLength == 0)
                {
                    return string.Empty;
                }
 
                // If the length equals the buffer size we need to check to see if we were told the buffer was insufficient (it was trimmed)
                if (pathLength < buffer.Length)
                {
                    // Get return value and return buffer to array pool.
                    return buffer[..pathLength].ToString();
                }
 
                if (buffer.Length >= short.MaxValue)
                {
                    // Should never happen
                    Debug.Fail($"Module File Name is greater than {short.MaxValue}.");
                    return string.Empty;
                }
 
                buffer.EnsureCapacity(Math.Min(buffer.Length * 2, short.MaxValue));
            }
        }
    }
}