diff --git a/src/libraries/Common/src/System/Runtime/InteropServices/ComEventsSink.cs b/src/libraries/Common/src/System/Runtime/InteropServices/ComEventsSink.cs
index e9b6cd0370f6c..11d1cfda361c5 100644
--- a/src/libraries/Common/src/System/Runtime/InteropServices/ComEventsSink.cs
+++ b/src/libraries/Common/src/System/Runtime/InteropServices/ComEventsSink.cs
@@ -215,7 +215,9 @@ unsafe void IDispatch.Invoke(
// convert result to VARIANT
if (pVarResult != IntPtr.Zero)
{
+#pragma warning disable CA1416 // Validate platform compatibility, cannot use any of guard methods
Marshal.GetNativeVariantForObject(result, pVarResult);
+#pragma warning restore CA1416
}
// Now we need to marshal all the byrefs back
@@ -237,7 +239,9 @@ CustomQueryInterfaceResult ICustomQueryInterface.GetInterface(ref Guid iid, out
ppv = IntPtr.Zero;
if (iid == _iidSourceItf || iid == typeof(IDispatch).GUID)
{
+#pragma warning disable CA1416 // Validate platform compatibility, cannot use any of guard methods
ppv = Marshal.GetComInterfaceForObject(this, typeof(IDispatch), CustomQueryInterfaceMode.Ignore);
+#pragma warning restore CA1416
return CustomQueryInterfaceResult.Handled;
}
@@ -267,7 +271,9 @@ private void Unadvise()
try
{
_connectionPoint.Unadvise(_cookie);
+#pragma warning disable CA1416 // Validate platform compatibility, cannot use any of guard methods
Marshal.ReleaseComObject(_connectionPoint);
+#pragma warning restore CA1416
}
catch
{
diff --git a/src/libraries/Common/src/System/Runtime/InteropServices/Variant.cs b/src/libraries/Common/src/System/Runtime/InteropServices/Variant.cs
index f845179c51066..6bb08e61754fe 100644
--- a/src/libraries/Common/src/System/Runtime/InteropServices/Variant.cs
+++ b/src/libraries/Common/src/System/Runtime/InteropServices/Variant.cs
@@ -130,7 +130,7 @@ public unsafe void CopyFromIndirect(object value)
}
return;
}
-
+#pragma warning disable CA1416 // Validate platform compatibility, cannot use any of guard methods
if ((vt & VarEnum.VT_ARRAY) != 0)
{
Variant vArray;
@@ -224,6 +224,7 @@ public unsafe void CopyFromIndirect(object value)
default:
throw new ArgumentException();
}
+#pragma warning restore CA1416
}
///
@@ -269,7 +270,9 @@ public unsafe void CopyFromIndirect(object value)
{
fixed (void* pThis = &this)
{
+#pragma warning disable CA1416 // Validate platform compatibility, cannot use any of guard methods
return Marshal.GetObjectForNativeVariant((System.IntPtr)pThis);
+#pragma warning restore CA1416
}
}
}
@@ -645,6 +648,7 @@ public string AsBstr
// VT_UNKNOWN
+#pragma warning disable CA1416 // Validate platform compatibility, cannot use any of guard methods
public object? AsUnknown
{
get
@@ -698,6 +702,7 @@ public object? AsDispatch
}
}
}
+#pragma warning restore CA1416
public IntPtr AsByRefVariant
{
diff --git a/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComEventSinksContainer.cs b/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComEventSinksContainer.cs
index 2b9a068b3cc11..9e577e92151a5 100644
--- a/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComEventSinksContainer.cs
+++ b/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComEventSinksContainer.cs
@@ -22,6 +22,7 @@ private ComEventSinksContainer()
public static ComEventSinksContainer FromRuntimeCallableWrapper(object rcw, bool createIfNotFound)
{
+#pragma warning disable CA1416 // Validate platform compatibility, cannot use any of guard methods
object data = Marshal.GetComObjectData(rcw, s_comObjectEventSinksKey);
if (data != null || createIfNotFound == false)
{
@@ -41,6 +42,7 @@ public static ComEventSinksContainer FromRuntimeCallableWrapper(object rcw, bool
{
throw Error.SetComObjectDataFailed();
}
+#pragma warning restore CA1416
return comEventSinks;
}
diff --git a/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComObject.cs b/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComObject.cs
index b4724ca2fccdc..d6cabc6cbc379 100644
--- a/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComObject.cs
+++ b/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComObject.cs
@@ -34,6 +34,7 @@ public static ComObject ObjectToComObject(object rcw)
{
Debug.Assert(ComBinder.IsComObject(rcw));
+#pragma warning disable CA1416 // Validate platform compatibility, cannot use any of guard methods
object data = Marshal.GetComObjectData(rcw, s_comObjectInfoKey);
if (data != null)
{
@@ -53,6 +54,7 @@ public static ComObject ObjectToComObject(object rcw)
{
throw Error.SetComObjectDataFailed();
}
+#pragma warning restore CA1416
return comObjectInfo;
}
diff --git a/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComRuntimeHelpers.cs b/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComRuntimeHelpers.cs
index 475c2c5753bf1..47701f8774bce 100644
--- a/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComRuntimeHelpers.cs
+++ b/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComRuntimeHelpers.cs
@@ -146,6 +146,7 @@ internal static ComTypes.ITypeInfo GetITypeInfoFromIDispatch(IDispatch dispatch)
Marshal.ThrowExceptionForHR(ComHresults.E_FAIL);
}
+#pragma warning disable CA1416 // Validate platform compatibility, cannot use any of guard methods
ComTypes.ITypeInfo typeInfo = null;
try
{
@@ -155,6 +156,7 @@ internal static ComTypes.ITypeInfo GetITypeInfoFromIDispatch(IDispatch dispatch)
{
Marshal.Release(typeInfoPtr);
}
+#pragma warning restore CA1416
return typeInfo;
}
@@ -236,6 +238,7 @@ internal static Variant GetVariantForObject(object obj)
return variant;
}
+#pragma warning disable CA1416 // Validate platform compatibility, cannot use any of guard methods
internal static void InitVariantForObject(object obj, ref Variant variant)
{
Debug.Assert(obj != null);
@@ -258,6 +261,7 @@ public static object GetObjectForVariant(Variant variant)
IntPtr ptr = UnsafeMethods.ConvertVariantByrefToPtr(ref variant);
return Marshal.GetObjectForNativeVariant(ptr);
}
+#pragma warning restore CA1416
// This method is intended for use through reflection and should only be used directly by IUnknownReleaseNotZero
public static unsafe int IUnknownRelease(IntPtr interfacePointer)
diff --git a/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComTypeClassDesc.cs b/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComTypeClassDesc.cs
index 1c33aff3b4358..552d3f95a1e34 100644
--- a/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComTypeClassDesc.cs
+++ b/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComTypeClassDesc.cs
@@ -17,11 +17,13 @@ internal class ComTypeClassDesc : ComTypeDesc, IDynamicMetaObjectProvider
public object CreateInstance()
{
+#pragma warning disable CA1416 // Validate platform compatibility, cannot use any of guard methods
if (_typeObj == null)
{
_typeObj = Type.GetTypeFromCLSID(Guid);
}
return Activator.CreateInstance(Type.GetTypeFromCLSID(Guid));
+#pragma warning restore CA1416
}
internal ComTypeClassDesc(ComTypes.ITypeInfo typeInfo, ComTypeLibDesc typeLibDesc) :
diff --git a/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComTypeEnumDesc.cs b/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComTypeEnumDesc.cs
index 470f55e59a00b..31905220b9944 100644
--- a/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComTypeEnumDesc.cs
+++ b/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ComTypeEnumDesc.cs
@@ -43,7 +43,9 @@ internal ComTypeEnumDesc(ComTypes.ITypeInfo typeInfo, ComTypeLibDesc typeLibDesc
if (varDesc.varkind == ComTypes.VARKIND.VAR_CONST)
{
+#pragma warning disable CA1416 // Validate platform compatibility, cannot use any of guard methods
memberValues[i] = Marshal.GetObjectForNativeVariant(varDesc.desc.lpvarValue);
+#pragma warning restore CA1416
}
}
finally
diff --git a/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/DispatchArgBuilder.cs b/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/DispatchArgBuilder.cs
index 2c0c9d05af987..83740a168c073 100644
--- a/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/DispatchArgBuilder.cs
+++ b/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/DispatchArgBuilder.cs
@@ -24,10 +24,12 @@ internal override Expression Marshal(Expression parameter)
// parameter.WrappedObject
if (_isWrapper)
{
+#pragma warning disable CA1416 // Validate platform compatibility, cannot use any of guard methods
parameter = Expression.Property(
Helpers.Convert(parameter, typeof(DispatchWrapper)),
typeof(DispatchWrapper).GetProperty(nameof(DispatchWrapper.WrappedObject))
);
+#pragma warning restore CA1416
}
return Helpers.Convert(parameter, typeof(object));
diff --git a/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/IDispatchComObject.cs b/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/IDispatchComObject.cs
index 4ce86951f1aa8..83ccfa70bda81 100644
--- a/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/IDispatchComObject.cs
+++ b/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/IDispatchComObject.cs
@@ -477,6 +477,7 @@ private static ComTypes.ITypeInfo GetCoClassTypeInfo(object rcw, ComTypes.ITypeI
if (rcw is IProvideClassInfo provideClassInfo)
{
IntPtr typeInfoPtr = IntPtr.Zero;
+#pragma warning disable CA1416 // Validate platform compatibility, cannot use any of guard methods
try
{
provideClassInfo.GetClassInfo(out typeInfoPtr);
@@ -492,6 +493,7 @@ private static ComTypes.ITypeInfo GetCoClassTypeInfo(object rcw, ComTypes.ITypeI
Marshal.Release(typeInfoPtr);
}
}
+#pragma warning restore CA1416
}
// retrieving class information through IPCI has failed -
diff --git a/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/Variant.Extended.cs b/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/Variant.Extended.cs
index 777518d1a6dbc..0ff0f77027848 100644
--- a/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/Variant.Extended.cs
+++ b/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/Variant.Extended.cs
@@ -157,7 +157,9 @@ public object AsVariant
{
get
{
+#pragma warning disable CA1416 // Validate platform compatibility, cannot use any of guard methods
return Marshal.GetObjectForNativeVariant(UnsafeMethods.ConvertVariantByrefToPtr(ref this));
+#pragma warning restore CA1416
}
set
diff --git a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/PerformanceCounterLib.cs b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/PerformanceCounterLib.cs
index 08ff0741e0e1a..d23f4021885ab 100644
--- a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/PerformanceCounterLib.cs
+++ b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/PerformanceCounterLib.cs
@@ -94,6 +94,7 @@ private Dictionary GetStringTable(bool isHelp)
Dictionary stringTable;
RegistryKey libraryKey;
+ Debug.Assert(OperatingSystem.IsWindows());
libraryKey = Registry.PerformanceData;
try
@@ -208,6 +209,7 @@ internal PerformanceMonitor(string machineName)
[MemberNotNull(nameof(_perfDataKey))]
private void Init()
{
+ Debug.Assert(OperatingSystem.IsWindows());
if (ProcessManager.IsRemoteMachine(_machineName))
{
_perfDataKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.PerformanceData, _machineName);
@@ -236,6 +238,7 @@ private void Init()
byte[]? data = null;
int error = 0;
+ Debug.Assert(OperatingSystem.IsWindows());
while (waitRetries > 0)
{
try
diff --git a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Win32.cs b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Win32.cs
index 76419e195cee1..3bcd9de2a395e 100644
--- a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Win32.cs
+++ b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Win32.cs
@@ -28,6 +28,7 @@ private bool StartCore(ProcessStartInfo startInfo)
private unsafe bool StartWithShellExecuteEx(ProcessStartInfo startInfo)
{
+ Debug.Assert(OperatingSystem.IsWindows());
if (!string.IsNullOrEmpty(startInfo.UserName) || startInfo.Password != null)
throw new InvalidOperationException(SR.CantStartAsUser);
@@ -166,6 +167,7 @@ public bool ShellExecuteOnSTAThread()
{
ThreadStart threadStart = new ThreadStart(ShellExecuteFunction);
Thread executionThread = new Thread(threadStart) { IsBackground = true };
+ Debug.Assert(OperatingSystem.IsWindows());
executionThread.SetApartmentState(ApartmentState.STA);
executionThread.Start();
executionThread.Join();
diff --git a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Windows.cs b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Windows.cs
index 44323f9ef7111..aebedb99a7a35 100644
--- a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Windows.cs
+++ b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Windows.cs
@@ -541,6 +541,7 @@ private unsafe bool StartWithCreateProcess(ProcessStartInfo startInfo)
if (startInfo.UserName.Length != 0)
{
+ Debug.Assert(OperatingSystem.IsWindows());
if (startInfo.Password != null && startInfo.PasswordInClearText != null)
{
throw new ArgumentException(SR.CantSetDuplicatePassword);
diff --git a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/ProcessStartInfo.Win32.cs b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/ProcessStartInfo.Win32.cs
index 6b3503675d0be..e68762ef950ab 100644
--- a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/ProcessStartInfo.Win32.cs
+++ b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/ProcessStartInfo.Win32.cs
@@ -17,6 +17,7 @@ public string[] Verbs
if (string.IsNullOrEmpty(extension))
return Array.Empty();
+ Debug.Assert(OperatingSystem.IsWindows());
using (RegistryKey? key = Registry.ClassesRoot.OpenSubKey(extension))
{
if (key == null)
diff --git a/src/libraries/System.DirectoryServices.Protocols/ref/System.DirectoryServices.Protocols.cs b/src/libraries/System.DirectoryServices.Protocols/ref/System.DirectoryServices.Protocols.cs
index 8f6e8b6270f59..5521b3d8cb45e 100644
--- a/src/libraries/System.DirectoryServices.Protocols/ref/System.DirectoryServices.Protocols.cs
+++ b/src/libraries/System.DirectoryServices.Protocols/ref/System.DirectoryServices.Protocols.cs
@@ -469,7 +469,9 @@ public partial class PermissiveModifyControl : System.DirectoryServices.Protocol
public partial class QuotaControl : System.DirectoryServices.Protocols.DirectoryControl
{
public QuotaControl() : base (default(string), default(byte[]), default(bool), default(bool)) { }
+ [System.Runtime.Versioning.SupportedOSPlatformAttribute("windows")]
public QuotaControl(System.Security.Principal.SecurityIdentifier querySid) : base (default(string), default(byte[]), default(bool), default(bool)) { }
+ [System.Runtime.Versioning.SupportedOSPlatformAttribute("windows")]
public System.Security.Principal.SecurityIdentifier QuerySid { get { throw null; } set { } }
public override byte[] GetValue() { throw null; }
}
diff --git a/src/libraries/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/common/DirectoryControl.cs b/src/libraries/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/common/DirectoryControl.cs
index 4341ca2c60d46..9e3bd91f6506c 100644
--- a/src/libraries/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/common/DirectoryControl.cs
+++ b/src/libraries/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/common/DirectoryControl.cs
@@ -7,6 +7,7 @@
using System.Text;
using System.Runtime.InteropServices;
using System.Security.Principal;
+using System.Runtime.Versioning;
namespace System.DirectoryServices.Protocols
{
@@ -1026,11 +1027,13 @@ public class QuotaControl : DirectoryControl
public QuotaControl() : base("1.2.840.113556.1.4.1852", null, true, true) { }
+ [SupportedOSPlatform("windows")]
public QuotaControl(SecurityIdentifier querySid) : this()
{
QuerySid = querySid;
}
+ [SupportedOSPlatform("windows")]
public SecurityIdentifier QuerySid
{
get => _sid == null ? null : new SecurityIdentifier(_sid, 0);
diff --git a/src/libraries/System.IO.FileSystem.Watcher/src/System/IO/FileSystemWatcher.Win32.cs b/src/libraries/System.IO.FileSystem.Watcher/src/System/IO/FileSystemWatcher.Win32.cs
index 96d601de841b8..b1bed69783bb0 100644
--- a/src/libraries/System.IO.FileSystem.Watcher/src/System/IO/FileSystemWatcher.Win32.cs
+++ b/src/libraries/System.IO.FileSystem.Watcher/src/System/IO/FileSystemWatcher.Win32.cs
@@ -51,6 +51,7 @@ private void StartRaisingEvents()
int session = Interlocked.Increment(ref _currentSession);
byte[] buffer = AllocateBuffer();
+ Debug.Assert(OperatingSystem.IsWindows());
// Store all state, including a preallocated overlapped, into the state object that'll be
// passed from iteration to iteration during the lifetime of the operation. The buffer will be pinned
// from now until the end of the operation.
@@ -59,6 +60,7 @@ private void StartRaisingEvents()
{
state.PreAllocatedOverlapped = new PreAllocatedOverlapped((errorCode, numBytes, overlappedPointer) =>
{
+ Debug.Assert(OperatingSystem.IsWindows());
AsyncReadState state = (AsyncReadState)ThreadPoolBoundHandle.GetNativeOverlappedState(overlappedPointer)!;
state.ThreadPoolBinding.FreeNativeOverlapped(overlappedPointer);
if (state.WeakWatcher.TryGetTarget(out FileSystemWatcher? watcher))
@@ -153,6 +155,7 @@ private unsafe void Monitor(AsyncReadState state)
if (!_enabled || IsHandleInvalid(state.DirectoryHandle))
return;
+ Debug.Assert(OperatingSystem.IsWindows());
// Get the overlapped pointer to use for this iteration.
overlappedPointer = state.ThreadPoolBinding.AllocateNativeOverlapped(state.PreAllocatedOverlapped);
continueExecuting = Interop.Kernel32.ReadDirectoryChangesW(
diff --git a/src/libraries/System.IO.IsolatedStorage/src/System/IO/IsolatedStorage/Helper.Win32.cs b/src/libraries/System.IO.IsolatedStorage/src/System/IO/IsolatedStorage/Helper.Win32.cs
index 3a51074260637..959a38b4c68bc 100644
--- a/src/libraries/System.IO.IsolatedStorage/src/System/IO/IsolatedStorage/Helper.Win32.cs
+++ b/src/libraries/System.IO.IsolatedStorage/src/System/IO/IsolatedStorage/Helper.Win32.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics;
using System.Security.AccessControl;
using System.Security.Principal;
@@ -35,6 +36,7 @@ internal static void CreateDirectory(string path, IsolatedStorageScope scope)
// (But applies CREATOR OWNER as expected for items and subdirectories.) Setting up front when creating the directory
// doesn't exhibit this behavior, but as we can't currently do that we'll take the rough equivalent for now.
+ Debug.Assert(OperatingSystem.IsWindows());
DirectorySecurity security = new DirectorySecurity();
// Don't inherit the existing rules
diff --git a/src/libraries/System.IO.Pipes.AccessControl/ref/System.IO.Pipes.AccessControl.cs b/src/libraries/System.IO.Pipes.AccessControl/ref/System.IO.Pipes.AccessControl.cs
index 38f133af27ccc..4f65b4fada484 100644
--- a/src/libraries/System.IO.Pipes.AccessControl/ref/System.IO.Pipes.AccessControl.cs
+++ b/src/libraries/System.IO.Pipes.AccessControl/ref/System.IO.Pipes.AccessControl.cs
@@ -27,23 +27,27 @@ public enum PipeAccessRights
FullControl = 2032031,
AccessSystemSecurity = 16777216,
}
+ [System.Runtime.Versioning.SupportedOSPlatformAttribute("windows")]
public sealed partial class PipeAccessRule : System.Security.AccessControl.AccessRule
{
public PipeAccessRule(System.Security.Principal.IdentityReference identity, System.IO.Pipes.PipeAccessRights rights, System.Security.AccessControl.AccessControlType type) : base (default(System.Security.Principal.IdentityReference), default(int), default(bool), default(System.Security.AccessControl.InheritanceFlags), default(System.Security.AccessControl.PropagationFlags), default(System.Security.AccessControl.AccessControlType)) { }
public PipeAccessRule(string identity, System.IO.Pipes.PipeAccessRights rights, System.Security.AccessControl.AccessControlType type) : base (default(System.Security.Principal.IdentityReference), default(int), default(bool), default(System.Security.AccessControl.InheritanceFlags), default(System.Security.AccessControl.PropagationFlags), default(System.Security.AccessControl.AccessControlType)) { }
public System.IO.Pipes.PipeAccessRights PipeAccessRights { get { throw null; } }
}
+ [System.Runtime.Versioning.SupportedOSPlatformAttribute("windows")]
public sealed partial class PipeAuditRule : System.Security.AccessControl.AuditRule
{
public PipeAuditRule(System.Security.Principal.IdentityReference identity, System.IO.Pipes.PipeAccessRights rights, System.Security.AccessControl.AuditFlags flags) : base (default(System.Security.Principal.IdentityReference), default(int), default(bool), default(System.Security.AccessControl.InheritanceFlags), default(System.Security.AccessControl.PropagationFlags), default(System.Security.AccessControl.AuditFlags)) { }
public PipeAuditRule(string identity, System.IO.Pipes.PipeAccessRights rights, System.Security.AccessControl.AuditFlags flags) : base (default(System.Security.Principal.IdentityReference), default(int), default(bool), default(System.Security.AccessControl.InheritanceFlags), default(System.Security.AccessControl.PropagationFlags), default(System.Security.AccessControl.AuditFlags)) { }
public System.IO.Pipes.PipeAccessRights PipeAccessRights { get { throw null; } }
}
+ [System.Runtime.Versioning.SupportedOSPlatformAttribute("windows")]
public static partial class PipesAclExtensions
{
public static System.IO.Pipes.PipeSecurity GetAccessControl(this System.IO.Pipes.PipeStream stream) { throw null; }
public static void SetAccessControl(this System.IO.Pipes.PipeStream stream, System.IO.Pipes.PipeSecurity pipeSecurity) { }
}
+ [System.Runtime.Versioning.SupportedOSPlatformAttribute("windows")]
public partial class PipeSecurity : System.Security.AccessControl.NativeObjectSecurity
{
public PipeSecurity() : base (default(bool), default(System.Security.AccessControl.ResourceType)) { }
diff --git a/src/libraries/System.IO.Pipes/src/System/IO/Pipes/ConnectionCompletionSource.cs b/src/libraries/System.IO.Pipes/src/System/IO/Pipes/ConnectionCompletionSource.cs
index 96d94e0ab5367..5d5d5b9ea87ee 100644
--- a/src/libraries/System.IO.Pipes/src/System/IO/Pipes/ConnectionCompletionSource.cs
+++ b/src/libraries/System.IO.Pipes/src/System/IO/Pipes/ConnectionCompletionSource.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Runtime.ExceptionServices;
+using System.Runtime.Versioning;
using System.Threading;
namespace System.IO.Pipes
diff --git a/src/libraries/System.IO.Pipes/src/System/IO/Pipes/NamedPipeClientStream.Windows.cs b/src/libraries/System.IO.Pipes/src/System/IO/Pipes/NamedPipeClientStream.Windows.cs
index a082a3da86397..4b8ecf7db24b9 100644
--- a/src/libraries/System.IO.Pipes/src/System/IO/Pipes/NamedPipeClientStream.Windows.cs
+++ b/src/libraries/System.IO.Pipes/src/System/IO/Pipes/NamedPipeClientStream.Windows.cs
@@ -7,6 +7,7 @@
using System.Threading;
using Microsoft.Win32.SafeHandles;
using System.Runtime.Versioning;
+using System.Diagnostics;
namespace System.IO.Pipes
{
@@ -135,6 +136,7 @@ private void ValidateRemotePipeUser()
if (!IsCurrentUserOnly)
return;
+ Debug.Assert(OperatingSystem.IsWindows());
PipeSecurity accessControl = this.GetAccessControl();
IdentityReference? remoteOwnerSid = accessControl.GetOwner(typeof(SecurityIdentifier));
using (WindowsIdentity currentIdentity = WindowsIdentity.GetCurrent())
diff --git a/src/libraries/System.IO.Pipes/src/System/IO/Pipes/NamedPipeServerStream.Windows.cs b/src/libraries/System.IO.Pipes/src/System/IO/Pipes/NamedPipeServerStream.Windows.cs
index 8168691c9a93f..b93118faeb111 100644
--- a/src/libraries/System.IO.Pipes/src/System/IO/Pipes/NamedPipeServerStream.Windows.cs
+++ b/src/libraries/System.IO.Pipes/src/System/IO/Pipes/NamedPipeServerStream.Windows.cs
@@ -72,6 +72,7 @@ private void Create(string pipeName, PipeDirection direction, int maxNumberOfSer
if (IsCurrentUserOnly)
{
Debug.Assert(pipeSecurity == null);
+ Debug.Assert(OperatingSystem.IsWindows());
using (WindowsIdentity currentIdentity = WindowsIdentity.GetCurrent())
{
diff --git a/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeAccessRule.cs b/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeAccessRule.cs
index 35d1b9702419d..c43045a8b9e18 100644
--- a/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeAccessRule.cs
+++ b/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeAccessRule.cs
@@ -1,11 +1,13 @@
// 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.Versioning;
using System.Security.AccessControl;
using System.Security.Principal;
namespace System.IO.Pipes
{
+ [SupportedOSPlatform("windows")]
public sealed class PipeAccessRule : AccessRule
{
//
diff --git a/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeAuditRule.cs b/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeAuditRule.cs
index ad8dc528f9f1b..63ad8432fb3a6 100644
--- a/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeAuditRule.cs
+++ b/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeAuditRule.cs
@@ -1,11 +1,13 @@
// 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.Versioning;
using System.Security.AccessControl;
using System.Security.Principal;
namespace System.IO.Pipes
{
+ [SupportedOSPlatform("windows")]
public sealed class PipeAuditRule : AuditRule
{
public PipeAuditRule(
diff --git a/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeCompletionSource.cs b/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeCompletionSource.cs
index 118463c35d0f7..3967ff37616b2 100644
--- a/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeCompletionSource.cs
+++ b/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeCompletionSource.cs
@@ -4,6 +4,7 @@
using System.Buffers;
using System.Diagnostics;
using System.Runtime.InteropServices;
+using System.Runtime.Versioning;
using System.Security;
using System.Threading;
using System.Threading.Tasks;
@@ -40,8 +41,10 @@ protected PipeCompletionSource(ThreadPoolBoundHandle handle, ReadOnlyMemory
{
+ Debug.Assert(OperatingSystem.IsWindows());
var completionSource = (PipeCompletionSource)ThreadPoolBoundHandle.GetNativeOverlappedState(pOverlapped)!;
Debug.Assert(completionSource.Overlapped == pOverlapped);
@@ -98,6 +101,7 @@ internal void ReleaseResources()
// (this is why we disposed the registration above)
if (_overlapped != null)
{
+ Debug.Assert(OperatingSystem.IsWindows());
_threadPoolBinding.FreeNativeOverlapped(Overlapped);
_overlapped = null;
}
@@ -138,6 +142,7 @@ protected virtual void AsyncCallback(uint errorCode, uint numBytes)
private void Cancel()
{
+ Debug.Assert(OperatingSystem.IsWindows());
SafeHandle handle = _threadPoolBinding.Handle;
NativeOverlapped* overlapped = Overlapped;
diff --git a/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeSecurity.cs b/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeSecurity.cs
index c37f180e35df9..4f351b41f79e0 100644
--- a/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeSecurity.cs
+++ b/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeSecurity.cs
@@ -5,9 +5,11 @@
using System.Security.AccessControl;
using System.Security.Principal;
using System.Runtime.InteropServices;
+using System.Runtime.Versioning;
namespace System.IO.Pipes
{
+ [SupportedOSPlatform("windows")]
public class PipeSecurity : NativeObjectSecurity
{
public PipeSecurity()
diff --git a/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeStream.Windows.cs b/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeStream.Windows.cs
index b221c9880b6cf..e2de17b78a3c4 100644
--- a/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeStream.Windows.cs
+++ b/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipeStream.Windows.cs
@@ -41,6 +41,7 @@ internal void ValidateHandleIsPipe(SafePipeHandle safePipeHandle)
/// The handle.
private void InitializeAsyncHandle(SafePipeHandle handle)
{
+ Debug.Assert(OperatingSystem.IsWindows());
// If the handle is of async type, bind the handle to the ThreadPool so that we can use
// the async operations (it's needed so that our native callbacks get called).
_threadPoolBinding = ThreadPoolBoundHandle.BindHandle(handle);
@@ -50,6 +51,7 @@ private void DisposeCore(bool disposing)
{
if (disposing)
{
+ Debug.Assert(OperatingSystem.IsWindows());
_threadPoolBinding?.Dispose();
}
}
@@ -113,6 +115,7 @@ private ValueTask ReadAsyncCore(Memory buffer, CancellationToken canc
unsafe
{
+ Debug.Assert(OperatingSystem.IsWindows());
// Clear the overlapped status bit for this special case. Failure to do so looks
// like we are freeing a pending overlapped.
completionSource.Overlapped->InternalLow = IntPtr.Zero;
@@ -212,6 +215,7 @@ public unsafe virtual PipeTransmissionMode TransmissionMode
}
if ((pipeFlags & Interop.Kernel32.PipeOptions.PIPE_TYPE_MESSAGE) != 0)
{
+ Debug.Assert(OperatingSystem.IsWindows());
return PipeTransmissionMode.Message;
}
else
@@ -407,6 +411,7 @@ internal static unsafe Interop.Kernel32.SECURITY_ATTRIBUTES GetSecAttrs(HandleIn
if (pipeSecurity != null)
{
+ Debug.Assert(OperatingSystem.IsWindows());
byte[] securityDescriptor = pipeSecurity.GetSecurityDescriptorBinaryForm();
pinningHandle = GCHandle.Alloc(securityDescriptor, GCHandleType.Pinned);
fixed (byte* pSecurityDescriptor = securityDescriptor)
@@ -433,6 +438,7 @@ private unsafe void UpdateReadMode()
if ((flags & Interop.Kernel32.PipeOptions.PIPE_READMODE_MESSAGE) != 0)
{
+ Debug.Assert(OperatingSystem.IsWindows());
_readMode = PipeTransmissionMode.Message;
}
else
diff --git a/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipesAclExtensions.cs b/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipesAclExtensions.cs
index 6ebcb91b31292..f31839385243c 100644
--- a/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipesAclExtensions.cs
+++ b/src/libraries/System.IO.Pipes/src/System/IO/Pipes/PipesAclExtensions.cs
@@ -2,10 +2,12 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.IO;
+using System.Runtime.Versioning;
using System.Security.AccessControl;
namespace System.IO.Pipes
{
+ [SupportedOSPlatform("windows")]
public static class PipesAclExtensions
{
public static PipeSecurity GetAccessControl(this PipeStream stream)
diff --git a/src/libraries/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/CurrentUserIdentityProvider.Windows.cs b/src/libraries/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/CurrentUserIdentityProvider.Windows.cs
index 9108be362d762..03739ae0e51d5 100644
--- a/src/libraries/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/CurrentUserIdentityProvider.Windows.cs
+++ b/src/libraries/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/CurrentUserIdentityProvider.Windows.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics;
using System.Security.Principal;
namespace System.Net.Http
@@ -9,6 +10,7 @@ internal static class CurrentUserIdentityProvider
{
public static string GetIdentity()
{
+ Debug.Assert(OperatingSystem.IsWindows());
using WindowsIdentity identity = WindowsIdentity.GetCurrent();
return identity.Name;
}
diff --git a/src/libraries/System.Net.HttpListener/src/System/Net/Windows/AsyncRequestContext.cs b/src/libraries/System.Net.HttpListener/src/System/Net/Windows/AsyncRequestContext.cs
index 8af3aa485366f..6e2350fc479b9 100644
--- a/src/libraries/System.Net.HttpListener/src/System/Net/Windows/AsyncRequestContext.cs
+++ b/src/libraries/System.Net.HttpListener/src/System/Net/Windows/AsyncRequestContext.cs
@@ -37,6 +37,7 @@ internal AsyncRequestContext(ThreadPoolBoundHandle boundHandle, ListenerAsyncRes
private Interop.HttpApi.HTTP_REQUEST* Allocate(ThreadPoolBoundHandle boundHandle, uint size)
{
+ Debug.Assert(OperatingSystem.IsWindows());
uint newSize = size != 0 ? size : RequestBuffer == IntPtr.Zero ? 4096 : Size;
if (_nativeOverlapped != null)
{
@@ -75,6 +76,7 @@ protected override void OnReleasePins()
NativeOverlapped* nativeOverlapped = _nativeOverlapped;
_nativeOverlapped = null;
+ Debug.Assert(OperatingSystem.IsWindows());
_boundHandle!.FreeNativeOverlapped(nativeOverlapped);
}
}
@@ -89,6 +91,7 @@ protected override void Dispose(bool disposing)
#if DEBUG
DebugRefCountReleaseNativeOverlapped();
#endif
+ Debug.Assert(OperatingSystem.IsWindows());
_boundHandle!.FreeNativeOverlapped(_nativeOverlapped);
}
}
diff --git a/src/libraries/System.Net.HttpListener/src/System/Net/Windows/HttpListener.Windows.cs b/src/libraries/System.Net.HttpListener/src/System/Net/Windows/HttpListener.Windows.cs
index 2d47b0ff70c40..d3153c453ba72 100644
--- a/src/libraries/System.Net.HttpListener/src/System/Net/Windows/HttpListener.Windows.cs
+++ b/src/libraries/System.Net.HttpListener/src/System/Net/Windows/HttpListener.Windows.cs
@@ -703,6 +703,7 @@ public HttpListenerContext EndGetContext(IAsyncResult asyncResult)
WindowsPrincipal? principal = disconnectResult?.AuthenticatedConnection;
if (principal != null)
{
+ Debug.Assert(OperatingSystem.IsWindows());
if (NetEventSource.Log.IsEnabled()) NetEventSource.Info(this, $"Principal: {principal} principal.Identity.Name: {principal.Identity.Name} creating request");
stoleBlob = true;
HttpListenerContext ntlmContext = new HttpListenerContext(session, memoryBlob);
@@ -967,6 +968,7 @@ public HttpListenerContext EndGetContext(IAsyncResult asyncResult)
$"HandleAuthentication creating new WindowsIdentity from user context: {userContext.DangerousGetHandle().ToString("x8")}");
}
+ Debug.Assert(OperatingSystem.IsWindows());
WindowsPrincipal windowsPrincipal = new WindowsPrincipal(
new WindowsIdentity(userContext.DangerousGetHandle(), context.ProtocolName));
@@ -1836,6 +1838,7 @@ internal unsafe DisconnectAsyncResult(HttpListenerSession session, ulong connect
_listenerSession = session;
_connectionId = connectionId;
+ Debug.Assert(OperatingSystem.IsWindows());
// we can call the Unsafe API here, we won't ever call user code
_nativeOverlapped = session.RequestQueueBoundHandle.AllocateNativeOverlapped(s_IOCallback, state: this, pinData: null);
if (NetEventSource.Log.IsEnabled()) NetEventSource.Info($"DisconnectAsyncResult: ThreadPoolBoundHandle.AllocateNativeOverlapped({session.RequestQueueBoundHandle}) -> {_nativeOverlapped->GetHashCode()}");
@@ -1874,6 +1877,7 @@ private static unsafe void IOCompleted(DisconnectAsyncResult asyncResult, uint e
{
if (NetEventSource.Log.IsEnabled()) NetEventSource.Info(null, "_connectionId:" + asyncResult._connectionId);
+ Debug.Assert(OperatingSystem.IsWindows());
asyncResult._listenerSession.RequestQueueBoundHandle.FreeNativeOverlapped(nativeOverlapped);
if (Interlocked.Exchange(ref asyncResult._ownershipState, 2) == 0)
{
@@ -1884,6 +1888,7 @@ private static unsafe void IOCompleted(DisconnectAsyncResult asyncResult, uint e
private static unsafe void WaitCallback(uint errorCode, uint numBytes, NativeOverlapped* nativeOverlapped)
{
if (NetEventSource.Log.IsEnabled()) NetEventSource.Info(null, $"errorCode: {errorCode}, numBytes: {numBytes}, nativeOverlapped: {((IntPtr)nativeOverlapped).ToString("x")}");
+ Debug.Assert(OperatingSystem.IsWindows());
// take the DisconnectAsyncResult object from the state
DisconnectAsyncResult asyncResult = (DisconnectAsyncResult)ThreadPoolBoundHandle.GetNativeOverlappedState(nativeOverlapped)!;
IOCompleted(asyncResult, errorCode, numBytes, nativeOverlapped);
@@ -1903,6 +1908,7 @@ private void HandleDisconnect()
// Clean up the identity. This is for scenarios where identity was not cleaned up before due to
// identity caching for unsafe ntlm authentication
+ Debug.Assert(OperatingSystem.IsWindows());
IDisposable? identity = _authenticatedConnection == null ? null : _authenticatedConnection.Identity as IDisposable;
if ((identity != null) &&
(_authenticatedConnection!.Identity.AuthenticationType == AuthenticationTypes.NTLM) &&
diff --git a/src/libraries/System.Net.HttpListener/src/System/Net/Windows/HttpListenerSession.Windows.cs b/src/libraries/System.Net.HttpListener/src/System/Net/Windows/HttpListenerSession.Windows.cs
index 777335be91a98..2fd0d36eb7793 100644
--- a/src/libraries/System.Net.HttpListener/src/System/Net/Windows/HttpListenerSession.Windows.cs
+++ b/src/libraries/System.Net.HttpListener/src/System/Net/Windows/HttpListenerSession.Windows.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
@@ -22,6 +23,7 @@ public ThreadPoolBoundHandle RequestQueueBoundHandle
{
if (_requestQueueBoundHandle == null)
{
+ Debug.Assert(OperatingSystem.IsWindows());
_requestQueueBoundHandle = ThreadPoolBoundHandle.BindHandle(RequestQueueHandle);
if (NetEventSource.Log.IsEnabled()) NetEventSource.Info($"ThreadPoolBoundHandle.BindHandle({RequestQueueHandle}) -> {_requestQueueBoundHandle}");
}
@@ -65,6 +67,7 @@ public unsafe void CloseRequestQueueHandle()
if (!RequestQueueHandle.IsInvalid)
{
if (NetEventSource.Log.IsEnabled()) NetEventSource.Info($"Dispose ThreadPoolBoundHandle: {_requestQueueBoundHandle}");
+ Debug.Assert(OperatingSystem.IsWindows());
_requestQueueBoundHandle?.Dispose();
RequestQueueHandle.Dispose();
diff --git a/src/libraries/System.Net.HttpListener/src/System/Net/Windows/HttpRequestStream.Windows.cs b/src/libraries/System.Net.HttpListener/src/System/Net/Windows/HttpRequestStream.Windows.cs
index 3eadb3cf7e5e4..4f85b42b286b1 100644
--- a/src/libraries/System.Net.HttpListener/src/System/Net/Windows/HttpRequestStream.Windows.cs
+++ b/src/libraries/System.Net.HttpListener/src/System/Net/Windows/HttpRequestStream.Windows.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics;
using System.IO;
using System.Runtime.ExceptionServices;
using System.Runtime.InteropServices;
@@ -295,6 +296,7 @@ internal HttpRequestStreamAsyncResult(ThreadPoolBoundHandle boundHandle, object
{
_dataAlreadyRead = dataAlreadyRead;
_boundHandle = boundHandle;
+ Debug.Assert(OperatingSystem.IsWindows());
_pOverlapped = boundHandle.AllocateNativeOverlapped(s_IOCallback, state: this, pinData: buffer);
_pPinnedBuffer = (void*)(Marshal.UnsafeAddrOfPinnedArrayElement(buffer, offset));
}
@@ -331,6 +333,7 @@ private static void IOCompleted(HttpRequestStreamAsyncResult asyncResult, uint e
private static unsafe void Callback(uint errorCode, uint numBytes, NativeOverlapped* nativeOverlapped)
{
+ Debug.Assert(OperatingSystem.IsWindows());
HttpRequestStreamAsyncResult asyncResult = (HttpRequestStreamAsyncResult)ThreadPoolBoundHandle.GetNativeOverlappedState(nativeOverlapped)!;
if (NetEventSource.Log.IsEnabled()) NetEventSource.Info(null, $"asyncResult: {asyncResult} errorCode:0x {errorCode.ToString("x8")} numBytes: {numBytes} nativeOverlapped:0x {((IntPtr)nativeOverlapped).ToString("x8")}");
@@ -344,6 +347,7 @@ protected override void Cleanup()
base.Cleanup();
if (_pOverlapped != null)
{
+ Debug.Assert(OperatingSystem.IsWindows());
_boundHandle!.FreeNativeOverlapped(_pOverlapped);
}
}
diff --git a/src/libraries/System.Net.HttpListener/src/System/Net/Windows/HttpResponseStreamAsyncResult.cs b/src/libraries/System.Net.HttpListener/src/System/Net/Windows/HttpResponseStreamAsyncResult.cs
index 5a41b0ddeed6a..416654849a992 100644
--- a/src/libraries/System.Net.HttpListener/src/System/Net/Windows/HttpResponseStreamAsyncResult.cs
+++ b/src/libraries/System.Net.HttpListener/src/System/Net/Windows/HttpResponseStreamAsyncResult.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
@@ -114,6 +115,7 @@ internal HttpResponseStreamAsyncResult(object asyncObject, object? userState, As
_boundHandle = boundHandle;
_sentHeaders = sentHeaders;
+ Debug.Assert(OperatingSystem.IsWindows());
if (size == 0)
{
_dataChunks = null;
@@ -219,6 +221,7 @@ private static void IOCompleted(HttpResponseStreamAsyncResult asyncResult, uint
private static unsafe void Callback(uint errorCode, uint numBytes, NativeOverlapped* nativeOverlapped)
{
+ Debug.Assert(OperatingSystem.IsWindows());
object state = ThreadPoolBoundHandle.GetNativeOverlappedState(nativeOverlapped)!;
HttpResponseStreamAsyncResult asyncResult = (state as HttpResponseStreamAsyncResult)!;
if (NetEventSource.Log.IsEnabled()) NetEventSource.Info(null, "errorCode:0x" + errorCode.ToString("x8") + " numBytes:" + numBytes + " nativeOverlapped:0x" + ((IntPtr)nativeOverlapped).ToString("x8"));
@@ -232,6 +235,7 @@ protected override void Cleanup()
base.Cleanup();
if (_pOverlapped != null)
{
+ Debug.Assert(OperatingSystem.IsWindows());
_boundHandle!.FreeNativeOverlapped(_pOverlapped);
}
}
diff --git a/src/libraries/System.Net.HttpListener/src/System/Net/Windows/ListenerAsyncResult.Windows.cs b/src/libraries/System.Net.HttpListener/src/System/Net/Windows/ListenerAsyncResult.Windows.cs
index b36252e9de822..1846f6518fed7 100644
--- a/src/libraries/System.Net.HttpListener/src/System/Net/Windows/ListenerAsyncResult.Windows.cs
+++ b/src/libraries/System.Net.HttpListener/src/System/Net/Windows/ListenerAsyncResult.Windows.cs
@@ -96,6 +96,7 @@ private static void IOCompleted(ListenerAsyncResult asyncResult, uint errorCode,
private static unsafe void WaitCallback(uint errorCode, uint numBytes, NativeOverlapped* nativeOverlapped)
{
+ Debug.Assert(OperatingSystem.IsWindows());
ListenerAsyncResult asyncResult = (ListenerAsyncResult)ThreadPoolBoundHandle.GetNativeOverlappedState(nativeOverlapped)!;
IOCompleted(asyncResult, errorCode, numBytes);
}
diff --git a/src/libraries/System.Net.HttpListener/src/System/Net/Windows/ListenerClientCertAsyncResult.Windows.cs b/src/libraries/System.Net.HttpListener/src/System/Net/Windows/ListenerClientCertAsyncResult.Windows.cs
index 50521139e7619..adce0b624a367 100644
--- a/src/libraries/System.Net.HttpListener/src/System/Net/Windows/ListenerClientCertAsyncResult.Windows.cs
+++ b/src/libraries/System.Net.HttpListener/src/System/Net/Windows/ListenerClientCertAsyncResult.Windows.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Cryptography;
@@ -49,6 +50,7 @@ internal void Reset(uint size)
{
return;
}
+ Debug.Assert(OperatingSystem.IsWindows());
if (_size != 0)
{
_boundHandle!.FreeNativeOverlapped(_pOverlapped);
@@ -162,6 +164,7 @@ private static unsafe void IOCompleted(ListenerClientCertAsyncResult asyncResult
private static unsafe void WaitCallback(uint errorCode, uint numBytes, NativeOverlapped* nativeOverlapped)
{
+ Debug.Assert(OperatingSystem.IsWindows());
ListenerClientCertAsyncResult asyncResult = (ListenerClientCertAsyncResult)ThreadPoolBoundHandle.GetNativeOverlappedState(nativeOverlapped)!;
if (NetEventSource.Log.IsEnabled()) NetEventSource.Info(null, $"errorCode:[{errorCode}] numBytes:[{numBytes}] nativeOverlapped:[{((long)nativeOverlapped)}]");
IOCompleted(asyncResult, errorCode, numBytes);
@@ -173,6 +176,7 @@ protected override void Cleanup()
if (_pOverlapped != null)
{
_memoryBlob = null;
+ Debug.Assert(OperatingSystem.IsWindows());
_boundHandle!.FreeNativeOverlapped(_pOverlapped);
_pOverlapped = null;
_boundHandle = null;
@@ -185,6 +189,7 @@ protected override void Cleanup()
{
if (_pOverlapped != null && !Environment.HasShutdownStarted)
{
+ Debug.Assert(OperatingSystem.IsWindows());
_boundHandle!.FreeNativeOverlapped(_pOverlapped);
_pOverlapped = null; // Must do this in case application calls GC.ReRegisterForFinalize().
_boundHandle = null;
diff --git a/src/libraries/System.Net.HttpListener/src/System/Net/Windows/WebSockets/WebSocketHttpListenerDuplexStream.cs b/src/libraries/System.Net.HttpListener/src/System/Net/Windows/WebSockets/WebSocketHttpListenerDuplexStream.cs
index 1a07f99cb8686..5bce6dd475cf9 100644
--- a/src/libraries/System.Net.HttpListener/src/System/Net/Windows/WebSockets/WebSocketHttpListenerDuplexStream.cs
+++ b/src/libraries/System.Net.HttpListener/src/System/Net/Windows/WebSockets/WebSocketHttpListenerDuplexStream.cs
@@ -908,6 +908,7 @@ private unsafe void InitializeOverlapped(ThreadPoolBoundHandle boundHandle)
DebugRefCountAllocNativeOverlapped();
#endif
_boundHandle = boundHandle;
+ Debug.Assert(OperatingSystem.IsWindows());
_ptrNativeOverlapped = boundHandle.AllocateNativeOverlapped(CompletionPortCallback, null, null);
}
@@ -922,6 +923,7 @@ private unsafe void FreeOverlapped(bool checkForShutdown)
#if DEBUG
DebugRefCountReleaseNativeOverlapped();
#endif
+ Debug.Assert(OperatingSystem.IsWindows());
_boundHandle!.FreeNativeOverlapped(_ptrNativeOverlapped);
_ptrNativeOverlapped = null;
}
diff --git a/src/libraries/System.Net.NetworkInformation/src/System/Net/NetworkInformation/NetworkAddressChange.Windows.cs b/src/libraries/System.Net.NetworkInformation/src/System/Net/NetworkInformation/NetworkAddressChange.Windows.cs
index 6f644daafe492..d13b7bab42e90 100644
--- a/src/libraries/System.Net.NetworkInformation/src/System/Net/NetworkInformation/NetworkAddressChange.Windows.cs
+++ b/src/libraries/System.Net.NetworkInformation/src/System/Net/NetworkInformation/NetworkAddressChange.Windows.cs
@@ -4,6 +4,7 @@
using Microsoft.Win32.SafeHandles;
using System.Collections.Generic;
+using System.Diagnostics;
using System.Net.Sockets;
using System.Threading;
@@ -229,6 +230,8 @@ private static void StartHelper(NetworkAddressChangedEventHandler? caller, bool
if (!s_isPending)
{
+ Debug.Assert(OperatingSystem.IsWindows());
+
if (Socket.OSSupportsIPv4 && (startIPOptions & StartIPOptions.StartIPv4) != 0)
{
ThreadPool.RegisterWaitForSingleObject(
diff --git a/src/libraries/System.Net.Security/src/System/Net/CertificateValidationPal.Windows.cs b/src/libraries/System.Net.Security/src/System/Net/CertificateValidationPal.Windows.cs
index 557b2e2e4e090..ca2846e33f37f 100644
--- a/src/libraries/System.Net.Security/src/System/Net/CertificateValidationPal.Windows.cs
+++ b/src/libraries/System.Net.Security/src/System/Net/CertificateValidationPal.Windows.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.Win32.SafeHandles;
+using System.Diagnostics;
using System.Net.Security;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
@@ -175,6 +176,7 @@ internal static X509Store OpenStore(StoreLocation storeLocation)
// For app-compat We want to ensure the store is opened under the **process** account.
try
{
+ Debug.Assert(OperatingSystem.IsWindows());
WindowsIdentity.RunImpersonated(SafeAccessTokenHandle.InvalidHandle, () =>
{
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
diff --git a/src/libraries/System.Net.Security/src/System/Net/Security/NegotiateStreamPal.Windows.cs b/src/libraries/System.Net.Security/src/System/Net/Security/NegotiateStreamPal.Windows.cs
index e21530a82c854..85276a42cf08b 100644
--- a/src/libraries/System.Net.Security/src/System/Net/Security/NegotiateStreamPal.Windows.cs
+++ b/src/libraries/System.Net.Security/src/System/Net/Security/NegotiateStreamPal.Windows.cs
@@ -48,6 +48,7 @@ internal static IIdentity GetIdentity(NTAuthentication context)
}
string authtype = context.ProtocolName;
+ Debug.Assert(OperatingSystem.IsWindows());
// The following call was also specifying WindowsAccountType.Normal, true.
// WindowsIdentity.IsAuthenticated is no longer supported in .NET Core
result = new WindowsIdentity(token.DangerousGetHandle(), authtype);
diff --git a/src/libraries/System.Net.Security/src/System/Net/Security/SslStreamPal.Windows.cs b/src/libraries/System.Net.Security/src/System/Net/Security/SslStreamPal.Windows.cs
index 4c3c2c22db42e..ba419ac7f1b9c 100644
--- a/src/libraries/System.Net.Security/src/System/Net/Security/SslStreamPal.Windows.cs
+++ b/src/libraries/System.Net.Security/src/System/Net/Security/SslStreamPal.Windows.cs
@@ -506,6 +506,7 @@ private static unsafe SafeFreeCredentials AcquireCredentialsHandle(Interop.SspiC
//
// For app-compat we want to ensure the credential are accessed under >>process<< account.
//
+ Debug.Assert(OperatingSystem.IsWindows());
return WindowsIdentity.RunImpersonated(SafeAccessTokenHandle.InvalidHandle, () =>
{
return SSPIWrapper.AcquireCredentialsHandle(GlobalSSPI.SSPISecureChannel, SecurityPackage, credUsage, secureCredential);
@@ -526,6 +527,7 @@ private static unsafe SafeFreeCredentials AcquireCredentialsHandle(Interop.SspiC
//
// For app-compat we want to ensure the credential are accessed under >>process<< account.
//
+ Debug.Assert(OperatingSystem.IsWindows());
return WindowsIdentity.RunImpersonated(SafeAccessTokenHandle.InvalidHandle, () =>
{
return SSPIWrapper.AcquireCredentialsHandle(GlobalSSPI.SSPISecureChannel, SecurityPackage, credUsage, secureCredential);
diff --git a/src/libraries/System.Runtime.InteropServices/ref/System.Runtime.InteropServices.cs b/src/libraries/System.Runtime.InteropServices/ref/System.Runtime.InteropServices.cs
index 6112112d59bc6..26aa79b2c0c6e 100644
--- a/src/libraries/System.Runtime.InteropServices/ref/System.Runtime.InteropServices.cs
+++ b/src/libraries/System.Runtime.InteropServices/ref/System.Runtime.InteropServices.cs
@@ -80,6 +80,7 @@ namespace System.Runtime.CompilerServices
public sealed partial class IDispatchConstantAttribute : System.Runtime.CompilerServices.CustomConstantAttribute
{
public IDispatchConstantAttribute() { }
+ [System.Runtime.Versioning.SupportedOSPlatformAttribute("windows")]
public override object Value { get { throw null; } }
}
[System.AttributeUsageAttribute(System.AttributeTargets.Field | System.AttributeTargets.Parameter, Inherited=false)]
diff --git a/src/libraries/System.Runtime.InteropServices/src/System/Runtime/CompilerServices/IDispatchConstantAttribute.cs b/src/libraries/System.Runtime.InteropServices/src/System/Runtime/CompilerServices/IDispatchConstantAttribute.cs
index 3a3b8329e4c58..841c036f08dfd 100644
--- a/src/libraries/System.Runtime.InteropServices/src/System/Runtime/CompilerServices/IDispatchConstantAttribute.cs
+++ b/src/libraries/System.Runtime.InteropServices/src/System/Runtime/CompilerServices/IDispatchConstantAttribute.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Runtime.InteropServices;
+using System.Runtime.Versioning;
namespace System.Runtime.CompilerServices
{
@@ -10,6 +11,7 @@ public sealed partial class IDispatchConstantAttribute : CustomConstantAttribute
{
public IDispatchConstantAttribute() { }
+ [SupportedOSPlatform("windows")]
public override object Value => new DispatchWrapper(null);
}
}
diff --git a/src/libraries/System.Security.Cryptography.Csp/src/Internal/Cryptography/BasicSymmetricCipherCsp.cs b/src/libraries/System.Security.Cryptography.Csp/src/Internal/Cryptography/BasicSymmetricCipherCsp.cs
index 892df2169b88c..42412abc88ba3 100644
--- a/src/libraries/System.Security.Cryptography.Csp/src/Internal/Cryptography/BasicSymmetricCipherCsp.cs
+++ b/src/libraries/System.Security.Cryptography.Csp/src/Internal/Cryptography/BasicSymmetricCipherCsp.cs
@@ -122,6 +122,7 @@ private static SafeKeyHandle ImportCspBlob(SafeProvHandle safeProvHandle, int al
private static SafeProvHandle AcquireSafeProviderHandle()
{
SafeProvHandle safeProvHandle;
+ Debug.Assert(OperatingSystem.IsWindows());
var cspParams = new CspParameters((int)ProviderType.PROV_RSA_FULL);
CapiHelper.AcquireCsp(cspParams, out safeProvHandle);
return safeProvHandle;
diff --git a/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/CapiHelper.Windows.cs b/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/CapiHelper.Windows.cs
index 47d67ae2ae6b0..d2217d03a0436 100644
--- a/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/CapiHelper.Windows.cs
+++ b/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/CapiHelper.Windows.cs
@@ -176,6 +176,7 @@ private static int AcquireCryptContext(out SafeProvHandle safeProvHandle, string
internal static void AcquireCsp(CspParameters cspParameters, out SafeProvHandle safeProvHandle)
{
Debug.Assert(cspParameters != null);
+ Debug.Assert(OperatingSystem.IsWindows());
Debug.Assert(cspParameters.KeyContainerName == null);
SafeProvHandle hProv;
@@ -205,6 +206,7 @@ public static int OpenCSP(CspParameters cspParameters, uint flags, out SafeProvH
throw new ArgumentException(SR.Format(SR.CspParameter_invalid, nameof(cspParameters)));
}
+ Debug.Assert(OperatingSystem.IsWindows());
//look for provider type in the cspParameters
int providerType = cspParameters.ProviderType;
@@ -274,6 +276,7 @@ internal static SafeProvHandle CreateProvHandle(CspParameters parameters, bool r
SafeProvHandle safeProvHandle;
uint flag = 0;
uint hr = unchecked((uint)OpenCSP(parameters, flag, out safeProvHandle));
+ Debug.Assert(OperatingSystem.IsWindows());
//Open container failed
if (hr != S_OK)
{
@@ -664,6 +667,7 @@ internal static CspParameters SaveCspParameters(
out bool randomKeyContainer)
{
CspParameters parameters;
+ Debug.Assert(OperatingSystem.IsWindows());
if (userParameters == null)
{
parameters = new CspParameters(keyType == CspAlgorithmType.Dss ?
@@ -732,6 +736,7 @@ internal static SafeKeyHandle GetKeyPairHelper(
{
// If the key already exists, use it, else generate a new one
SafeKeyHandle hKey;
+ Debug.Assert(OperatingSystem.IsWindows());
int hr = CapiHelper.GetUserKey(safeProvHandle, parameters.KeyNumber, out hKey);
if (hr != S_OK)
{
diff --git a/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/DSACryptoServiceProvider.Windows.cs b/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/DSACryptoServiceProvider.Windows.cs
index 186f9c80100c5..a4c9ab3652a95 100644
--- a/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/DSACryptoServiceProvider.Windows.cs
+++ b/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/DSACryptoServiceProvider.Windows.cs
@@ -24,11 +24,13 @@ public sealed class DSACryptoServiceProvider : DSA, ICspAsymmetricAlgorithm
/// Initializes a new instance of the DSACryptoServiceProvider class.
///
public DSACryptoServiceProvider()
+#pragma warning disable CA1416 // Validate platform compatibility
: this(
new CspParameters(CapiHelper.DefaultDssProviderType,
null,
null,
s_useMachineKeyStore))
+#pragma warning restore CA1416 //
{
}
@@ -37,11 +39,13 @@ public DSACryptoServiceProvider()
///
/// The size of the key for the asymmetric algorithm in bits.
public DSACryptoServiceProvider(int dwKeySize)
+#pragma warning disable CA1416 // Validate platform compatibility
: this(dwKeySize,
new CspParameters(CapiHelper.DefaultDssProviderType,
null,
null,
s_useMachineKeyStore))
+#pragma warning restore CA1416 // Validate platform compatibility
{
}
@@ -324,6 +328,7 @@ public override DSAParameters ExportParameters(bool includePrivateParameters)
private SafeProvHandle AcquireSafeProviderHandle()
{
SafeProvHandle safeProvHandle;
+ Debug.Assert(OperatingSystem.IsWindows());
CapiHelper.AcquireCsp(new CspParameters(CapiHelper.DefaultDssProviderType), out safeProvHandle);
return safeProvHandle;
}
@@ -348,6 +353,7 @@ public void ImportCspBlob(byte[] keyBlob)
}
else
{
+ Debug.Assert(OperatingSystem.IsWindows());
CapiHelper.ImportKeyBlob(SafeProvHandle, _parameters.Flags, false, keyBlob, out safeKeyHandle);
}
@@ -489,6 +495,7 @@ public byte[] SignHash(byte[] rgbHash, string? str)
if (rgbHash.Length != _sha1.HashSize / 8)
throw new CryptographicException(SR.Format(SR.Cryptography_InvalidHashSize, "SHA1", _sha1.HashSize / 8));
+ Debug.Assert(OperatingSystem.IsWindows());
return CapiHelper.SignValue(
SafeProvHandle,
SafeKeyHandle,
diff --git a/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/PasswordDeriveBytes.Windows.cs b/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/PasswordDeriveBytes.Windows.cs
index c516653016400..c82c47b2b4775 100644
--- a/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/PasswordDeriveBytes.Windows.cs
+++ b/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/PasswordDeriveBytes.Windows.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using Internal.NativeCrypto;
+using System.Diagnostics;
using System.Runtime.Versioning;
#pragma warning disable CA5373 // Call to obsolete key derivation function PasswordDeriveBytes.*
@@ -58,6 +59,7 @@ private static SafeProvHandle AcquireSafeProviderHandle(CspParameters? cspParams
{
if (cspParams == null)
{
+ Debug.Assert(OperatingSystem.IsWindows());
cspParams = new CspParameters(CapiHelper.DefaultRsaProviderType);
}
diff --git a/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/PasswordDeriveBytes.cs b/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/PasswordDeriveBytes.cs
index 4b5e73dc340eb..d5ef0012ec141 100644
--- a/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/PasswordDeriveBytes.cs
+++ b/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/PasswordDeriveBytes.cs
@@ -25,6 +25,7 @@ public partial class PasswordDeriveBytes : DeriveBytes
private HashAlgorithm? _hash;
private readonly CspParameters? _cspParams;
+#pragma warning disable CA1416 // Validate platform compatibility, CspParametersis windows only, this is feels wrong suppressing for now
public PasswordDeriveBytes(string strPassword, byte[]? rgbSalt) : this(strPassword, rgbSalt, new CspParameters()) { }
public PasswordDeriveBytes(byte[] password, byte[]? salt) : this(password, salt, new CspParameters()) { }
@@ -34,6 +35,7 @@ public PasswordDeriveBytes(string strPassword, byte[]? rgbSalt, string strHashNa
public PasswordDeriveBytes(byte[] password, byte[]? salt, string hashName, int iterations) :
this(password, salt, hashName, iterations, new CspParameters()) { }
+#pragma warning restore CA1416
public PasswordDeriveBytes(string strPassword, byte[]? rgbSalt, CspParameters? cspParams) :
this(strPassword, rgbSalt, "SHA1", 100, cspParams) { }
diff --git a/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/RSACryptoServiceProvider.Windows.cs b/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/RSACryptoServiceProvider.Windows.cs
index 6843a3aa30fca..4a967e9d496a8 100644
--- a/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/RSACryptoServiceProvider.Windows.cs
+++ b/src/libraries/System.Security.Cryptography.Csp/src/System/Security/Cryptography/RSACryptoServiceProvider.Windows.cs
@@ -22,6 +22,7 @@ public sealed partial class RSACryptoServiceProvider : RSA, ICspAsymmetricAlgori
private static volatile CspProviderFlags s_useMachineKeyStore;
private bool _disposed;
+#pragma warning disable CA1416 // Validate platform compatibility
public RSACryptoServiceProvider()
: this(0, new CspParameters(CapiHelper.DefaultRsaProviderType,
null,
@@ -39,6 +40,7 @@ public RSACryptoServiceProvider(int dwKeySize)
s_useMachineKeyStore), false)
{
}
+#pragma warning restore CA1416
[SupportedOSPlatform("windows")]
public RSACryptoServiceProvider(int dwKeySize, CspParameters? parameters)
@@ -374,6 +376,7 @@ public override RSAParameters ExportParameters(bool includePrivateParameters)
private SafeProvHandle AcquireSafeProviderHandle()
{
SafeProvHandle safeProvHandle;
+ Debug.Assert(OperatingSystem.IsWindows());
CapiHelper.AcquireCsp(new CspParameters(CapiHelper.DefaultRsaProviderType), out safeProvHandle);
return safeProvHandle;
}
@@ -397,6 +400,7 @@ public void ImportCspBlob(byte[] keyBlob)
}
else
{
+ Debug.Assert(OperatingSystem.IsWindows());
CapiHelper.ImportKeyBlob(SafeProvHandle, _parameters.Flags, false, keyBlob, out safeKeyHandle);
}
@@ -507,6 +511,7 @@ public byte[] SignHash(byte[] rgbHash, string? str)
private byte[] SignHash(byte[] rgbHash, int calgHash)
{
Debug.Assert(rgbHash != null);
+ Debug.Assert(OperatingSystem.IsWindows());
return CapiHelper.SignValue(
SafeProvHandle,
@@ -714,6 +719,7 @@ public override string? KeyExchangeAlgorithm
{
get
{
+ Debug.Assert(OperatingSystem.IsWindows());
if (_parameters.KeyNumber == (int)Interop.Advapi32.KeySpec.AT_KEYEXCHANGE)
{
return "RSA-PKCS1-KeyEx";
diff --git a/src/libraries/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Windows/CertificatePal.PrivateKey.cs b/src/libraries/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Windows/CertificatePal.PrivateKey.cs
index 16ab88ef29e7e..219579f3ce109 100644
--- a/src/libraries/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Windows/CertificatePal.PrivateKey.cs
+++ b/src/libraries/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Windows/CertificatePal.PrivateKey.cs
@@ -28,10 +28,12 @@ public bool HasPrivateKey
return GetPrivateKey(
delegate (CspParameters csp)
{
+ Debug.Assert(OperatingSystem.IsWindows());
return new RSACryptoServiceProvider(csp);
},
delegate (CngKey cngKey)
{
+ Debug.Assert(OperatingSystem.IsWindows());
return new RSACng(cngKey);
}
);
@@ -42,10 +44,12 @@ public bool HasPrivateKey
return GetPrivateKey(
delegate (CspParameters csp)
{
+ Debug.Assert(OperatingSystem.IsWindows());
return new DSACryptoServiceProvider(csp);
},
delegate (CngKey cngKey)
{
+ Debug.Assert(OperatingSystem.IsWindows());
return new DSACng(cngKey);
}
);
@@ -60,6 +64,7 @@ public bool HasPrivateKey
},
delegate (CngKey cngKey)
{
+ Debug.Assert(OperatingSystem.IsWindows());
return new ECDsaCng(cngKey);
}
);
@@ -69,7 +74,9 @@ public bool HasPrivateKey
{
return GetPrivateKey(
csp => throw new NotSupportedException(SR.NotSupported_ECDiffieHellman_Csp),
+#pragma warning disable CA1416 // Validate platform compatibility
cngKey => new ECDiffieHellmanCng(cngKey)
+#pragma warning restore CA1416 // Validate platform compatibility
);
}
@@ -78,6 +85,7 @@ public ICertificatePal CopyWithPrivateKey(DSA dsa)
DSACng? dsaCng = dsa as DSACng;
ICertificatePal? clone = null;
+ Debug.Assert(OperatingSystem.IsWindows());
if (dsaCng != null)
{
clone = CopyWithPersistedCngKey(dsaCng.Key);
@@ -115,6 +123,7 @@ public ICertificatePal CopyWithPrivateKey(ECDsa ecdsa)
{
ECDsaCng? ecdsaCng = ecdsa as ECDsaCng;
+ Debug.Assert(OperatingSystem.IsWindows());
if (ecdsaCng != null)
{
ICertificatePal? clone = CopyWithPersistedCngKey(ecdsaCng.Key);
@@ -140,6 +149,7 @@ public ICertificatePal CopyWithPrivateKey(ECDiffieHellman ecdh)
{
ECDiffieHellmanCng? ecdhCng = ecdh as ECDiffieHellmanCng;
+ Debug.Assert(OperatingSystem.IsWindows());
if (ecdhCng != null)
{
ICertificatePal? clone = CopyWithPersistedCngKey(ecdhCng.Key);
@@ -166,6 +176,7 @@ public ICertificatePal CopyWithPrivateKey(RSA rsa)
RSACng? rsaCng = rsa as RSACng;
ICertificatePal? clone = null;
+ Debug.Assert(OperatingSystem.IsWindows());
if (rsaCng != null)
{
clone = CopyWithPersistedCngKey(rsaCng.Key);
@@ -208,6 +219,7 @@ public ICertificatePal CopyWithPrivateKey(RSA rsa)
{
CngKeyHandleOpenOptions cngHandleOptions;
SafeNCryptKeyHandle? ncryptKey = TryAcquireCngPrivateKey(CertContext, out cngHandleOptions);
+ Debug.Assert(OperatingSystem.IsWindows());
if (ncryptKey != null)
{
CngKey cngKey = CngKey.Open(ncryptKey, cngHandleOptions);
@@ -244,6 +256,7 @@ public ICertificatePal CopyWithPrivateKey(RSA rsa)
Debug.Assert(certificateContext != null, "certificateContext != null");
Debug.Assert(!certificateContext.IsClosed && !certificateContext.IsInvalid,
"!certificateContext.IsClosed && !certificateContext.IsInvalid");
+ Debug.Assert(OperatingSystem.IsWindows());
IntPtr privateKeyPtr;
@@ -345,6 +358,7 @@ public ICertificatePal CopyWithPrivateKey(RSA rsa)
throw Marshal.GetLastWin32Error().ToCryptographicException();
CRYPT_KEY_PROV_INFO* pKeyProvInfo = (CRYPT_KEY_PROV_INFO*)pPrivateKey;
+ Debug.Assert(OperatingSystem.IsWindows());
CspParameters cspParameters = new CspParameters();
cspParameters.ProviderName = Marshal.PtrToStringUni((IntPtr)(pKeyProvInfo->pwszProvName));
cspParameters.KeyContainerName = Marshal.PtrToStringUni((IntPtr)(pKeyProvInfo->pwszContainerName));
@@ -358,6 +372,7 @@ public ICertificatePal CopyWithPrivateKey(RSA rsa)
private unsafe ICertificatePal? CopyWithPersistedCngKey(CngKey cngKey)
{
+ Debug.Assert(OperatingSystem.IsWindows());
if (string.IsNullOrEmpty(cngKey.KeyName))
{
return null;
@@ -404,6 +419,7 @@ private static int GuessKeySpec(
bool machineKey,
CngAlgorithmGroup? algorithmGroup)
{
+ Debug.Assert(OperatingSystem.IsWindows());
if (provider == CngProvider.MicrosoftSoftwareKeyStorageProvider ||
provider == CngProvider.MicrosoftSmartCardKeyStorageProvider)
{
@@ -457,6 +473,7 @@ private static bool TryGuessKeySpec(
CngAlgorithmGroup? algorithmGroup,
out int keySpec)
{
+ Debug.Assert(OperatingSystem.IsWindows());
if (algorithmGroup == CngAlgorithmGroup.Rsa)
{
return TryGuessRsaKeySpec(cspParameters, out keySpec);
@@ -493,6 +510,7 @@ private static bool TryGuessRsaKeySpec(CspParameters cspParameters, out int keyS
PROV_RSA_SIG,
};
+ Debug.Assert(OperatingSystem.IsWindows());
foreach (int provType in provTypes)
{
cspParameters.ProviderType = provType;
@@ -528,6 +546,7 @@ private static bool TryGuessDsaKeySpec(CspParameters cspParameters, out int keyS
PROV_DSS,
};
+ Debug.Assert(OperatingSystem.IsWindows());
foreach (int provType in provTypes)
{
cspParameters.ProviderType = provType;
@@ -554,6 +573,7 @@ private static bool TryGuessDsaKeySpec(CspParameters cspParameters, out int keyS
private unsafe ICertificatePal? CopyWithPersistedCapiKey(CspKeyContainerInfo keyContainerInfo)
{
+ Debug.Assert(OperatingSystem.IsWindows());
if (string.IsNullOrEmpty(keyContainerInfo.KeyContainerName))
{
return null;
@@ -588,6 +608,7 @@ private static bool TryGuessDsaKeySpec(CspParameters cspParameters, out int keyS
private ICertificatePal CopyWithEphemeralKey(CngKey cngKey)
{
+ Debug.Assert(OperatingSystem.IsWindows());
Debug.Assert(string.IsNullOrEmpty(cngKey.KeyName));
SafeNCryptKeyHandle handle = cngKey.Handle;
diff --git a/src/libraries/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Windows/CertificatePal.cs b/src/libraries/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Windows/CertificatePal.cs
index 10ac6e7480a1f..24449d9da824d 100644
--- a/src/libraries/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Windows/CertificatePal.cs
+++ b/src/libraries/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Windows/CertificatePal.cs
@@ -410,6 +410,7 @@ public void AppendPrivateKeyInfo(StringBuilder sb)
sb.AppendLine();
sb.AppendLine("[Private Key]");
+ Debug.Assert(OperatingSystem.IsWindows());
CspKeyContainerInfo? cspKeyContainerInfo = null;
try
{
diff --git a/src/libraries/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Windows/Native/SafeHandles.cs b/src/libraries/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Windows/Native/SafeHandles.cs
index 4643f6fa211cc..57e8ef2f8b718 100644
--- a/src/libraries/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Windows/Native/SafeHandles.cs
+++ b/src/libraries/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Windows/Native/SafeHandles.cs
@@ -169,6 +169,7 @@ public static void DeleteKeyContainer(SafeCertContextHandle pCertContext)
try
{
+ Debug.Assert(OperatingSystem.IsWindows());
using (CngKey cngKey = CngKey.Open(keyContainerName, new CngProvider(providerName)))
{
cngKey.Delete();
diff --git a/src/libraries/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Windows/X509Pal.PublicKey.cs b/src/libraries/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Windows/X509Pal.PublicKey.cs
index dd11ea04d0830..196bb7dde48d8 100644
--- a/src/libraries/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Windows/X509Pal.PublicKey.cs
+++ b/src/libraries/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Windows/X509Pal.PublicKey.cs
@@ -30,8 +30,10 @@ public ECDsa DecodeECDsaPublicKey(ICertificatePal? certificatePal)
{
return DecodeECPublicKey(
pal,
+#pragma warning disable CA1416 // Validate platform compatibility, flow analysis bug
factory: cngKey => new ECDsaCng(cngKey),
import: (algorithm, ecParams) => algorithm.ImportParameters(ecParams));
+#pragma warning restore CA1416
}
throw new NotSupportedException(SR.NotSupported_KeyAlgorithm);
@@ -43,8 +45,10 @@ public ECDiffieHellman DecodeECDiffieHellmanPublicKey(ICertificatePal? certifica
{
return DecodeECPublicKey(
pal,
+#pragma warning disable CA1416 // Validate platform compatibility
factory: cngKey => new ECDiffieHellmanCng(cngKey),
import: (algorithm, ecParams) => algorithm.ImportParameters(ecParams),
+#pragma warning restore CA1416
importFlags: CryptImportPublicKeyInfoFlags.CRYPT_OID_INFO_PUBKEY_ENCRYPT_KEY_FLAG);
}
@@ -59,6 +63,7 @@ public AsymmetricAlgorithm DecodePublicKey(Oid oid, byte[] encodedKeyValue, byte
case AlgId.CALG_RSA_KEYX:
case AlgId.CALG_RSA_SIGN:
{
+ Debug.Assert(OperatingSystem.IsWindows());
byte[] keyBlob = DecodeKeyBlob(CryptDecodeObjectStructType.CNG_RSA_PUBLIC_KEY_BLOB, encodedKeyValue);
CngKey cngKey = CngKey.Import(keyBlob, CngKeyBlobFormat.GenericPublicBlob);
return new RSACng(cngKey);
@@ -90,6 +95,7 @@ private static TAlgorithm DecodeECPublicKey(
byte[] keyBlob;
string? curveName = GetCurveName(bCryptKeyHandle);
+ Debug.Assert(OperatingSystem.IsWindows());
if (curveName == null)
{
if (HasExplicitParameters(bCryptKeyHandle))
@@ -149,6 +155,7 @@ private static SafeBCryptKeyHandle ImportPublicKeyInfo(SafeCertContextHandle cer
private static byte[] ExportKeyBlob(SafeBCryptKeyHandle bCryptKeyHandle, CngKeyBlobFormat blobFormat)
{
+ Debug.Assert(OperatingSystem.IsWindows());
string blobFormatString = blobFormat.Format;
int numBytesNeeded = 0;