NTFileSystemHelper: Improved ToFileAccess and ToFileShare implementations

This commit is contained in:
Tal Aloni 2017-02-09 14:08:21 +02:00
parent f1965ec7ca
commit f9ad9f9b5e

View file

@ -217,55 +217,6 @@ namespace SMBLibrary.Server
return NTStatus.STATUS_SUCCESS;
}
public static FileAccess ToFileAccess(FileAccessMask desiredAccess)
{
if ((desiredAccess & FileAccessMask.GENERIC_ALL) > 0 ||
(desiredAccess & FileAccessMask.MAXIMUM_ALLOWED) > 0 ||
((desiredAccess & FileAccessMask.FILE_READ_DATA) > 0 && (desiredAccess & FileAccessMask.FILE_WRITE_DATA) > 0) ||
((desiredAccess & FileAccessMask.FILE_READ_DATA) > 0 && (desiredAccess & FileAccessMask.FILE_APPEND_DATA) > 0))
{
return FileAccess.ReadWrite;
}
else if ((desiredAccess & FileAccessMask.GENERIC_WRITE) > 0 ||
(desiredAccess & FileAccessMask.FILE_WRITE_DATA) > 0 ||
(desiredAccess & FileAccessMask.FILE_APPEND_DATA) > 0)
{
return FileAccess.Write;
}
else if ((desiredAccess & FileAccessMask.FILE_READ_DATA) > 0)
{
return FileAccess.Read;
}
else
{
return (FileAccess)0;
}
}
public static FileShare ToFileShare(ShareAccess shareAccess)
{
if ((shareAccess & ShareAccess.FILE_SHARE_READ) > 0 && (shareAccess & ShareAccess.FILE_SHARE_WRITE) > 0)
{
return FileShare.ReadWrite;
}
else if ((shareAccess & ShareAccess.FILE_SHARE_WRITE) > 0)
{
return FileShare.Write;
}
else if ((shareAccess & ShareAccess.FILE_SHARE_READ) > 0)
{
return FileShare.Read;
}
else if ((shareAccess & ShareAccess.FILE_SHARE_DELETE) > 0)
{
return FileShare.Delete;
}
else
{
return FileShare.None;
}
}
public static NTStatus OpenFile(out Stream stream, IFileSystem fileSystem, string path, FileAccess fileAccess, ShareAccess shareAccess, bool buffered, ConnectionState state)
{
stream = null;
@ -444,6 +395,50 @@ namespace SMBLibrary.Server
}
}
public static FileAccess ToFileAccess(FileAccessMask desiredAccess)
{
FileAccess result = 0;
if ((desiredAccess & FileAccessMask.FILE_READ_DATA) > 0 ||
(desiredAccess & FileAccessMask.MAXIMUM_ALLOWED) > 0 ||
(desiredAccess & FileAccessMask.GENERIC_ALL) > 0 ||
(desiredAccess & FileAccessMask.GENERIC_READ) > 0)
{
result |= FileAccess.Read;
}
if ((desiredAccess & FileAccessMask.FILE_WRITE_DATA) > 0 ||
(desiredAccess & FileAccessMask.FILE_APPEND_DATA) > 0 ||
(desiredAccess & FileAccessMask.MAXIMUM_ALLOWED) > 0 ||
(desiredAccess & FileAccessMask.GENERIC_ALL) > 0 ||
(desiredAccess & FileAccessMask.GENERIC_WRITE) > 0)
{
result |= FileAccess.Write;
}
return result;
}
public static FileShare ToFileShare(ShareAccess shareAccess)
{
FileShare result = FileShare.None;
if ((shareAccess & ShareAccess.FILE_SHARE_READ) > 0)
{
result |= FileShare.Read;
}
if ((shareAccess & ShareAccess.FILE_SHARE_WRITE) > 0)
{
result |= FileShare.Write;
}
if ((shareAccess & ShareAccess.FILE_SHARE_DELETE) > 0)
{
result |= FileShare.Delete;
}
return result;
}
/// <summary>
/// Will return a virtual allocation size, assuming 4096 bytes per cluster
/// </summary>