From 7cf6ebadce803d36e41cbb83d64d34a7f234f767 Mon Sep 17 00:00:00 2001 From: Radek Zikmund Date: Fri, 2 Sep 2022 10:55:32 +0200 Subject: [PATCH] Improve diagnostics when opening MsQuic --- .../src/System/Net/Quic/Internal/MsQuicApi.cs | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/Internal/MsQuicApi.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/Internal/MsQuicApi.cs index eb06b9dce8e64..0e077a514dd04 100644 --- a/src/libraries/System.Net.Quic/src/System/Net/Quic/Internal/MsQuicApi.cs +++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/Internal/MsQuicApi.cs @@ -67,7 +67,7 @@ static MsQuicApi() try { - if (!TryOpenMsQuic(msQuicHandle, out QUIC_API_TABLE* apiTable)) + if (!TryOpenMsQuic(msQuicHandle, out QUIC_API_TABLE* apiTable, out _)) { return; } @@ -136,12 +136,17 @@ private static MsQuicApi AllocateMsQuicApi() { Debug.Assert(IsQuicSupported); + int openStatus = MsQuic.QUIC_STATUS_INTERNAL_ERROR; + if (TryLoadMsQuic(out IntPtr msQuicHandle) && - TryOpenMsQuic(msQuicHandle, out QUIC_API_TABLE* apiTable)) + TryOpenMsQuic(msQuicHandle, out QUIC_API_TABLE* apiTable, out openStatus)) { return new MsQuicApi(apiTable); } + ThrowHelper.ThrowIfMsQuicError(openStatus); + + // this should unreachable as TryOpenMsQuic returns non-success status on failure throw new Exception("Failed to create MsQuicApi instance"); } @@ -149,18 +154,30 @@ private static bool TryLoadMsQuic(out IntPtr msQuicHandle) => NativeLibrary.TryLoad($"{Interop.Libraries.MsQuic}.{MsQuicVersion.Major}", typeof(MsQuicApi).Assembly, DllImportSearchPath.AssemblyDirectory, out msQuicHandle) || NativeLibrary.TryLoad(Interop.Libraries.MsQuic, typeof(MsQuicApi).Assembly, DllImportSearchPath.AssemblyDirectory, out msQuicHandle); - private static bool TryOpenMsQuic(IntPtr msQuicHandle, out QUIC_API_TABLE* apiTable) + private static bool TryOpenMsQuic(IntPtr msQuicHandle, out QUIC_API_TABLE* apiTable, out int openStatus) { apiTable = null; if (!NativeLibrary.TryGetExport(msQuicHandle, "MsQuicOpenVersion", out IntPtr msQuicOpenVersionAddress)) { + if (NetEventSource.Log.IsEnabled()) + { + NetEventSource.Info(null, "Failed to get MsQuicOpenVersion export in msquic library."); + } + + openStatus = MsQuic.QUIC_STATUS_NOT_FOUND; return false; } QUIC_API_TABLE* table = null; delegate* unmanaged[Cdecl] msQuicOpenVersion = (delegate* unmanaged[Cdecl])msQuicOpenVersionAddress; - if (StatusFailed(msQuicOpenVersion((uint)MsQuicVersion.Major, &table))) + openStatus = msQuicOpenVersion((uint)MsQuicVersion.Major, &table); + if (StatusFailed(openStatus)) { + if (NetEventSource.Log.IsEnabled()) + { + NetEventSource.Info(null, $"MsQuicOpenVersion returned {openStatus} status code."); + } + return false; }