Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / 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
- WebPartEventArgs.cs
- TreeNodeConverter.cs
- DataObjectFieldAttribute.cs
- Int64AnimationBase.cs
- SignatureTargetIdManager.cs
- DependencyObjectValidator.cs
- MethodExpr.cs
- SqlColumnizer.cs
- Metadata.cs
- CatalogPart.cs
- CryptoHelper.cs
- AsymmetricAlgorithm.cs
- BooleanToSelectiveScrollingOrientationConverter.cs
- TokenCreationParameter.cs
- XmlReflectionMember.cs
- SerialReceived.cs
- IdentifierElement.cs
- ByteStream.cs
- StorageMappingFragment.cs
- FocusChangedEventArgs.cs
- Parsers.cs
- FileReservationCollection.cs
- QueryCacheEntry.cs
- _DomainName.cs
- DataGridViewIntLinkedList.cs
- TrustManagerPromptUI.cs
- objectresult_tresulttype.cs
- DataGridTableStyleMappingNameEditor.cs
- CompModSwitches.cs
- MatrixTransform3D.cs
- SourceSwitch.cs
- PageSettings.cs
- LiteralText.cs
- EndOfStreamException.cs
- FactoryMaker.cs
- EncodingTable.cs
- ConfigurationStrings.cs
- TypedElement.cs
- OleDbTransaction.cs
- WinEventHandler.cs
- BindToObject.cs
- FocusWithinProperty.cs
- SqlCacheDependencyDatabaseCollection.cs
- WebZoneDesigner.cs
- ProcessHostFactoryHelper.cs
- VisualStyleInformation.cs
- DataServiceConfiguration.cs
- WSFederationHttpSecurityMode.cs
- TimeoutHelper.cs
- MenuItem.cs
- TableAdapterManagerGenerator.cs
- BinaryNegotiation.cs
- DateTimeFormatInfoScanner.cs
- FixedSchema.cs
- DecoderNLS.cs
- OdbcCommand.cs
- WindowsToolbarAsMenu.cs
- SqlClientFactory.cs
- ResourceManagerWrapper.cs
- _IPv6Address.cs
- UIElementAutomationPeer.cs
- DocumentAutomationPeer.cs
- DtdParser.cs
- HTTPNotFoundHandler.cs
- ActivityCodeDomSerializationManager.cs
- DataGridViewComboBoxEditingControl.cs
- WindowsTab.cs
- FactoryGenerator.cs
- ChangeInterceptorAttribute.cs
- ExecutorLocksHeldException.cs
- ProtocolsConfiguration.cs
- ExpressionDumper.cs
- Tool.cs
- ServiceChannel.cs
- XmlConverter.cs
- AsymmetricSignatureDeformatter.cs
- OracleSqlParser.cs
- OleDbRowUpdatedEvent.cs
- EdgeProfileValidation.cs
- EmbeddedMailObject.cs
- TextEffectResolver.cs
- Win32.cs
- SynchronizingStream.cs
- WindowsAuthenticationModule.cs
- BufferedGraphics.cs
- Storyboard.cs
- CustomAttribute.cs
- ListBoxItemWrapperAutomationPeer.cs
- TemplateBuilder.cs
- JournalEntryListConverter.cs
- WebPartHelpVerb.cs
- AppModelKnownContentFactory.cs
- MissingMethodException.cs
- NativeMethods.cs
- HeaderElement.cs
- ObjectDisposedException.cs
- NegatedConstant.cs
- WebPartDescriptionCollection.cs
- AnnotationStore.cs
- Timer.cs