ClusterSafeNativeMethods.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / Tools / WSATConfig / Configuration / ClusterSafeNativeMethods.cs / 1 / ClusterSafeNativeMethods.cs

                            //------------------------------------------------------------------------------ 
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------

namespace Microsoft.Tools.ServiceModel.WsatConfig 
{
    using System; 
    using System.Runtime.CompilerServices; 
    using System.Runtime.ConstrainedExecution;
    using System.Runtime.InteropServices; 
    using System.Security.AccessControl;
    using System.Security.Permissions;
    using System.Text;
 
    using Microsoft.Win32;
 
    abstract class SafeClusterHandle : SafeHandle 
    {
        [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] 
        internal SafeClusterHandle()
            :
            base(IntPtr.Zero, true)
        { 
        }
 
        public override bool IsInvalid 
        {
            get { return IsClosed || handle == IntPtr.Zero; } 
        }
    }

    class SafeHCluster : SafeClusterHandle 
    {
        // MSDN remarks: This function always returns TRUE. 
        [DllImport(SafeNativeMethods.ClusApi)] 
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
        static extern bool CloseCluster([In] IntPtr hCluster); 

        protected override bool ReleaseHandle()
        {
            return CloseCluster(handle); 
        }
    } 
 
    class SafeHResource : SafeClusterHandle
    { 
        [DllImport(SafeNativeMethods.ClusApi)]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        static extern bool CloseClusterResource([In] IntPtr hResource);
 
        protected override bool ReleaseHandle()
        { 
            return CloseClusterResource(handle); 
        }
    } 

    class SafeHClusEnum : SafeClusterHandle
    {
        [DllImport(SafeNativeMethods.ClusApi)] 
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        static extern uint ClusterCloseEnum([In] IntPtr hEnum); 
 
        protected override bool ReleaseHandle()
        { 
            return ClusterCloseEnum(handle) == SafeNativeMethods.ERROR_SUCCESS;
        }
    }
 
    class SafeHKey : SafeClusterHandle
    { 
        [DllImport(SafeNativeMethods.ClusApi)] 
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        static extern int ClusterRegCloseKey([In] IntPtr hEnum); 

        protected override bool ReleaseHandle()
        {
            return ClusterRegCloseKey(handle) == SafeNativeMethods.ERROR_SUCCESS; 
        }
    } 
 
    [Flags]
    enum ClusterEnum : uint 
    {
        Node = 0x00000001,
        ResType = 0x00000002,
        Resource = 0x00000004, 
        Group = 0x00000008,
        Network = 0x00000010, 
        NetInterface = 0x00000020, 
        InternalNetwork = 0x80000000
    } 

    enum ClusterResourceControlCode : uint
    {
        GetResourceType = 0x0100002d, 
        //GetId = 0x01000039
    } 
 
    static partial class SafeNativeMethods
    { 
        internal const string ClusApi = "clusapi.dll";

        internal const uint ERROR_SUCCESS = 0;
        internal const uint ERROR_FILE_NOT_FOUND = 2; 
        internal const uint ERROR_INSUFFICIENT_BUFFER = 122;
        internal const uint ERROR_MORE_DATA = 234; 
        internal const uint ERROR_NO_MORE_ITEMS = 259; 
        internal const uint REG_OPTION_NON_VOLATILE = 0;
 
