Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Core / CSharp / System / Windows / Media / SafeMILHandle.cs / 1 / SafeMILHandle.cs
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
//
// Description:
// A safe way to deal with unmanaged MIL interface pointers.
//---------------------------------------------------------------------------
using System;
using System.IO;
using System.Security;
using System.Security.Permissions;
using System.Collections;
using System.Reflection;
using MS.Internal;
using MS.Win32;
using System.Diagnostics;
using System.Windows.Media;
using System.Runtime;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
using Microsoft.Win32.SafeHandles;
using Microsoft.Internal;
using UnsafeNativeMethods=MS.Win32.PresentationCore.UnsafeNativeMethods;
namespace System.Windows.Media
{
internal class SafeMILHandle : SafeHandleZeroOrMinusOneIsInvalid
{
///
/// Use this constructor if the handle isn't ready yet and later
/// set the handle with SetHandle. SafeMILHandle owns the release
/// of the handle.
///
///
/// Critical: This derives from a class that has a link demand and inheritance demand
/// TreatAsSafe: Ok to call constructor
///
[SecurityCritical,SecurityTreatAsSafe]
internal SafeMILHandle() : base(true)
{
}
///
/// Use this constructor if the handle exists at construction time.
/// SafeMILHandle owns the release of the parameter.
///
///
/// Critical: This code calls UpdateEstimatedSize.
/// It is used to keep memory around
///
[SecurityCritical]
internal SafeMILHandle(IntPtr handle, long estimatedSize) : base(true)
{
SetHandle(handle);
//
// Hint the GC at the size of the unmanaged memory associated with
// this object. We release pressure in the finalizer.
//
UpdateEstimatedSize(estimatedSize);
}
///
/// Change our size to the new size specified
///
///
/// Critical: This code calls into AddMemoryPressure and RemoveMemoryPressure
/// both of which have link demands. It is used to keep memory around
///
[SecurityCritical]
internal void UpdateEstimatedSize(long estimatedSize)
{
if (_gcPressure > 0)
{
MemoryPressure.Remove(_gcPressure);
}
_gcPressure = estimatedSize;
if (_gcPressure > 0)
{
MemoryPressure.Add(_gcPressure);
}
}
///
/// Critical - calls unmanaged code, not treat as safe because you must
/// validate that handle is a valid COM object.
///
[SecurityCritical]
protected override bool ReleaseHandle()
{
UnsafeNativeMethods.MILUnknown.ReleaseInterface(ref handle);
//
// We've released the unmangaed memory, so remove associated
// GC pressure.
//
UpdateEstimatedSize(0);
return true;
}
//
// Estimated size in bytes of the unmanaged memory we are holding onto
//
private long _gcPressure;
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
//
// Description:
// A safe way to deal with unmanaged MIL interface pointers.
//---------------------------------------------------------------------------
using System;
using System.IO;
using System.Security;
using System.Security.Permissions;
using System.Collections;
using System.Reflection;
using MS.Internal;
using MS.Win32;
using System.Diagnostics;
using System.Windows.Media;
using System.Runtime;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
using Microsoft.Win32.SafeHandles;
using Microsoft.Internal;
using UnsafeNativeMethods=MS.Win32.PresentationCore.UnsafeNativeMethods;
namespace System.Windows.Media
{
internal class SafeMILHandle : SafeHandleZeroOrMinusOneIsInvalid
{
///
/// Use this constructor if the handle isn't ready yet and later
/// set the handle with SetHandle. SafeMILHandle owns the release
/// of the handle.
///
///
/// Critical: This derives from a class that has a link demand and inheritance demand
/// TreatAsSafe: Ok to call constructor
///
[SecurityCritical,SecurityTreatAsSafe]
internal SafeMILHandle() : base(true)
{
}
///
/// Use this constructor if the handle exists at construction time.
/// SafeMILHandle owns the release of the parameter.
///
///
/// Critical: This code calls UpdateEstimatedSize.
/// It is used to keep memory around
///
[SecurityCritical]
internal SafeMILHandle(IntPtr handle, long estimatedSize) : base(true)
{
SetHandle(handle);
//
// Hint the GC at the size of the unmanaged memory associated with
// this object. We release pressure in the finalizer.
//
UpdateEstimatedSize(estimatedSize);
}
///
/// Change our size to the new size specified
///
///
/// Critical: This code calls into AddMemoryPressure and RemoveMemoryPressure
/// both of which have link demands. It is used to keep memory around
///
[SecurityCritical]
internal void UpdateEstimatedSize(long estimatedSize)
{
if (_gcPressure > 0)
{
MemoryPressure.Remove(_gcPressure);
}
_gcPressure = estimatedSize;
if (_gcPressure > 0)
{
MemoryPressure.Add(_gcPressure);
}
}
///
/// Critical - calls unmanaged code, not treat as safe because you must
/// validate that handle is a valid COM object.
///
[SecurityCritical]
protected override bool ReleaseHandle()
{
UnsafeNativeMethods.MILUnknown.ReleaseInterface(ref handle);
//
// We've released the unmangaed memory, so remove associated
// GC pressure.
//
UpdateEstimatedSize(0);
return true;
}
//
// Estimated size in bytes of the unmanaged memory we are holding onto
//
private long _gcPressure;
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- CodeAccessPermission.cs
- LambdaCompiler.cs
- PersonalizableAttribute.cs
- CSharpCodeProvider.cs
- SqlDataSourceFilteringEventArgs.cs
- AmbiguousMatchException.cs
- ApplicationDirectory.cs
- loginstatus.cs
- ExpressionEditorAttribute.cs
- KeyFrames.cs
- RecognizedAudio.cs
- localization.cs
- SchemaImporterExtensionsSection.cs
- ListItemConverter.cs
- EntityDataSourceContextDisposingEventArgs.cs
- ComponentEvent.cs
- GetWinFXPath.cs
- WasAdminWrapper.cs
- VideoDrawing.cs
- ReservationCollection.cs
- FaultContractAttribute.cs
- StringValidatorAttribute.cs
- DeploymentExceptionMapper.cs
- WorkflowOwnershipException.cs
- ByteStack.cs
- activationcontext.cs
- HitTestResult.cs
- HttpApplication.cs
- MD5CryptoServiceProvider.cs
- WebBrowserProgressChangedEventHandler.cs
- GestureRecognitionResult.cs
- LassoHelper.cs
- DataGridItem.cs
- PhysicalOps.cs
- TextWriter.cs
- ForceCopyBuildProvider.cs
- XmlConverter.cs
- WinEventWrap.cs
- ConfigXmlElement.cs
- DescendantBaseQuery.cs
- DBAsyncResult.cs
- SystemEvents.cs
- BatchServiceHost.cs
- PixelShader.cs
- ContentType.cs
- TimeZone.cs
- TypeSemantics.cs
- XmlAnyAttributeAttribute.cs
- RepeatBehavior.cs
- SessionEndingEventArgs.cs
- DataRowView.cs
- XmlDataSource.cs
- Part.cs
- ValidationResult.cs
- ValueQuery.cs
- OutputCacheSection.cs
- FontResourceCache.cs
- IsolatedStorage.cs
- EqualityArray.cs
- WebBrowserProgressChangedEventHandler.cs
- TreeNodeCollection.cs
- Stacktrace.cs
- PropertyReferenceExtension.cs
- Native.cs
- StorageModelBuildProvider.cs
- VariableElement.cs
- AppearanceEditorPart.cs
- MorphHelper.cs
- StatementContext.cs
- PolyLineSegmentFigureLogic.cs
- HelpInfo.cs
- InternalResources.cs
- DataGridViewCellParsingEventArgs.cs
- XsdBuildProvider.cs
- ICollection.cs
- MetadataUtilsSmi.cs
- EUCJPEncoding.cs
- PenLineCapValidation.cs
- ListViewDataItem.cs
- TextEndOfSegment.cs
- TrackingStringDictionary.cs
- Timer.cs
- OdbcReferenceCollection.cs
- MarginCollapsingState.cs
- SafeCloseHandleCritical.cs
- ListenerChannelContext.cs
- LicFileLicenseProvider.cs
- Scene3D.cs
- DiagnosticsElement.cs
- ElementFactory.cs
- EntityObject.cs
- DataListItemCollection.cs
- DeviceContext.cs
- DecoderNLS.cs
- HttpWebRequestElement.cs
- RegexMatchCollection.cs
- InfoCardSymmetricAlgorithm.cs
- ImageListDesigner.cs
- MessageLogger.cs
- WpfXamlLoader.cs