Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Core / CSharp / System / Windows / Media / SafeMILHandle.cs / 1305600 / SafeMILHandle.cs
//---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // // Description: // A safe way to deal with unmanaged MIL interface pointers. //--------------------------------------------------------------------------- using System; using System.Security; 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 derives from a class that has a link demand and inheritance demand /// [SecurityCritical] internal SafeMILHandle(IntPtr handle) : base(true) { SetHandle(handle); } ////// 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 != null) { _gcPressure.Release(); } // // estimatedSize may be 0 for small images with fewer than 8 bits per pixel, // attempting to call GC.AddMemoryPressure with a pressure of 0 will cause it to // throw, so don't add memory pressure if estimatedSize is 0. // if (estimatedSize > 0) { _gcPressure = new SafeMILHandleMemoryPressure(estimatedSize); _gcPressure.AddRef(); } } internal void CopyMemoryPressure(SafeMILHandle original) { _gcPressure = original._gcPressure; if (_gcPressure != null) { _gcPressure.AddRef(); } } ////// 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); if (_gcPressure != null) { _gcPressure.Release(); _gcPressure = null; } return true; } // Estimated size of the unmanaged memory private SafeMILHandleMemoryPressure _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.Security; 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 derives from a class that has a link demand and inheritance demand /// [SecurityCritical] internal SafeMILHandle(IntPtr handle) : base(true) { SetHandle(handle); } ////// 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 != null) { _gcPressure.Release(); } // // estimatedSize may be 0 for small images with fewer than 8 bits per pixel, // attempting to call GC.AddMemoryPressure with a pressure of 0 will cause it to // throw, so don't add memory pressure if estimatedSize is 0. // if (estimatedSize > 0) { _gcPressure = new SafeMILHandleMemoryPressure(estimatedSize); _gcPressure.AddRef(); } } internal void CopyMemoryPressure(SafeMILHandle original) { _gcPressure = original._gcPressure; if (_gcPressure != null) { _gcPressure.AddRef(); } } ////// 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); if (_gcPressure != null) { _gcPressure.Release(); _gcPressure = null; } return true; } // Estimated size of the unmanaged memory private SafeMILHandleMemoryPressure _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
- Properties.cs
- ActivityStatusChangeEventArgs.cs
- PersonalizationProviderHelper.cs
- _CookieModule.cs
- UIElement3DAutomationPeer.cs
- SizeChangedEventArgs.cs
- DirectionalLight.cs
- LinearGradientBrush.cs
- Overlapped.cs
- DBConcurrencyException.cs
- XamlSerializationHelper.cs
- XmlSchemaAppInfo.cs
- CodeDomConfigurationHandler.cs
- BrushConverter.cs
- ConnectAlgorithms.cs
- FieldToken.cs
- DocobjHost.cs
- ProxyHwnd.cs
- ThemeableAttribute.cs
- RoleGroupCollectionEditor.cs
- AttributeData.cs
- RequestNavigateEventArgs.cs
- BlobPersonalizationState.cs
- DesignerCommandAdapter.cs
- EmbeddedMailObjectsCollection.cs
- QuotedPrintableStream.cs
- PolicyLevel.cs
- MessageEnumerator.cs
- TextElementEditingBehaviorAttribute.cs
- SqlBinder.cs
- DataControlField.cs
- XmlSchemaInfo.cs
- ServiceModelExtensionCollectionElement.cs
- Double.cs
- SafeThreadHandle.cs
- CallSiteHelpers.cs
- Int32AnimationUsingKeyFrames.cs
- BaseCodeDomTreeGenerator.cs
- DataGridViewCellStyleEditor.cs
- SelectorItemAutomationPeer.cs
- FixedStringLookup.cs
- Matrix.cs
- SqlEnums.cs
- RefreshPropertiesAttribute.cs
- PromptEventArgs.cs
- PageParserFilter.cs
- UserControlFileEditor.cs
- HtmlHead.cs
- FrameworkElementAutomationPeer.cs
- RuntimeResourceSet.cs
- DoubleLinkListEnumerator.cs
- BamlBinaryReader.cs
- SmtpTransport.cs
- InstanceDescriptor.cs
- EnumValidator.cs
- InputLanguageSource.cs
- ConfigXmlComment.cs
- PeerNameRecord.cs
- _IPv6Address.cs
- HitTestDrawingContextWalker.cs
- XmlTextAttribute.cs
- SecurityException.cs
- TryCatchDesigner.xaml.cs
- ObjectDataSourceFilteringEventArgs.cs
- BindingSource.cs
- AutoResetEvent.cs
- UDPClient.cs
- SqlUserDefinedTypeAttribute.cs
- DataRowCollection.cs
- GregorianCalendarHelper.cs
- ActivityTypeResolver.xaml.cs
- VerificationAttribute.cs
- InputReferenceExpression.cs
- RewritingValidator.cs
- FontStyles.cs
- UdpChannelListener.cs
- FormatControl.cs
- Main.cs
- CharAnimationUsingKeyFrames.cs
- HitTestWithGeometryDrawingContextWalker.cs
- WizardForm.cs
- EncoderNLS.cs
- MailMessageEventArgs.cs
- IISMapPath.cs
- PropertyChangedEventManager.cs
- WebBrowserSiteBase.cs
- UrlMappingsModule.cs
- XsltException.cs
- SpeechDetectedEventArgs.cs
- TcpHostedTransportConfiguration.cs
- ErrorHandler.cs
- SQLConvert.cs
- ListItemConverter.cs
- ReaderWriterLock.cs
- TreeNodeStyleCollection.cs
- LinkDescriptor.cs
- OrderedDictionary.cs
- SaveWorkflowAsyncResult.cs
- CompoundFileReference.cs
- WebEventCodes.cs