        [DllImport(ClusApi, SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern SafeHCluster OpenCluster(
            [MarshalAs(UnmanagedType.LPWStr)] [In] string lpszClusterName);
 
        [DllImport(ClusApi, SetLastError = false, CharSet = CharSet.Unicode)]
        internal static extern int GetClusterInformation( 
            [In] SafeHCluster hCluster, 
            [Out] StringBuilder lpszClusterName,
            [In, Out] ref uint lpcchClusterName, 
            [In, Out] IntPtr lpClusterInfo
            );

        [DllImport(ClusApi, SetLastError = true, CharSet = CharSet.Unicode)] 
        internal static extern SafeHClusEnum ClusterOpenEnum(
            [In] SafeHCluster hCluster, 
            [In] ClusterEnum dwType); 

        [DllImport(ClusApi, CharSet = CharSet.Unicode)] 
        internal static extern uint ClusterEnum(
            [In] SafeHClusEnum hEnum,
            [In] uint dwIndex,
            [Out] out uint lpdwType, 
            [Out] StringBuilder lpszName,
            [In, Out] ref uint lpcchName); 
 
        [DllImport(ClusApi, CharSet = CharSet.Unicode)]
        internal static extern uint ClusterResourceControl( 
            [In] SafeHResource hResource,
            [In] IntPtr hHostNode,  //HNODE hHostNode, never used
            [In] ClusterResourceControlCode dwControlCode,
            [In] IntPtr lpInBuffer, // LPVOID lpInBuffer, never used 
            [In] uint cbInBufferSize,
            [In, Out, MarshalAs(UnmanagedType.LPArray)] byte[] buffer, 
            [In] uint cbOutBufferSize, 
            [In, Out] ref uint lpcbBytesReturned);
 
        [DllImport(ClusApi, SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern SafeHResource OpenClusterResource(
            [In] SafeHCluster hCluster,
            [In, MarshalAs(UnmanagedType.LPWStr)] string lpszResourceName); 

        [DllImport(ClusApi, SetLastError = true, CharSet = CharSet.Unicode)] 
        internal static extern bool GetClusterResourceNetworkName( 
            [In] SafeHResource hResource,
            [Out] StringBuilder lpBuffer, 
            [In, Out] ref uint nSize);

        [DllImport(ClusApi, SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern SafeHKey GetClusterResourceKey( 
            [In] SafeHResource hResource,
            [In] RegistryRights samDesired); 
 
        [DllImport(ClusApi, SetLastError = false, CharSet = CharSet.Unicode)]
        internal static extern int ClusterRegCreateKey( 
            [In] SafeHKey hKey,
            [In, MarshalAs(UnmanagedType.LPWStr)] string lpszSubKey,
            [In] uint dwOption,
            [In] RegistryRights samDesired, 
            [In] IntPtr lpSecurityAttributes,
            [Out] out SafeHKey phkResult, 
            [Out] out int lpdwDisposition); 

        [DllImport(ClusApi, CharSet = CharSet.Unicode)] 
        internal static extern int ClusterRegQueryValue(
            [In] SafeHKey hKey,
            [In, MarshalAs(UnmanagedType.LPWStr)] string lpszValueName,
            [Out] out RegistryValueKind lpdwValueType, 
            [Out, MarshalAs(UnmanagedType.LPArray)] byte[] lpbData,
            [In, Out] ref uint lpcbData); 
 
        [DllImport(ClusApi, CharSet = CharSet.Unicode)]
        internal static extern int ClusterRegSetValue( 
            [In] SafeHKey hKey,
            [In, MarshalAs(UnmanagedType.LPWStr)] string lpszValueName,
            [In] RegistryValueKind lpdwValueType,
            [In, MarshalAs(UnmanagedType.LPArray)] byte[] lpbData, 
            [In] uint lpcbData);
 
        [DllImport(ClusApi, CharSet = CharSet.Unicode)] 
        internal static extern int ClusterRegGetKeySecurity(
            [In] SafeHKey hKey, 
            [In] SecurityInfos securityInformation,
            [In, Out] byte[] securityDescriptor,
            [In, Out] ref uint lpcbSecurityDescriptor);
 
        [DllImport(ClusApi, CharSet = CharSet.Unicode)]
        internal static extern int ClusterRegSetKeySecurity( 
            [In] SafeHKey hKey, 
            [In] SecurityInfos securityInformation,
            [In] byte[] securityDescriptor); 
    }
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK