Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Core / 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.InteropServices;
using System.Runtime.CompilerServices;
using Microsoft.Win32.SafeHandles;
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 unmanaged 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
- AppSettingsExpressionBuilder.cs
- TableDetailsCollection.cs
- EntityContainerRelationshipSetEnd.cs
- _Win32.cs
- RuleDefinitions.cs
- objectquery_tresulttype.cs
- DataGridViewButtonColumn.cs
- OptimizedTemplateContent.cs
- SafeTimerHandle.cs
- BasicAsyncResult.cs
- CookielessHelper.cs
- FontEditor.cs
- DocumentEventArgs.cs
- mediaclock.cs
- InputProcessorProfilesLoader.cs
- Type.cs
- CodeMemberEvent.cs
- TypeConverterAttribute.cs
- AttachmentService.cs
- BinaryObjectInfo.cs
- InputBinding.cs
- MatrixCamera.cs
- XsdBuilder.cs
- Command.cs
- PeerName.cs
- isolationinterop.cs
- ContextActivityUtils.cs
- ColumnWidthChangedEvent.cs
- CompilerLocalReference.cs
- Rectangle.cs
- ClientApiGenerator.cs
- InfoCardSymmetricCrypto.cs
- QueryAccessibilityHelpEvent.cs
- SchemaEntity.cs
- AnnotationElement.cs
- SqlDeflator.cs
- ConfigPathUtility.cs
- AssemblyAttributes.cs
- keycontainerpermission.cs
- ItemsPanelTemplate.cs
- MaskedTextBox.cs
- ServicePointManager.cs
- RangeBaseAutomationPeer.cs
- SynchronizedDispatch.cs
- ControlAdapter.cs
- PointF.cs
- BulletDecorator.cs
- ExceptionUtil.cs
- PointF.cs
- WindowsFont.cs
- BuildManagerHost.cs
- WindowInteropHelper.cs
- DataGridViewTopLeftHeaderCell.cs
- SystemWebSectionGroup.cs
- CallbackException.cs
- ExpressionBindingsDialog.cs
- COSERVERINFO.cs
- HandlerWithFactory.cs
- DrawingDrawingContext.cs
- TimelineClockCollection.cs
- ProfileManager.cs
- HttpUnhandledOperationInvoker.cs
- UdpTransportSettings.cs
- MethodCallExpression.cs
- AttributeSetAction.cs
- SqlResolver.cs
- EntityDataSourceView.cs
- MDIClient.cs
- SignedInfo.cs
- MruCache.cs
- HybridWebProxyFinder.cs
- TemplateBindingExpression.cs
- MD5.cs
- PriorityBindingExpression.cs
- MachineKeySection.cs
- SafeHandles.cs
- MembershipValidatePasswordEventArgs.cs
- TemplateKey.cs
- SafeFileMappingHandle.cs
- SchemaTypeEmitter.cs
- DataColumnMapping.cs
- OdbcConnectionOpen.cs
- RenderData.cs
- SchemaManager.cs
- PlanCompiler.cs
- HtmlSelect.cs
- HttpVersion.cs
- HttpCookie.cs
- AsymmetricSignatureFormatter.cs
- CheckBoxRenderer.cs
- CustomErrorsSection.cs
- BitmapEffectInput.cs
- UIElementParaClient.cs
- MobileControlBuilder.cs
- XmlCountingReader.cs
- HScrollBar.cs
- ConfigXmlAttribute.cs
- ShapeTypeface.cs
- HttpApplicationStateBase.cs
- TypeForwardedToAttribute.cs