You've already forked linux-packaging-mono
							
							
		
			
	
	
		
			86 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			86 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|   | //----------------------------------------------------------------------------- | |||
|  | // Copyright (c) Microsoft Corporation.  All rights reserved. | |||
|  | //----------------------------------------------------------------------------- | |||
|  | 
 | |||
|  | namespace System.ServiceModel.Activation.Interop | |||
|  | { | |||
|  |     using System; | |||
|  |     using System.Runtime; | |||
|  |     using System.Runtime.CompilerServices; | |||
|  |     using System.Runtime.InteropServices; | |||
|  |     using System.Security; | |||
|  |     using System.Text; | |||
|  |     using Microsoft.Win32.SafeHandles; | |||
|  | 
 | |||
|  | #pragma warning disable 618 // have not moved to the v4 security model yet | |||
|  |     [SecurityCritical(SecurityCriticalScope.Everything)] | |||
|  | #pragma warning restore 618 | |||
|  |     sealed class SafeHGlobalHandleCritical : SafeHandleZeroOrMinusOneIsInvalid | |||
|  |     { | |||
|  |         SafeHGlobalHandleCritical() | |||
|  |             : base(true) | |||
|  |         { | |||
|  |         } | |||
|  | 
 | |||
|  |         // 0 is an Invalid Handle | |||
|  |         SafeHGlobalHandleCritical(IntPtr handle) | |||
|  |             : base(true) | |||
|  |         { | |||
|  |             Fx.Assert(handle == IntPtr.Zero, "SafeHGlobalHandleCritical constructor can only be called with IntPtr.Zero."); | |||
|  |             SetHandle(handle); | |||
|  |         } | |||
|  | 
 | |||
|  |         protected override bool ReleaseHandle() | |||
|  |         { | |||
|  |             Marshal.FreeHGlobal(handle); | |||
|  |             return true; | |||
|  |         } | |||
|  | 
 | |||
|  |         public static SafeHGlobalHandleCritical InvalidHandle | |||
|  |         { | |||
|  |             get { return new SafeHGlobalHandleCritical(IntPtr.Zero); } | |||
|  |         } | |||
|  | 
 | |||
|  |         public static SafeHGlobalHandleCritical AllocHGlobal(string s) | |||
|  |         { | |||
|  |             byte[] bytes = DiagnosticUtility.Utility.AllocateByteArray(checked((s.Length + 1) * 2)); | |||
|  |             Encoding.Unicode.GetBytes(s, 0, s.Length, bytes, 0); | |||
|  |             return AllocHGlobal(bytes); | |||
|  |         } | |||
|  | 
 | |||
|  |         public static SafeHGlobalHandleCritical AllocHGlobal(byte[] bytes) | |||
|  |         { | |||
|  |             SafeHGlobalHandleCritical result = AllocHGlobal(bytes.Length); | |||
|  |             Marshal.Copy(bytes, 0, result.DangerousGetHandle(), bytes.Length); | |||
|  |             return result; | |||
|  |         } | |||
|  | 
 | |||
|  |         public static SafeHGlobalHandleCritical AllocHGlobal(uint cb) | |||
|  |         { | |||
|  |             // The cast could overflow to minus. | |||
|  |             // Unfortunately, Marshal.AllocHGlobal only takes int. | |||
|  |             return AllocHGlobal((int)cb); | |||
|  |         } | |||
|  | 
 | |||
|  |         public static SafeHGlobalHandleCritical AllocHGlobal(int cb) | |||
|  |         { | |||
|  |             if (cb < 0) | |||
|  |             { | |||
|  |                 throw FxTrace.Exception.ArgumentOutOfRange("cb", cb, SR.ValueMustBeNonNegative); | |||
|  |             } | |||
|  | 
 | |||
|  |             SafeHGlobalHandleCritical result = new SafeHGlobalHandleCritical(); | |||
|  | 
 | |||
|  |             // CER  | |||
|  |             RuntimeHelpers.PrepareConstrainedRegions(); | |||
|  |             try { } | |||
|  |             finally | |||
|  |             { | |||
|  |                 IntPtr ptr = Marshal.AllocHGlobal(cb); | |||
|  |                 result.SetHandle(ptr); | |||
|  |             } | |||
|  |             return result; | |||
|  |         } | |||
|  |     } | |||
|  | } |