Export (0) Print
Expand All
This topic has not yet been rated - Rate this topic

CriticalHandleZeroOrMinusOneIsInvalid Class

Note: This class is new in the .NET Framework version 2.0.

Provides a base class for Win32 critical handle implementations in which the value of either 0 or -1 indicates an invalid handle.

Namespace: Microsoft.Win32.SafeHandles
Assembly: mscorlib (in mscorlib.dll)

public abstract class CriticalHandleZeroOrMinusOneIsInvalid : CriticalHandle
public abstract class CriticalHandleZeroOrMinusOneIsInvalid extends CriticalHandle
public abstract class CriticalHandleZeroOrMinusOneIsInvalid extends CriticalHandle

This class derives from the System.Runtime.InteropServices.CriticalHandle class. It describes the format of an invalid handle. For example, some handles use -1 as an invalid handle value, while others use 0. Further derivations of this class (for example, file or registry handles) can specialize this further.

Use the CriticalHandleZeroOrMinusOneIsInvalid class when you need to wrap an unmanaged resource that does not have an existing managed wrapper.

NoteNote

See the CriticalHandle class for important information on critical handle security and thread safety.

The following code example demonstrates how to create a class that derives from the CriticalHandleZeroOrMinusOneIsInvalid class. This example creates a class that wraps a pointer to unmanaged memory.

using System;
using System.Security.Permissions;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;

namespace CriticalHandleExamples
{
    class Example
    {
        public static void Main()
        {

            IntPtr ptr = Marshal.AllocHGlobal(10);

            Console.WriteLine("Ten bytes of unmanaged memory allocated.");

            CriticalUnmanagedMemoryHandle memHabdle = new CriticalUnmanagedMemoryHandle(ptr);

            if (memHabdle.IsInvalid)
            {
                Console.WriteLine("CriticalUnmanagedMemoryHandle is invalid!.");
            }
            else
            {
                Console.WriteLine("CriticalUnmanagedMemoryHandle class initialized to unmanaged memory.");
            }

            Console.ReadLine();
        }
    }




    // Demand unmanaged code permission to use this class.
    [SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)]
    sealed class CriticalUnmanagedMemoryHandle : CriticalHandleZeroOrMinusOneIsInvalid
    {

        // Set the handle.
        internal CriticalUnmanagedMemoryHandle(IntPtr preexistingHandle)
        {
            SetHandle(preexistingHandle);
        }

        // Perform any specific actions to release the 
        // handle in the ReleaseHandle method.
        // Often, you need to use Pinvoke to make
        // a call into the Win32 API to release the 
        // handle. In this case, however, we can use
        // the Marshal class to release the unmanaged
        // memory.
        override protected bool ReleaseHandle()
        {
            // "handle" is the internal
            // value for the IntPtr handle.

            // If the handle was set,
            // free it. Return success.
            if (handle != IntPtr.Zero)
            {

                // Free the handle.
                Marshal.FreeHGlobal(handle);

                // Set the handle to zero.
                handle = IntPtr.Zero;

                // Return success.
                return true;

            }

            // Return false. 
            return false;

        }
    }
}


System.Object
   System.Runtime.ConstrainedExecution.CriticalFinalizerObject
     System.Runtime.InteropServices.CriticalHandle
      Microsoft.Win32.SafeHandles.CriticalHandleZeroOrMinusOneIsInvalid
Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see System Requirements.

.NET Framework

Supported in: 2.0
Did you find this helpful?
(1500 characters remaining)
Thank you for your feedback

Community Additions

ADD
Show:
© 2014 Microsoft. All rights reserved.