File: Base\MS\Internal\Interop\NativeStructs.cs
Project: wpf\src\WindowsBase.csproj (WindowsBase)
/**************************************************************************\
    Copyright Microsoft Corporation. All Rights Reserved.
\**************************************************************************/
 
//
// A consolidated file of native structures exposed for interop.
// These may be structs or classes, depending on the calling requirements
//
// The naming should generally match the native counterparts.
// The structures may be slightly thicker wrappers to make them
// easier to consume correctly from .Net code (e.g. hiding resource management)
//
 
namespace MS.Internal.Interop
{
    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    using System.Runtime.InteropServices.ComTypes;
    using System.Security;
 
    // Some COM interfaces and Win32 structures are already declared in the framework.
    // Interesting ones to remember in System.Runtime.InteropServices.ComTypes are:
    using FILETIME = System.Runtime.InteropServices.ComTypes.FILETIME;
    using IPersistFile = System.Runtime.InteropServices.ComTypes.IPersistFile;
    using IStream = System.Runtime.InteropServices.ComTypes.IStream;
 
    /// <SecurityNote>
    /// This class is not safe to use in partial trust.
    /// Critical: This class is a wrapper for a native structure that manages its own resources.
    /// </SecurityNote>
    [SecurityCritical]
    [StructLayout(LayoutKind.Explicit)]
    internal class PROPVARIANT : IDisposable
    {
        private static class NativeMethods
        {
            /// <SecurityNote>
            /// Critical: Suppresses unmanaged code security.
            /// </SecurityNote>
            [SecurityCritical, SuppressUnmanagedCodeSecurity]
            [DllImport(MS.Win32.ExternDll.Ole32)]
            internal static extern int PropVariantClear(PROPVARIANT pvar);
        }
 
        [FieldOffset(0)]
        private ushort vt;
        [FieldOffset(8)]
        private IntPtr pointerVal;
        [FieldOffset(8)]
        private byte byteVal;
        [FieldOffset(8)]
        private long longVal;
        [FieldOffset(8)]
        private short boolVal;
 
        /// <SecurityNote>
        /// <SecurityNote>
        /// Critical: This class is tagged Critical
        /// TreatAsSafe - This class is only available in full trust.
        /// </SecurityNote>
        public VarEnum VarType
        {
            [SecurityCritical, SecurityTreatAsSafe]
            get { return (VarEnum)vt; }
        }
 
        // Right now only using this for strings.  If for some reason we get something else return null.
        /// <SecurityNote>
        /// Critical: This class is tagged Critical
        /// TreatAsSafe - This class is only available in full trust.
        /// </SecurityNote>
        [SecurityCritical, SecurityTreatAsSafe]
        public string GetValue()
        {
            if (vt == (ushort)VarEnum.VT_LPWSTR)
            {
                return Marshal.PtrToStringUni(pointerVal);
            }
 
            return null;
        }
 
        /// <SecurityNote>
        /// Critical: This class is tagged Critical
        /// TreatAsSafe - This class is only available in full trust.
        /// </SecurityNote>
        [SecurityCritical, SecurityTreatAsSafe]
        public void SetValue(bool f)
        {
            Clear();
            vt = (ushort)VarEnum.VT_BOOL;
            boolVal = (short)(f ? -1 : 0);
        }
 
        /// <SecurityNote>
        /// Critical: This class is tagged Critical
        /// TreatAsSafe - This class is only available in full trust.
        /// </SecurityNote>
        [SecurityCritical, SecurityTreatAsSafe]
        public void SetValue(string val)
        {
            Clear();
            vt = (ushort)VarEnum.VT_LPWSTR;
            pointerVal = Marshal.StringToCoTaskMemUni(val);
        }
 
        /// <SecurityNote>
        /// Critical - Calls critical PropVariantClear
        /// TreatAsSafe - This class is only available in full trust.
        /// </SecurityNote>
        [SecurityCritical, SecurityTreatAsSafe]
        public void Clear()
        {
            NativeMethods.PropVariantClear(this);
        }
 
        #region IDisposable Pattern
 
        /// <SecurityNote>
        /// Critical: This class is tagged Critical
        /// TreatAsSafe - This class is only available in full trust.
        /// </SecurityNote>
        [SecurityCritical, SecurityTreatAsSafe]
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
 
        /// <SecurityNote>
        /// Critical: This class is tagged Critical
        /// TreatAsSafe - This class is only available in full trust.
        /// </SecurityNote>
        [SecurityCritical, SecurityTreatAsSafe]
        ~PROPVARIANT()
        {
            Dispose(false);
        }
 
        /// <SecurityNote>
        /// Critical: This class is tagged Critical
        /// TreatAsSafe - This class is only available in full trust.
        /// </SecurityNote>
        [SecurityCritical, SecurityTreatAsSafe]
        private void Dispose(bool disposing)
        {
            Clear();
        }
 
        #endregion
    }
    
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    [BestFitMapping(false)]
    internal class WIN32_FIND_DATAW
    {
        public FileAttributes dwFileAttributes;
        public FILETIME ftCreationTime;
        public FILETIME ftLastAccessTime;
        public FILETIME ftLastWriteTime;
        public int nFileSizeHigh;
        public int nFileSizeLow;
        public int dwReserved0;
        public int dwReserved1;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
        public string cFileName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
        public string cAlternateFileName;
    }
 
    // New to Win7.
    [StructLayout(LayoutKind.Sequential)]
    internal struct CHANGEFILTERSTRUCT
    {
        public uint cbSize;
        public MSGFLTINFO ExtStatus;
    }
}