Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / SystemNet / Net / PeerToPeer / PeerToPeerException.cs / 1305376 / PeerToPeerException.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Net.PeerToPeer { using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Threading; using System.Runtime.Serialization; using System.Security.Permissions; ////// The PeerToPeerException class encpasulates the exceptions for /// PeerToPeer classes. /// NOTE: /// This class is marked serializable but does not implement /// ISerializable interface. There are no private/public properties /// we keep track across the serialization. The base class message /// and inner exceptions are used. /// [Serializable] public class PeerToPeerException : Exception, ISerializable { private const UInt32 FACILITY_P2P = 99; public PeerToPeerException() { } ////// Construtor /// /// public PeerToPeerException(string message) : base(message) { } ////// Constructor /// /// /// public PeerToPeerException(string message, Exception innerException) : base(message, innerException) { } ////// HRESULT Structure /// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 /// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 /// +---+-+-+-----------------------+-------------------------------+ /// |Sev|C|R| Facility | Code | /// +---+-+-+-----------------------+-------------------------------+ /// /// The intent here is that when we get a HRESULT from a P2P.dll, /// we need to get the message from the P2p.dll resource table. /// If the HRESULT is something like E_INVALIDARG, we need to get the /// message from the SYSTEM table. /// Apart from the native exception message, we would like to provide /// a friendly message to explain the context under which the exception /// occurred from managed code developers. /// So we first try to get the message from the P2P.dll if the HRESULT /// comes with a facility ID for P2P. Otherwise we get the exception message from /// system. We then construct a Win32Exception and set this as an inner exception /// /// If in case we can't get the message from either system or P2p, then /// we try the Marshal class and throw a exception from the HRESULT /// /// If all else fails we simply throw an exception with no inner /// exception but still give the HRESULT /// /// A note that we are getting the handle for P2p.dll from the LoadLibrary /// we originally did for checking if P2P.dll is present on the system. /// Since we are getting the underlying handle, there is a possibility that /// the Library is freed [AppDomain shutdown] and we are trying to /// use the handle. The code is in a try catch block here so that /// we catch these situations and still recover. /// /// The error message that we would like to set as the message for the exception/// /// The error code ///a PeerToPeerException //// [System.Security.SecurityCritical] internal static PeerToPeerException CreateFromHr(string message, Int32 hr) { PeerToPeerException p2pEx = null; int facility = ((hr >> 16) & 0x1FFF); IntPtr NativeMessagePtr = IntPtr.Zero; try { UInt32 dwLength = UnsafeSystemNativeMethods.FormatMessage( FormatMessageFlags.FORMAT_MESSAGE_ALLOCATE_BUFFER | FormatMessageFlags.FORMAT_MESSAGE_ARGUMENT_ARRAY | (facility == FACILITY_P2P ? FormatMessageFlags.FORMAT_MESSAGE_FROM_HMODULE : FormatMessageFlags.FORMAT_MESSAGE_FROM_SYSTEM), (facility == FACILITY_P2P ? PeerToPeerOSHelper.P2PModuleHandle : IntPtr.Zero), (uint)(hr), 0, ref NativeMessagePtr, 0, IntPtr.Zero); if (dwLength != 0) { string NativeMessage = Marshal.PtrToStringUni(NativeMessagePtr); p2pEx = new PeerToPeerException(message, new Win32Exception(hr, NativeMessage)); } else { p2pEx = new PeerToPeerException(message, Marshal.GetExceptionForHR(hr)); } } catch(Exception ex) { Logging.P2PTraceSource.TraceEvent(TraceEventType.Warning, 0, "Could not get the error message for error code {0} - Exception {1}", hr, ex); if (ex is ThreadAbortException || ex is StackOverflowException || ex is OutOfMemoryException) { throw; } } finally { if (NativeMessagePtr != IntPtr.Zero) { UnsafeSystemNativeMethods.LocalFree(NativeMessagePtr); } } if (p2pEx == null) { Logging.P2PTraceSource.TraceEvent(TraceEventType.Warning, 0, "Could not get the error message for error code {0}", hr); p2pEx = new PeerToPeerException(message + "Underlying native error " + hr); } Logging.P2PTraceSource.TraceEvent(TraceEventType.Error, 0, "Exception: {0}", p2pEx); return p2pEx; } protected PeerToPeerException(SerializationInfo info, StreamingContext context) : base (info, context) {} //// // // // // // // [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase", Justification = "System.Net.dll is still using pre-v4 security model and needs this demand")] [System.Security.SecurityCritical] [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)] void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { GetObjectData(info, context); } //// // [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase", Justification = "System.Net.dll is still using pre-v4 security model and needs this demand")] [System.Security.SecurityCritical] [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)] public override void GetObjectData(SerializationInfo info, StreamingContext context) { base.GetObjectData(info, context); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// // Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Net.PeerToPeer { using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Threading; using System.Runtime.Serialization; using System.Security.Permissions; ////// The PeerToPeerException class encpasulates the exceptions for /// PeerToPeer classes. /// NOTE: /// This class is marked serializable but does not implement /// ISerializable interface. There are no private/public properties /// we keep track across the serialization. The base class message /// and inner exceptions are used. /// [Serializable] public class PeerToPeerException : Exception, ISerializable { private const UInt32 FACILITY_P2P = 99; public PeerToPeerException() { } ////// Construtor /// /// public PeerToPeerException(string message) : base(message) { } ////// Constructor /// /// /// public PeerToPeerException(string message, Exception innerException) : base(message, innerException) { } ////// HRESULT Structure /// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 /// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 /// +---+-+-+-----------------------+-------------------------------+ /// |Sev|C|R| Facility | Code | /// +---+-+-+-----------------------+-------------------------------+ /// /// The intent here is that when we get a HRESULT from a P2P.dll, /// we need to get the message from the P2p.dll resource table. /// If the HRESULT is something like E_INVALIDARG, we need to get the /// message from the SYSTEM table. /// Apart from the native exception message, we would like to provide /// a friendly message to explain the context under which the exception /// occurred from managed code developers. /// So we first try to get the message from the P2P.dll if the HRESULT /// comes with a facility ID for P2P. Otherwise we get the exception message from /// system. We then construct a Win32Exception and set this as an inner exception /// /// If in case we can't get the message from either system or P2p, then /// we try the Marshal class and throw a exception from the HRESULT /// /// If all else fails we simply throw an exception with no inner /// exception but still give the HRESULT /// /// A note that we are getting the handle for P2p.dll from the LoadLibrary /// we originally did for checking if P2P.dll is present on the system. /// Since we are getting the underlying handle, there is a possibility that /// the Library is freed [AppDomain shutdown] and we are trying to /// use the handle. The code is in a try catch block here so that /// we catch these situations and still recover. /// /// The error message that we would like to set as the message for the exception/// /// The error code ///a PeerToPeerException //// [System.Security.SecurityCritical] internal static PeerToPeerException CreateFromHr(string message, Int32 hr) { PeerToPeerException p2pEx = null; int facility = ((hr >> 16) & 0x1FFF); IntPtr NativeMessagePtr = IntPtr.Zero; try { UInt32 dwLength = UnsafeSystemNativeMethods.FormatMessage( FormatMessageFlags.FORMAT_MESSAGE_ALLOCATE_BUFFER | FormatMessageFlags.FORMAT_MESSAGE_ARGUMENT_ARRAY | (facility == FACILITY_P2P ? FormatMessageFlags.FORMAT_MESSAGE_FROM_HMODULE : FormatMessageFlags.FORMAT_MESSAGE_FROM_SYSTEM), (facility == FACILITY_P2P ? PeerToPeerOSHelper.P2PModuleHandle : IntPtr.Zero), (uint)(hr), 0, ref NativeMessagePtr, 0, IntPtr.Zero); if (dwLength != 0) { string NativeMessage = Marshal.PtrToStringUni(NativeMessagePtr); p2pEx = new PeerToPeerException(message, new Win32Exception(hr, NativeMessage)); } else { p2pEx = new PeerToPeerException(message, Marshal.GetExceptionForHR(hr)); } } catch(Exception ex) { Logging.P2PTraceSource.TraceEvent(TraceEventType.Warning, 0, "Could not get the error message for error code {0} - Exception {1}", hr, ex); if (ex is ThreadAbortException || ex is StackOverflowException || ex is OutOfMemoryException) { throw; } } finally { if (NativeMessagePtr != IntPtr.Zero) { UnsafeSystemNativeMethods.LocalFree(NativeMessagePtr); } } if (p2pEx == null) { Logging.P2PTraceSource.TraceEvent(TraceEventType.Warning, 0, "Could not get the error message for error code {0}", hr); p2pEx = new PeerToPeerException(message + "Underlying native error " + hr); } Logging.P2PTraceSource.TraceEvent(TraceEventType.Error, 0, "Exception: {0}", p2pEx); return p2pEx; } protected PeerToPeerException(SerializationInfo info, StreamingContext context) : base (info, context) {} //// // // // // // // [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase", Justification = "System.Net.dll is still using pre-v4 security model and needs this demand")] [System.Security.SecurityCritical] [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)] void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { GetObjectData(info, context); } //// // [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase", Justification = "System.Net.dll is still using pre-v4 security model and needs this demand")] [System.Security.SecurityCritical] [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)] public override void GetObjectData(SerializationInfo info, StreamingContext context) { base.GetObjectData(info, context); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.//
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- StrokeNode.cs
- DebuggerAttributes.cs
- TcpAppDomainProtocolHandler.cs
- SqlConnectionPoolProviderInfo.cs
- CompatibleComparer.cs
- ConstructorBuilder.cs
- XmlStreamStore.cs
- TableLayoutSettingsTypeConverter.cs
- AbsoluteQuery.cs
- WindowsListBox.cs
- UserNamePasswordServiceCredential.cs
- FormatConvertedBitmap.cs
- DataGridViewColumnConverter.cs
- COM2PropertyBuilderUITypeEditor.cs
- Region.cs
- SecurityUniqueId.cs
- IPCCacheManager.cs
- PageContentCollection.cs
- AutomationElement.cs
- OleDbReferenceCollection.cs
- TrustLevel.cs
- SerializerProvider.cs
- InputScopeNameConverter.cs
- SystemFonts.cs
- ClientRoleProvider.cs
- XmlUTF8TextWriter.cs
- MessageQueue.cs
- FindCriteriaCD1.cs
- OpCopier.cs
- MetadataCacheItem.cs
- XmlHierarchicalEnumerable.cs
- OciHandle.cs
- FigureParaClient.cs
- ComboBox.cs
- ScrollItemProviderWrapper.cs
- TextLineBreak.cs
- TryExpression.cs
- HyperLinkField.cs
- AutomationAttributeInfo.cs
- QilNode.cs
- LookupNode.cs
- ViewCellRelation.cs
- FontSizeConverter.cs
- ClientRuntimeConfig.cs
- PathHelper.cs
- KeyConstraint.cs
- CommandValueSerializer.cs
- FieldAccessException.cs
- IPAddressCollection.cs
- TaskSchedulerException.cs
- WebPartZone.cs
- PersistChildrenAttribute.cs
- WebPartConnectionCollection.cs
- HttpMethodConstraint.cs
- PartialCachingControl.cs
- ModelPerspective.cs
- DataObject.cs
- UnitControl.cs
- ToolStripLocationCancelEventArgs.cs
- ZipIOExtraFieldPaddingElement.cs
- DataGridViewButtonCell.cs
- SqlServices.cs
- RootNamespaceAttribute.cs
- GZipDecoder.cs
- IdnElement.cs
- Graphics.cs
- ReadOnlyCollection.cs
- PointIndependentAnimationStorage.cs
- CqlLexerHelpers.cs
- ExtensionQuery.cs
- AuthenticationModulesSection.cs
- Tablet.cs
- BitmapEffectInputData.cs
- StrongNamePublicKeyBlob.cs
- GridEntryCollection.cs
- WmlPageAdapter.cs
- __Filters.cs
- Char.cs
- MessageHeaders.cs
- ControlValuePropertyAttribute.cs
- TextServicesPropertyRanges.cs
- SelectionProcessor.cs
- _Rfc2616CacheValidators.cs
- RemoteWebConfigurationHost.cs
- Error.cs
- InstanceDataCollectionCollection.cs
- DataListItem.cs
- SqlCachedBuffer.cs
- SoapAttributeAttribute.cs
- DataGridPreparingCellForEditEventArgs.cs
- Currency.cs
- _NTAuthentication.cs
- OrderedDictionaryStateHelper.cs
- XmlSerializationGeneratedCode.cs
- PtsContext.cs
- CodeTypeReference.cs
- JsonWriterDelegator.cs
- DbParameterHelper.cs
- EventMappingSettingsCollection.cs
- Cursors.cs