mirror of
https://github.com/TalAloni/SMBLibrary.git
synced 2025-08-12 10:19:18 +02:00
NTFileSystemAdapter: Do not handle unexpected IFileSystem exceptions
This commit is contained in:
parent
6cab13c1c9
commit
86afb5af33
4 changed files with 173 additions and 58 deletions
|
@ -23,12 +23,19 @@ namespace SMBLibrary
|
||||||
entry = m_fileSystem.GetEntry(path);
|
entry = m_fileSystem.GetEntry(path);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is IOException || ex is UnauthorizedAccessException)
|
||||||
{
|
{
|
||||||
NTStatus status = ToNTStatus(ex);
|
NTStatus status = ToNTStatus(ex);
|
||||||
Log(Severity.Verbose, "GetFileInformation on '{0}' failed. {1}", path, status);
|
Log(Severity.Verbose, "GetFileInformation on '{0}' failed. {1}", path, status);
|
||||||
result = null;
|
result = null;
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch (informationClass)
|
switch (informationClass)
|
||||||
{
|
{
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Text;
|
using System.IO;
|
||||||
using Utilities;
|
using Utilities;
|
||||||
|
|
||||||
namespace SMBLibrary
|
namespace SMBLibrary
|
||||||
|
@ -65,11 +65,18 @@ namespace SMBLibrary
|
||||||
entry = m_fileSystem.GetEntry(path + fileName);
|
entry = m_fileSystem.GetEntry(path + fileName);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is IOException || ex is UnauthorizedAccessException)
|
||||||
{
|
{
|
||||||
NTStatus status = ToNTStatus(ex);
|
NTStatus status = ToNTStatus(ex);
|
||||||
Log(Severity.Verbose, "QueryDirectory: Error querying '{0}'. {1}.", path, status);
|
Log(Severity.Verbose, "QueryDirectory: Error querying '{0}'. {1}.", path, status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
entries = new List<FileSystemEntry>();
|
entries = new List<FileSystemEntry>();
|
||||||
entries.Add(entry);
|
entries.Add(entry);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,22 +27,36 @@ namespace SMBLibrary
|
||||||
m_fileSystem.SetAttributes(fileHandle.Path, isHidden, isReadonly, isArchived);
|
m_fileSystem.SetAttributes(fileHandle.Path, isHidden, isReadonly, isArchived);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is IOException || ex is UnauthorizedAccessException)
|
||||||
{
|
{
|
||||||
NTStatus status = ToNTStatus(ex);
|
NTStatus status = ToNTStatus(ex);
|
||||||
Log(Severity.Verbose, "SetFileInformation: Failed to set file attributes on '{0}'. {1}.", fileHandle.Path, status);
|
Log(Severity.Verbose, "SetFileInformation: Failed to set file attributes on '{0}'. {1}.", fileHandle.Path, status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
m_fileSystem.SetDates(fileHandle.Path, basicInformation.CreationTime, basicInformation.LastWriteTime, basicInformation.LastAccessTime);
|
m_fileSystem.SetDates(fileHandle.Path, basicInformation.CreationTime, basicInformation.LastWriteTime, basicInformation.LastAccessTime);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is IOException || ex is UnauthorizedAccessException)
|
||||||
{
|
{
|
||||||
NTStatus status = ToNTStatus(ex);
|
NTStatus status = ToNTStatus(ex);
|
||||||
Log(Severity.Verbose, "SetFileInformation: Failed to set file dates on '{0}'. {1}.", fileHandle.Path, status);
|
Log(Severity.Verbose, "SetFileInformation: Failed to set file dates on '{0}'. {1}.", fileHandle.Path, status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
return NTStatus.STATUS_SUCCESS;
|
return NTStatus.STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
else if (information is FileRenameInformationType2)
|
else if (information is FileRenameInformationType2)
|
||||||
|
@ -70,11 +84,18 @@ namespace SMBLibrary
|
||||||
Log(Severity.Information, "SetFileInformation: Renamed '{0}' to '{1}'", fileHandle.Path, newFileName);
|
Log(Severity.Information, "SetFileInformation: Renamed '{0}' to '{1}'", fileHandle.Path, newFileName);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is IOException || ex is UnauthorizedAccessException)
|
||||||
{
|
{
|
||||||
NTStatus status = ToNTStatus(ex);
|
NTStatus status = ToNTStatus(ex);
|
||||||
Log(Severity.Verbose, "SetFileInformation: Cannot rename '{0}' to '{1}'. {2}.", fileHandle.Path, newFileName, status);
|
Log(Severity.Verbose, "SetFileInformation: Cannot rename '{0}' to '{1}'. {2}.", fileHandle.Path, newFileName, status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
fileHandle.Path = newFileName;
|
fileHandle.Path = newFileName;
|
||||||
return NTStatus.STATUS_SUCCESS;
|
return NTStatus.STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -94,11 +115,18 @@ namespace SMBLibrary
|
||||||
Log(Severity.Information, "SetFileInformation: Deleted '{0}'", fileHandle.Path);
|
Log(Severity.Information, "SetFileInformation: Deleted '{0}'", fileHandle.Path);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is IOException || ex is UnauthorizedAccessException)
|
||||||
{
|
{
|
||||||
NTStatus status = ToNTStatus(ex);
|
NTStatus status = ToNTStatus(ex);
|
||||||
Log(Severity.Information, "SetFileInformation: Error deleting '{0}'. {1}.", fileHandle.Path, status);
|
Log(Severity.Information, "SetFileInformation: Error deleting '{0}'. {1}.", fileHandle.Path, status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return NTStatus.STATUS_SUCCESS;
|
return NTStatus.STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -110,11 +138,18 @@ namespace SMBLibrary
|
||||||
fileHandle.Stream.SetLength(allocationSize);
|
fileHandle.Stream.SetLength(allocationSize);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is IOException || ex is UnauthorizedAccessException)
|
||||||
{
|
{
|
||||||
NTStatus status = ToNTStatus(ex);
|
NTStatus status = ToNTStatus(ex);
|
||||||
Log(Severity.Verbose, "SetFileInformation: Cannot set allocation for '{0}'. {1}.", fileHandle.Path, status);
|
Log(Severity.Verbose, "SetFileInformation: Cannot set allocation for '{0}'. {1}.", fileHandle.Path, status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
return NTStatus.STATUS_SUCCESS;
|
return NTStatus.STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
else if (information is FileEndOfFileInformation)
|
else if (information is FileEndOfFileInformation)
|
||||||
|
@ -125,11 +160,18 @@ namespace SMBLibrary
|
||||||
fileHandle.Stream.SetLength(endOfFile);
|
fileHandle.Stream.SetLength(endOfFile);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is IOException || ex is UnauthorizedAccessException)
|
||||||
{
|
{
|
||||||
NTStatus status = ToNTStatus(ex);
|
NTStatus status = ToNTStatus(ex);
|
||||||
Log(Severity.Verbose, "SetFileInformation: Cannot set end of file for '{0}'. {1}.", fileHandle.Path, status);
|
Log(Severity.Verbose, "SetFileInformation: Cannot set end of file for '{0}'. {1}.", fileHandle.Path, status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
return NTStatus.STATUS_SUCCESS;
|
return NTStatus.STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -62,11 +62,18 @@ namespace SMBLibrary
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is IOException || ex is UnauthorizedAccessException)
|
||||||
{
|
{
|
||||||
NTStatus status = ToNTStatus(ex);
|
NTStatus status = ToNTStatus(ex);
|
||||||
Log(Severity.Verbose, "CreateFile: Error retrieving '{0}'. {1}.", path, status);
|
Log(Severity.Verbose, "CreateFile: Error retrieving '{0}'. {1}.", path, status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (createDisposition == CreateDisposition.FILE_OPEN)
|
if (createDisposition == CreateDisposition.FILE_OPEN)
|
||||||
{
|
{
|
||||||
|
@ -115,11 +122,18 @@ namespace SMBLibrary
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is IOException || ex is UnauthorizedAccessException)
|
||||||
{
|
{
|
||||||
NTStatus status = ToNTStatus(ex);
|
NTStatus status = ToNTStatus(ex);
|
||||||
Log(Severity.Verbose, "CreateFile: Error creating '{0}'. {1}.", path, status);
|
Log(Severity.Verbose, "CreateFile: Error creating '{0}'. {1}.", path, status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
fileStatus = FileStatus.FILE_CREATED;
|
fileStatus = FileStatus.FILE_CREATED;
|
||||||
}
|
}
|
||||||
else if (createDisposition == CreateDisposition.FILE_OPEN_IF ||
|
else if (createDisposition == CreateDisposition.FILE_OPEN_IF ||
|
||||||
|
@ -153,11 +167,18 @@ namespace SMBLibrary
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is IOException || ex is UnauthorizedAccessException)
|
||||||
{
|
{
|
||||||
NTStatus status = ToNTStatus(ex);
|
NTStatus status = ToNTStatus(ex);
|
||||||
Log(Severity.Verbose, "CreateFile: Error creating '{0}'. {1}.", path, status);
|
Log(Severity.Verbose, "CreateFile: Error creating '{0}'. {1}.", path, status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
fileStatus = FileStatus.FILE_CREATED;
|
fileStatus = FileStatus.FILE_CREATED;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -192,11 +213,18 @@ namespace SMBLibrary
|
||||||
temp.Close();
|
temp.Close();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is IOException || ex is UnauthorizedAccessException)
|
||||||
{
|
{
|
||||||
NTStatus status = ToNTStatus(ex);
|
NTStatus status = ToNTStatus(ex);
|
||||||
Log(Severity.Verbose, "CreateFile: Error truncating '{0}'. {1}.", path, status);
|
Log(Severity.Verbose, "CreateFile: Error truncating '{0}'. {1}.", path, status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
fileStatus = FileStatus.FILE_OVERWRITTEN;
|
fileStatus = FileStatus.FILE_OVERWRITTEN;
|
||||||
}
|
}
|
||||||
else if (createDisposition == CreateDisposition.FILE_SUPERSEDE)
|
else if (createDisposition == CreateDisposition.FILE_SUPERSEDE)
|
||||||
|
@ -207,11 +235,18 @@ namespace SMBLibrary
|
||||||
m_fileSystem.Delete(path);
|
m_fileSystem.Delete(path);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is IOException || ex is UnauthorizedAccessException)
|
||||||
{
|
{
|
||||||
NTStatus status = ToNTStatus(ex);
|
NTStatus status = ToNTStatus(ex);
|
||||||
Log(Severity.Verbose, "CreateFile: Error deleting '{0}'. {1}.", path, status);
|
Log(Severity.Verbose, "CreateFile: Error deleting '{0}'. {1}.", path, status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -227,11 +262,18 @@ namespace SMBLibrary
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is IOException || ex is UnauthorizedAccessException)
|
||||||
{
|
{
|
||||||
NTStatus status = ToNTStatus(ex);
|
NTStatus status = ToNTStatus(ex);
|
||||||
Log(Severity.Verbose, "CreateFile: Error creating '{0}'. {1}.", path, status);
|
Log(Severity.Verbose, "CreateFile: Error creating '{0}'. {1}.", path, status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
fileStatus = FileStatus.FILE_SUPERSEDED;
|
fileStatus = FileStatus.FILE_SUPERSEDED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -281,11 +323,18 @@ namespace SMBLibrary
|
||||||
stream = m_fileSystem.OpenFile(path, FileMode.Open, fileAccess, fileShare, fileOptions);
|
stream = m_fileSystem.OpenFile(path, FileMode.Open, fileAccess, fileShare, fileOptions);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is IOException || ex is UnauthorizedAccessException)
|
||||||
{
|
{
|
||||||
NTStatus status = ToNTStatus(ex);
|
NTStatus status = ToNTStatus(ex);
|
||||||
Log(Severity.Verbose, "OpenFile: Cannot open '{0}', Access={1}, Share={2}. NTStatus: {3}.", path, fileAccess, fileShareString, status);
|
Log(Severity.Verbose, "OpenFile: Cannot open '{0}', Access={1}, Share={2}. NTStatus: {3}.", path, fileAccess, fileShareString, status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Log(Severity.Information, "OpenFileStream: Opened '{0}', Access={1}, Share={2}, FileOptions={3}", path, fileAccess, fileShareString, fileOptionsString);
|
Log(Severity.Information, "OpenFileStream: Opened '{0}', Access={1}, Share={2}, FileOptions={3}", path, fileAccess, fileShareString, fileOptionsString);
|
||||||
return NTStatus.STATUS_SUCCESS;
|
return NTStatus.STATUS_SUCCESS;
|
||||||
|
@ -337,11 +386,18 @@ namespace SMBLibrary
|
||||||
bytesRead = stream.Read(data, 0, maxCount);
|
bytesRead = stream.Read(data, 0, maxCount);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is IOException || ex is UnauthorizedAccessException)
|
||||||
{
|
{
|
||||||
NTStatus status = ToNTStatus(ex);
|
NTStatus status = ToNTStatus(ex);
|
||||||
Log(Severity.Verbose, "ReadFile: Cannot read '{0}'. {1}.", path, status);
|
Log(Severity.Verbose, "ReadFile: Cannot read '{0}'. {1}.", path, status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (bytesRead < maxCount)
|
if (bytesRead < maxCount)
|
||||||
{
|
{
|
||||||
|
@ -369,11 +425,18 @@ namespace SMBLibrary
|
||||||
stream.Write(data, 0, data.Length);
|
stream.Write(data, 0, data.Length);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is IOException || ex is UnauthorizedAccessException)
|
||||||
{
|
{
|
||||||
NTStatus status = ToNTStatus(ex);
|
NTStatus status = ToNTStatus(ex);
|
||||||
Log(Severity.Verbose, "WriteFile: Cannot write '{0}'. {1}.", path, status);
|
Log(Severity.Verbose, "WriteFile: Cannot write '{0}'. {1}.", path, status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
numberOfBytesWritten = data.Length;
|
numberOfBytesWritten = data.Length;
|
||||||
return NTStatus.STATUS_SUCCESS;
|
return NTStatus.STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -444,11 +507,7 @@ namespace SMBLibrary
|
||||||
/// <param name="exception">IFileSystem exception</param>
|
/// <param name="exception">IFileSystem exception</param>
|
||||||
private static NTStatus ToNTStatus(Exception exception)
|
private static NTStatus ToNTStatus(Exception exception)
|
||||||
{
|
{
|
||||||
if (exception is ArgumentException)
|
if (exception is DirectoryNotFoundException)
|
||||||
{
|
|
||||||
return NTStatus.STATUS_OBJECT_PATH_SYNTAX_BAD;
|
|
||||||
}
|
|
||||||
else if (exception is DirectoryNotFoundException)
|
|
||||||
{
|
{
|
||||||
return NTStatus.STATUS_OBJECT_PATH_NOT_FOUND;
|
return NTStatus.STATUS_OBJECT_PATH_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue