ZeroFreeGlobalAllocAnsi Method
TOC
Collapse the table of content
Expand the table of content

Marshal.ZeroFreeGlobalAllocAnsi Method (IntPtr)

 

Frees an unmanaged string pointer that was allocated using the SecureStringToGlobalAllocAnsi method.

Namespace:   System.Runtime.InteropServices
Assembly:  mscorlib (in mscorlib.dll)

[SecurityCriticalAttribute]
public static void ZeroFreeGlobalAllocAnsi(
	IntPtr s
)

Parameters

s
Type: System.IntPtr

The address of the unmanaged string to free.

The ZeroFreeGlobalAllocAnsi method first zeros out and then frees unmanaged memory that was allocated using the SecureStringToGlobalAllocAnsi method.

The following example uses the SecureStringToGlobalAllocAnsi method to marshal and decrypt the contents of a SecureString object to a block of unmanaged memory. It then uses the ZeroFreeGlobalAllocAnsi method to zero out and dispose the unmanaged block.

using System;
using System.Runtime.InteropServices;
using System.Security;

class Example
{
    static void Main()
    {
        IntPtr unmanagedRef = IntPtr.Zero;

        // Ask the user for a password.
        Console.Write("Please enter your password: ");
        SecureString passWord = GetPassword();

        Console.WriteLine("Copying and decrypting the string to unmanaged memory...");
        // Copy the Secure string to unmanaged memory (and decrypt it).
        unmanagedRef = Marshal.SecureStringToGlobalAllocAnsi(passWord);
        passWord.Dispose();

        if (unmanagedRef != IntPtr.Zero) {
            Console.WriteLine("Zeroing out unmanaged memory...");
            Marshal.ZeroFreeGlobalAllocAnsi(unmanagedRef);
        }
        Console.WriteLine("Done.");
    }

    public static SecureString GetPassword()
    {
        SecureString password = new SecureString();

        // get the first character of the password
        ConsoleKeyInfo nextKey = Console.ReadKey(true);

        while (nextKey.Key != ConsoleKey.Enter) {
            if (nextKey.Key == ConsoleKey.Backspace) {
                if (password.Length > 0) {
                    password.RemoveAt(password.Length - 1);

                    // erase the last * as well
                    Console.Write(nextKey.KeyChar);
                    Console.Write(" ");
                    Console.Write(nextKey.KeyChar);
                }
            }
            else {
                password.AppendChar(nextKey.KeyChar);
                Console.Write("*");
            }

            nextKey = Console.ReadKey(true);
        }
        Console.WriteLine();

        // lock the password down
        password.MakeReadOnly();
        return password;
    }
}
// The example displays output like the following:
//       Please enter your password: ********
//       Copying and decrypting the string to unmanaged memory...
//       Zeroing out unmanaged memory...
//       Done.

SecurityCriticalAttribute

requires full trust for the immediate caller. This member cannot be used by partially trusted or transparent code.

Universal Windows Platform
Available since 4.5
.NET Framework
Available since 2.0
Portable Class Library
Supported in: portable .NET platforms
Windows Phone
Available since 8.1
Return to top
Show:
© 2016 Microsoft