GlobalAllocSafeHandle.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 / infocard / common / managed / GlobalAllocSafeHandle.cs / 1 / GlobalAllocSafeHandle.cs

                            //------------------------------------------------------------------------------ 
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
namespace Microsoft.InfoCards
{ 
    using System;
    using System.Runtime.InteropServices; 
    using System.Runtime.CompilerServices; 
    using System.Runtime.ConstrainedExecution;
    using System.Security; 
    using Microsoft.InfoCards.Diagnostics;
    using IDT=Microsoft.InfoCards.Diagnostics.InfoCardTrace;

 
    //
    // Summary: 
    // Provides a wrapper over memory allocated by GlobalAlloc 
    // guaranteeing that it will be freed during rude thread / appdomain unloads.
    // Remarks: 
    // There is a small race in the usage of this class, as it is used to wrap return parameters
    // immediatley following the function return.
    //
    internal class GlobalAllocSafeHandle : SafeHandle 
    {
        [SuppressUnmanagedCodeSecurity] 
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
        [DllImport("Kernel32.dll", EntryPoint="RtlZeroMemory", SetLastError=false)]
        public static extern void ZeroMemory( IntPtr dest, Int32 size ); 

        [SuppressUnmanagedCodeSecurity]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
        [DllImport( "kernel32.dll", CallingConvention = CallingConvention.StdCall )] 
        public static extern IntPtr GlobalFree( IntPtr hMem );
 
        // 
        // How many bytes we currently wrap. This can be zero, as our usage allows for a valid handle
        // backed by 0 bytes of allocated memory - specificially TransformBlock and TransformFinalBlock 
        // can return this by design.
        //
        private int m_bytes;
 

        private GlobalAllocSafeHandle() : base( IntPtr.Zero, true ) { m_bytes = 0; } 
 
        public int Length
        { 
            set{ m_bytes = value; }
            get{ return m_bytes; }
        }
        public override bool IsInvalid 
        {
            get 
            { 
                return ( IntPtr.Zero == base.handle );
            } 
        }


 
        //
        // Summary: 
        // Clear the data held and release the memory. 
        //
        protected override bool ReleaseHandle() 
        {

            if( m_bytes > 0 )
            { 
                ZeroMemory( base.handle, m_bytes );
                GlobalFree( base.handle ); 
                m_bytes = 0; 
            }
            return true; 
        }

    }
} 

// 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