File: Base\MS\Internal\Utilities.cs
Project: wpf\src\WindowsBase.csproj (WindowsBase)
/**************************************************************************\
    Copyright Microsoft Corporation. All Rights Reserved.
\**************************************************************************/
 
namespace MS.Internal
{
    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    using System.Security;
    using MS.Win32;
 
    /// <summary>
    /// General utility class for macro-type functions.
    /// </summary>
    internal static class Utilities
    {
        private static readonly Version _osVersion = Environment.OSVersion.Version;
 
        internal static bool IsOSVistaOrNewer
        {
            get { return _osVersion >= new Version(6, 0); }
        }
 
        internal static bool IsOSWindows7OrNewer
        {
            get { return _osVersion >= new Version(6, 1); }
        }
 
        internal static bool IsOSWindows8OrNewer
        {
            get { return _osVersion >= new Version(6, 2); }
        }
        
        /// <SecurityNote>
        /// Critical -- calls into an unsafe native method.
        /// TreatAsSafe -- the call to DwmIsCompositionEnabled simply returns a boolean
        ///                through an out parameter, it is safe information to expose
        /// </SecurityNote>
        internal static bool IsCompositionEnabled
        {
            [SecurityCritical, SecurityTreatAsSafe]
            get
            {
                if (!IsOSVistaOrNewer)
                {
                    return false;
                }
 
                Int32 isDesktopCompositionEnabled = 0;
                UnsafeNativeMethods.HRESULT.Check(UnsafeNativeMethods.DwmIsCompositionEnabled(out isDesktopCompositionEnabled));
                return isDesktopCompositionEnabled != 0;
            }
        }
 
        internal static void SafeDispose<T>(ref T disposable) where T : IDisposable
        {
            // Dispose can safely be called on an object multiple times.
            IDisposable t = disposable;
            disposable = default(T);
            if (null != t)
            {
                t.Dispose();
            }
        }
        
        /// <SecurityNote>
        /// Critical - Suppresses unmanaged code security.  Calls Marshal.ReleaseComObject which has a LinkDemand.
        /// </SecurityNote>
        [SuppressUnmanagedCodeSecurity, SecurityCritical]
        internal static void SafeRelease<T>(ref T comObject) where T : class
        {
            T t = comObject;
            comObject = default(T);
            if (null != t)
            {
                Debug.Assert(Marshal.IsComObject(t));
                Marshal.ReleaseComObject(t);
            }
        }
    }
}