internal static unsafe ulong GetULongParam(MsQuicApi api, SafeHandle nativeObject, uint param)
        {
            ulong value;
            uint  valueLen = (uint)sizeof(ulong);

            uint status = api.GetParamDelegate(nativeObject, param, ref valueLen, (byte *)&value);

            QuicExceptionHelpers.ThrowIfFailed(status, "GetULongParam failed.");
            Debug.Assert(valueLen == sizeof(ulong));

            return(value);
        }
        internal static unsafe ushort GetUShortParam(MsQuicApi api, SafeHandle nativeObject, QUIC_PARAM_LEVEL level, uint param)
        {
            ushort value;
            uint   valueLen = (uint)sizeof(ushort);

            uint status = api.GetParamDelegate(nativeObject, level, param, ref valueLen, (byte *)&value);

            QuicExceptionHelpers.ThrowIfFailed(status, "GetUShortParam failed.");
            Debug.Assert(valueLen == sizeof(ushort));

            return(value);
        }
        internal static unsafe IPEndPoint GetIPEndPointParam(MsQuicApi api, SafeHandle nativeObject, uint param)
        {
            // MsQuic always uses storage size as if IPv6 was used
            uint        valueLen = (uint)Internals.SocketAddress.IPv6AddressSize;
            Span <byte> address  = stackalloc byte[Internals.SocketAddress.IPv6AddressSize];

            fixed(byte *paddress = &MemoryMarshal.GetReference(address))
            {
                uint status = api.GetParamDelegate(nativeObject, param, ref valueLen, paddress);

                QuicExceptionHelpers.ThrowIfFailed(status, "GetIPEndPointParam failed.");
            }

            address = address.Slice(0, (int)valueLen);

            return(new Internals.SocketAddress(SocketAddressPal.GetAddressFamily(address), address)
                   .GetIPEndPoint());
        }