// Copyright (c) Microsoft Open Technologies, Inc. // All Rights Reserved // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING // WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF // TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR // NON-INFRINGEMENT. // See the Apache 2 License for the specific language governing // permissions and limitations under the License. //------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //------------------------------------------------------------------------------ #if DNXCORE50 using System.Runtime.InteropServices; using System.Text; namespace System.ComponentModel { internal class Win32Exception : ExternalException { /// /// Represents the Win32 error code associated with this exception. This /// field is read-only. /// private readonly int nativeErrorCode; /// /// Initializes a new instance of the class with the last Win32 error /// that occured. /// public Win32Exception() : this(Marshal.GetLastWin32Error()) { } /// /// Initializes a new instance of the class with the specified error. /// public Win32Exception(int error) : this(error, GetErrorMessage(error)) { } /// /// Initializes a new instance of the class with the specified error and the /// specified detailed description. /// public Win32Exception(int error, string message) : base(message) { nativeErrorCode = error; } /// /// Initializes a new instance of the Exception class with a specified error message. /// FxCop CA1032: Multiple constructors are required to correctly implement a custom exception. /// public Win32Exception(string message) : this(Marshal.GetLastWin32Error(), message) { } /// /// Initializes a new instance of the Exception class with a specified error message and a /// reference to the inner exception that is the cause of this exception. /// FxCop CA1032: Multiple constructors are required to correctly implement a custom exception. /// public Win32Exception(string message, Exception innerException) : base(message, innerException) { nativeErrorCode = Marshal.GetLastWin32Error(); } /// /// Represents the Win32 error code associated with this exception. This /// field is read-only. /// public int NativeErrorCode { get { return nativeErrorCode; } } private static string GetErrorMessage(int error) { //get the system error message... string errorMsg = ""; StringBuilder sb = new StringBuilder(256); int result = SafeNativeMethods.FormatMessage( SafeNativeMethods.FORMAT_MESSAGE_IGNORE_INSERTS | SafeNativeMethods.FORMAT_MESSAGE_FROM_SYSTEM | SafeNativeMethods.FORMAT_MESSAGE_ARGUMENT_ARRAY, IntPtr.Zero, (uint)error, 0, sb, sb.Capacity + 1, null); if (result != 0) { int i = sb.Length; while (i > 0) { char ch = sb[i - 1]; if (ch > 32 && ch != '.') break; i--; } errorMsg = sb.ToString(0, i); } else { errorMsg = "Unknown error (0x" + Convert.ToString(error, 16) + ")"; } return errorMsg; } } } #endif