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
- CatalogPart.cs
- NameValuePermission.cs
- MethodBuilder.cs
- SaveFileDialog.cs
- EmptyEnumerator.cs
- ToolBarOverflowPanel.cs
- RecordConverter.cs
- propertytag.cs
- SystemBrushes.cs
- TraceHandlerErrorFormatter.cs
- RoleManagerModule.cs
- KnownTypeAttribute.cs
- SystemUnicastIPAddressInformation.cs
- CodeNamespaceImportCollection.cs
- HMACSHA256.cs
- ForwardPositionQuery.cs
- BitFlagsGenerator.cs
- Script.cs
- ToolboxService.cs
- WindowsGraphicsCacheManager.cs
- XmlArrayItemAttributes.cs
- MissingMemberException.cs
- SiteMapProvider.cs
- ControlBuilder.cs
- BuildProvider.cs
- Sql8ConformanceChecker.cs
- DirectionalLight.cs
- LabelExpression.cs
- FigureParaClient.cs
- XmlSchemaInfo.cs
- FixedStringLookup.cs
- Lazy.cs
- DateTimePicker.cs
- MessageSecurityProtocol.cs
- GridErrorDlg.cs
- IdentityVerifier.cs
- XmlRootAttribute.cs
- RangeValuePatternIdentifiers.cs
- WinFormsComponentEditor.cs
- ProvidersHelper.cs
- AuthenticationConfig.cs
- DuplicateWaitObjectException.cs
- TcpServerChannel.cs
- DelayedRegex.cs
- WindowsStatusBar.cs
- AssemblyHash.cs
- XmlTypeMapping.cs
- LineGeometry.cs
- LayoutTableCell.cs
- VoiceInfo.cs
- MissingFieldException.cs
- TableChangeProcessor.cs
- SegmentInfo.cs
- AutomationProperties.cs
- FramingFormat.cs
- SystemIcons.cs
- TemplateManager.cs
- ThreadPool.cs
- ExpandedProjectionNode.cs
- AutoResetEvent.cs
- XmlElementList.cs
- BamlRecordReader.cs
- ParameterDataSourceExpression.cs
- NegationPusher.cs
- GridSplitter.cs
- FastEncoderWindow.cs
- RecognitionResult.cs
- EventToken.cs
- ListViewInsertionMark.cs
- CompiledAction.cs
- ThemeDirectoryCompiler.cs
- MergeFailedEvent.cs
- MonitoringDescriptionAttribute.cs
- LocalFileSettingsProvider.cs
- CommonGetThemePartSize.cs
- SrgsDocumentParser.cs
- ScriptResourceAttribute.cs
- ExpressionStringBuilder.cs
- FileCodeGroup.cs
- log.cs
- WpfKnownMember.cs
- UriTemplateLiteralPathSegment.cs
- WebPartZone.cs
- XmlNodeChangedEventArgs.cs
- DataGridViewCheckBoxCell.cs
- HiddenField.cs
- MeasureData.cs
- CipherData.cs
- PeerService.cs
- VisualTreeUtils.cs
- SqlMultiplexer.cs
- CollectionCodeDomSerializer.cs
- PolyBezierSegmentFigureLogic.cs
- Menu.cs
- ISSmlParser.cs
- CqlGenerator.cs
- SourceItem.cs
- TreeNodeBindingCollection.cs
- SystemIcons.cs
- EntityProviderFactory.cs