mirror of https://github.com/raandree/NTFSSecurity
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
7.1 KiB
159 lines
7.1 KiB
/* Copyright (C) 2008-2016 Peter Palotas, Jeffrey Jangli, Alexandr Normuradov
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
*/
|
|
|
|
using Alphaleonis.Win32.Filesystem;
|
|
using System;
|
|
using System.ComponentModel;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using System.Globalization;
|
|
using System.IO;
|
|
using System.Runtime.InteropServices;
|
|
using System.Security.Policy;
|
|
|
|
namespace Alphaleonis.Win32
|
|
{
|
|
internal static class NativeError
|
|
{
|
|
internal static void ThrowException()
|
|
{
|
|
ThrowException((uint)Marshal.GetLastWin32Error(), null, null);
|
|
}
|
|
|
|
public static void ThrowException(int errorCode)
|
|
{
|
|
ThrowException((uint)errorCode, null, null);
|
|
}
|
|
|
|
public static void ThrowException(int errorCode, string readPath)
|
|
{
|
|
ThrowException((uint)errorCode, readPath, null);
|
|
}
|
|
|
|
public static void ThrowException(int errorCode, string readPath, string writePath)
|
|
{
|
|
ThrowException((uint)errorCode, readPath, writePath);
|
|
}
|
|
|
|
public static void ThrowException(uint errorCode, string readPath)
|
|
{
|
|
ThrowException(errorCode, readPath, null);
|
|
}
|
|
|
|
[SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
|
|
public static void ThrowException(uint errorCode, string readPath, string writePath)
|
|
{
|
|
string errorMessage = string.Format(CultureInfo.CurrentCulture, "({0}) {1}.", errorCode, new Win32Exception((int)errorCode).Message);
|
|
|
|
if (!Utils.IsNullOrWhiteSpace(readPath))
|
|
errorMessage = string.Format(CultureInfo.CurrentCulture, "{0}: [{1}]", errorMessage.TrimEnd('.'), readPath);
|
|
|
|
if (!Utils.IsNullOrWhiteSpace(writePath))
|
|
errorMessage = string.Format(CultureInfo.CurrentCulture, "{0}: [{1}]", errorMessage.TrimEnd('.'), writePath);
|
|
|
|
switch (errorCode)
|
|
{
|
|
case Win32Errors.ERROR_INVALID_DRIVE:
|
|
throw new DriveNotFoundException(errorMessage);
|
|
|
|
case Win32Errors.ERROR_OPERATION_ABORTED:
|
|
throw new OperationCanceledException(errorMessage);
|
|
|
|
case Win32Errors.ERROR_FILE_NOT_FOUND:
|
|
throw new FileNotFoundException(errorMessage);
|
|
|
|
case Win32Errors.ERROR_PATH_NOT_FOUND:
|
|
throw new DirectoryNotFoundException(errorMessage);
|
|
|
|
case Win32Errors.ERROR_BAD_RECOVERY_POLICY:
|
|
throw new PolicyException(errorMessage);
|
|
|
|
case Win32Errors.ERROR_FILE_READ_ONLY:
|
|
case Win32Errors.ERROR_ACCESS_DENIED:
|
|
case Win32Errors.ERROR_NETWORK_ACCESS_DENIED:
|
|
throw new UnauthorizedAccessException(errorMessage);
|
|
|
|
case Win32Errors.ERROR_ALREADY_EXISTS:
|
|
case Win32Errors.ERROR_FILE_EXISTS:
|
|
throw new AlreadyExistsException(errorMessage);
|
|
|
|
case Win32Errors.ERROR_DIR_NOT_EMPTY:
|
|
throw new DirectoryNotEmptyException(errorMessage);
|
|
|
|
case Win32Errors.ERROR_NOT_READY:
|
|
throw new DeviceNotReadyException(errorMessage);
|
|
|
|
|
|
#region Transactional
|
|
|
|
case Win32Errors.ERROR_INVALID_TRANSACTION:
|
|
throw new InvalidTransactionException(Resources.Transaction_Invalid, Marshal.GetExceptionForHR(Win32Errors.GetHrFromWin32Error(errorCode)));
|
|
|
|
case Win32Errors.ERROR_TRANSACTION_ALREADY_COMMITTED:
|
|
throw new TransactionAlreadyCommittedException(Resources.Transaction_Already_Committed, Marshal.GetExceptionForHR(Win32Errors.GetHrFromWin32Error(errorCode)));
|
|
|
|
case Win32Errors.ERROR_TRANSACTION_ALREADY_ABORTED:
|
|
throw new TransactionAlreadyAbortedException(Resources.Transaction_Already_Aborted, Marshal.GetExceptionForHR(Win32Errors.GetHrFromWin32Error(errorCode)));
|
|
|
|
case Win32Errors.ERROR_TRANSACTIONAL_CONFLICT:
|
|
throw new TransactionalConflictException(Resources.Transactional_Conflict, Marshal.GetExceptionForHR(Win32Errors.GetHrFromWin32Error(errorCode)));
|
|
|
|
case Win32Errors.ERROR_TRANSACTION_NOT_ACTIVE:
|
|
throw new TransactionException(Resources.Transaction_Not_Active, Marshal.GetExceptionForHR(Win32Errors.GetHrFromWin32Error(errorCode)));
|
|
|
|
case Win32Errors.ERROR_TRANSACTION_NOT_REQUESTED:
|
|
throw new TransactionException(Resources.Transaction_Not_Requested, Marshal.GetExceptionForHR(Win32Errors.GetHrFromWin32Error(errorCode)));
|
|
|
|
case Win32Errors.ERROR_TRANSACTION_REQUEST_NOT_VALID:
|
|
throw new TransactionException(Resources.Invalid_Transaction_Request, Marshal.GetExceptionForHR(Win32Errors.GetHrFromWin32Error(errorCode)));
|
|
|
|
case Win32Errors.ERROR_TRANSACTIONS_UNSUPPORTED_REMOTE:
|
|
throw new UnsupportedRemoteTransactionException(Resources.Invalid_Transaction_Request, Marshal.GetExceptionForHR(Win32Errors.GetHrFromWin32Error(errorCode)));
|
|
|
|
case Win32Errors.ERROR_NOT_A_REPARSE_POINT:
|
|
throw new NotAReparsePointException(Resources.Not_A_Reparse_Point, Marshal.GetExceptionForHR(Win32Errors.GetHrFromWin32Error(errorCode)));
|
|
|
|
#endregion // Transacted
|
|
|
|
case Win32Errors.ERROR_SUCCESS:
|
|
case Win32Errors.ERROR_SUCCESS_REBOOT_INITIATED:
|
|
case Win32Errors.ERROR_SUCCESS_REBOOT_REQUIRED:
|
|
case Win32Errors.ERROR_SUCCESS_RESTART_REQUIRED:
|
|
// We should really never get here, throwing an exception for a successful operation.
|
|
throw new NotImplementedException(string.Format(CultureInfo.CurrentCulture, "{0} {1}", Resources.Exception_From_Successful_Operation, errorMessage));
|
|
|
|
default:
|
|
// We don't have a specific exception to generate for this error.
|
|
throw new IOException(errorMessage, Win32Errors.GetHrFromWin32Error(errorCode));
|
|
}
|
|
}
|
|
|
|
|
|
public static void ThrowException(string readPath)
|
|
{
|
|
ThrowException((uint)Marshal.GetLastWin32Error(), readPath, null);
|
|
}
|
|
|
|
public static void ThrowException(string readPath, string writePath)
|
|
{
|
|
ThrowException((uint)Marshal.GetLastWin32Error(), readPath, writePath);
|
|
}
|
|
}
|
|
}
|
|
|