From 932780bc601fc3182a7cf70de8b1e94a5c39919c Mon Sep 17 00:00:00 2001 From: Tal Aloni Date: Tue, 5 Sep 2017 20:55:55 +0300 Subject: [PATCH] Improved AccessMask implementation --- SMBLibrary/EnumStructures/AccessMask.cs | 132 ------------------ .../Adapter/NTFileSystemAdapter.cs | 2 +- .../Enums/AccessMask/AccessMask.cs | 24 ++++ .../Enums/AccessMask/DirectoryAccessMask.cs | 33 +++++ .../Enums/AccessMask/FileAccessMask.cs | 32 +++++ SMBLibrary/NTFileStore/NTFileStoreHelper.cs | 36 ++--- .../Structures/ACE/AccessAllowedACE.cs | 4 +- .../SMB1/Commands/NTCreateAndXRequest.cs | 4 +- .../Commands/NTCreateAndXResponseExtended.cs | 14 +- .../SMB1/Commands/OpenAndXResponseExtended.cs | 10 +- .../TreeConnectAndXResponseExtended.cs | 14 +- .../NTTransactCreateRequest.cs | 10 +- SMBLibrary/SMB2/Commands/CreateRequest.cs | 4 +- .../SMB2/Commands/TreeConnectResponse.cs | 4 +- SMBLibrary/SMBLibrary.csproj | 4 +- SMBLibrary/Server/SMB1/NTCreateHelper.cs | 38 ++--- SMBLibrary/Server/SMB1/OpenAndXHelper.cs | 28 ++-- .../Server/SMB1/SMB1FileStoreHelper.Query.cs | 2 +- .../SMB1FileStoreHelper.QueryDirectory.cs | 2 +- SMBLibrary/Server/SMB1/SMB1FileStoreHelper.cs | 10 +- SMBLibrary/Server/SMB1/TreeConnectHelper.cs | 18 +-- SMBLibrary/Server/SMB2/CreateHelper.cs | 2 +- SMBLibrary/Server/SMB2/TreeConnectHelper.cs | 10 +- .../NTFileStore/NTDirectoryFileSystem.cs | 6 +- 24 files changed, 201 insertions(+), 242 deletions(-) delete mode 100644 SMBLibrary/EnumStructures/AccessMask.cs create mode 100644 SMBLibrary/NTFileStore/Enums/AccessMask/AccessMask.cs create mode 100644 SMBLibrary/NTFileStore/Enums/AccessMask/DirectoryAccessMask.cs create mode 100644 SMBLibrary/NTFileStore/Enums/AccessMask/FileAccessMask.cs diff --git a/SMBLibrary/EnumStructures/AccessMask.cs b/SMBLibrary/EnumStructures/AccessMask.cs deleted file mode 100644 index 668af02..0000000 --- a/SMBLibrary/EnumStructures/AccessMask.cs +++ /dev/null @@ -1,132 +0,0 @@ -/* Copyright (C) 2014-2017 Tal Aloni . All rights reserved. - * - * You can redistribute this program and/or modify it under the terms of - * the GNU Lesser Public License as published by the Free Software Foundation, - * either version 3 of the License, or (at your option) any later version. - */ -using System; -using System.Collections.Generic; -using System.Text; -using Utilities; - -namespace SMBLibrary -{ - /// - /// [MS-CIFS] SMB_COM_NT_CREATE_ANDX request (DesiredAccess field) and NT_TRANSACT_CREATE request (DesiredAccess field) - /// [MS-SMB] 2.2.1.4.1 - File_Pipe_Printer_Access_Mask - /// - [Flags] - public enum FileAccessMask : uint - { - FILE_READ_DATA = 0x00000001, - FILE_WRITE_DATA = 0x00000002, - FILE_APPEND_DATA = 0x00000004, - FILE_READ_EA = 0x00000008, - FILE_WRITE_EA = 0x00000010, - FILE_EXECUTE = 0x00000020, - FILE_READ_ATTRIBUTES = 0x00000080, - FILE_WRITE_ATTRIBUTES = 0x00000100, - DELETE = 0x00010000, - READ_CONTROL = 0x00020000, - WRITE_DAC = 0x00040000, - WRITE_OWNER = 0x00080000, - SYNCHRONIZE = 0x00100000, - ACCESS_SYSTEM_SECURITY = 0x01000000, - MAXIMUM_ALLOWED = 0x02000000, - GENERIC_ALL = 0x10000000, - GENERIC_EXECUTE = 0x20000000, - GENERIC_WRITE = 0x40000000, - GENERIC_READ = 0x80000000, - } - - /// - /// [MS-SMB] 2.2.1.4.2 - Directory_Access_Mask - /// - [Flags] - public enum DirectoryAccessMask : uint - { - FILE_LIST_DIRECTORY = 0x00000001, - FILE_ADD_FILE = 0x00000002, - FILE_ADD_SUBDIRECTORY = 0x00000004, - FILE_READ_EA = 0x00000008, - FILE_WRITE_EA = 0x00000010, - FILE_TRAVERSE = 0x00000020, - FILE_DELETE_CHILD = 0x00000040, - FILE_READ_ATTRIBUTES = 0x00000080, - FILE_WRITE_ATTRIBUTES = 0x00000100, - DELETE = 0x00010000, - READ_CONTROL = 0x00020000, - WRITE_DAC = 0x00040000, - WRITE_OWNER = 0x00080000, - SYNCHRONIZE = 0x00100000, - ACCESS_SYSTEM_SECURITY = 0x01000000, - MAXIMUM_ALLOWED = 0x02000000, - GENERIC_ALL = 0x10000000, - GENERIC_EXECUTE = 0x20000000, - GENERIC_WRITE = 0x40000000, - GENERIC_READ = 0x80000000, - } - - /// - /// [MS-DTYP] 2.4.3 - ACCESS_MASK - /// - public struct AccessMask // uint - { - public const int Length = 4; - - public FileAccessMask File; - public DirectoryAccessMask Directory; - - public AccessMask(byte[] buffer, ref int offset) : this(buffer, offset) - { - offset += Length; - } - - public AccessMask(byte[] buffer, int offset) - { - uint value = LittleEndianConverter.ToUInt32(buffer, offset); - File = (FileAccessMask)value; - Directory = (DirectoryAccessMask)value; - } - - public void WriteBytes(byte[] buffer, int offset) - { - uint value = (uint)this.File | (uint)this.Directory; - LittleEndianWriter.WriteUInt32(buffer, offset, value); - } - - public void WriteBytes(byte[] buffer, ref int offset) - { - WriteBytes(buffer, offset); - offset += 4; - } - - public static explicit operator AccessMask(uint value) - { - AccessMask result = new AccessMask(); - result.File = (FileAccessMask)value; - result.Directory = (DirectoryAccessMask)value; - return result; - } - - public static implicit operator AccessMask(FileAccessMask accessMask) - { - AccessMask result = new AccessMask(); - result.File = accessMask; - return result; - } - - public static implicit operator AccessMask(DirectoryAccessMask accessMask) - { - AccessMask result = new AccessMask(); - result.Directory = accessMask; - return result; - } - - public static explicit operator uint(AccessMask accessMask) - { - uint value = (uint)accessMask.File | (uint)accessMask.Directory; - return value; - } - } -} diff --git a/SMBLibrary/NTFileStore/Adapter/NTFileSystemAdapter.cs b/SMBLibrary/NTFileStore/Adapter/NTFileSystemAdapter.cs index 0e237ed..0b1c5b4 100644 --- a/SMBLibrary/NTFileStore/Adapter/NTFileSystemAdapter.cs +++ b/SMBLibrary/NTFileStore/Adapter/NTFileSystemAdapter.cs @@ -236,7 +236,7 @@ namespace SMBLibrary return NTStatus.STATUS_INVALID_PARAMETER; } - FileAccess fileAccess = NTFileStoreHelper.ToFileAccess(desiredAccess.File); + FileAccess fileAccess = NTFileStoreHelper.ToFileAccess((FileAccessMask)desiredAccess); Stream stream; if (fileAccess == (FileAccess)0 || entry.IsDirectory) { diff --git a/SMBLibrary/NTFileStore/Enums/AccessMask/AccessMask.cs b/SMBLibrary/NTFileStore/Enums/AccessMask/AccessMask.cs new file mode 100644 index 0000000..04e43c7 --- /dev/null +++ b/SMBLibrary/NTFileStore/Enums/AccessMask/AccessMask.cs @@ -0,0 +1,24 @@ +using System; + +namespace SMBLibrary +{ + /// + /// [MS-DTYP] 2.4.3 - ACCESS_MASK + /// + [Flags] + public enum AccessMask : uint + { + // The bits in positions 16 through 31 are object specific. + DELETE = 0x00010000, + READ_CONTROL = 0x00020000, + WRITE_DAC = 0x00040000, + WRITE_OWNER = 0x00080000, + SYNCHRONIZE = 0x00100000, + ACCESS_SYSTEM_SECURITY = 0x01000000, + MAXIMUM_ALLOWED = 0x02000000, + GENERIC_ALL = 0x10000000, + GENERIC_EXECUTE = 0x20000000, + GENERIC_WRITE = 0x40000000, + GENERIC_READ = 0x80000000, + } +} diff --git a/SMBLibrary/NTFileStore/Enums/AccessMask/DirectoryAccessMask.cs b/SMBLibrary/NTFileStore/Enums/AccessMask/DirectoryAccessMask.cs new file mode 100644 index 0000000..35f5999 --- /dev/null +++ b/SMBLibrary/NTFileStore/Enums/AccessMask/DirectoryAccessMask.cs @@ -0,0 +1,33 @@ +using System; + +namespace SMBLibrary +{ + /// + /// [MS-SMB] 2.2.1.4.2 - Directory_Access_Mask + /// [MS-SMB2] 2.2.13.1.2 - Directory_Access_Mask + /// + [Flags] + public enum DirectoryAccessMask : uint + { + FILE_LIST_DIRECTORY = 0x00000001, + FILE_ADD_FILE = 0x00000002, + FILE_ADD_SUBDIRECTORY = 0x00000004, + FILE_READ_EA = 0x00000008, + FILE_WRITE_EA = 0x00000010, + FILE_TRAVERSE = 0x00000020, + FILE_DELETE_CHILD = 0x00000040, + FILE_READ_ATTRIBUTES = 0x00000080, + FILE_WRITE_ATTRIBUTES = 0x00000100, + DELETE = 0x00010000, + READ_CONTROL = 0x00020000, + WRITE_DAC = 0x00040000, + WRITE_OWNER = 0x00080000, + SYNCHRONIZE = 0x00100000, + ACCESS_SYSTEM_SECURITY = 0x01000000, + MAXIMUM_ALLOWED = 0x02000000, + GENERIC_ALL = 0x10000000, + GENERIC_EXECUTE = 0x20000000, + GENERIC_WRITE = 0x40000000, + GENERIC_READ = 0x80000000, + } +} diff --git a/SMBLibrary/NTFileStore/Enums/AccessMask/FileAccessMask.cs b/SMBLibrary/NTFileStore/Enums/AccessMask/FileAccessMask.cs new file mode 100644 index 0000000..7c03265 --- /dev/null +++ b/SMBLibrary/NTFileStore/Enums/AccessMask/FileAccessMask.cs @@ -0,0 +1,32 @@ +using System; + +namespace SMBLibrary +{ + /// + /// [MS-SMB] 2.2.1.4.1 - File_Pipe_Printer_Access_Mask + /// [MS-SMB2] 2.2.13.1.1 - File_Pipe_Printer_Access_Mask + /// + [Flags] + public enum FileAccessMask : uint + { + FILE_READ_DATA = 0x00000001, + FILE_WRITE_DATA = 0x00000002, + FILE_APPEND_DATA = 0x00000004, + FILE_READ_EA = 0x00000008, + FILE_WRITE_EA = 0x00000010, + FILE_EXECUTE = 0x00000020, + FILE_READ_ATTRIBUTES = 0x00000080, + FILE_WRITE_ATTRIBUTES = 0x00000100, + DELETE = 0x00010000, + READ_CONTROL = 0x00020000, + WRITE_DAC = 0x00040000, + WRITE_OWNER = 0x00080000, + SYNCHRONIZE = 0x00100000, + ACCESS_SYSTEM_SECURITY = 0x01000000, + MAXIMUM_ALLOWED = 0x02000000, + GENERIC_ALL = 0x10000000, + GENERIC_EXECUTE = 0x20000000, + GENERIC_WRITE = 0x40000000, + GENERIC_READ = 0x80000000, + } +} diff --git a/SMBLibrary/NTFileStore/NTFileStoreHelper.cs b/SMBLibrary/NTFileStore/NTFileStoreHelper.cs index 76f0ad7..1ed888f 100644 --- a/SMBLibrary/NTFileStore/NTFileStoreHelper.cs +++ b/SMBLibrary/NTFileStore/NTFileStoreHelper.cs @@ -17,31 +17,31 @@ namespace SMBLibrary { FileAccess result = 0; - if ((desiredAccess.File & FileAccessMask.FILE_READ_DATA) > 0 || - (desiredAccess.File & FileAccessMask.FILE_READ_EA) > 0 || - (desiredAccess.File & FileAccessMask.FILE_READ_ATTRIBUTES) > 0 || - (desiredAccess.File & FileAccessMask.MAXIMUM_ALLOWED) > 0 || - (desiredAccess.File & FileAccessMask.GENERIC_ALL) > 0 || - (desiredAccess.File & FileAccessMask.GENERIC_READ) > 0) + if (((FileAccessMask)desiredAccess & FileAccessMask.FILE_READ_DATA) > 0 || + ((FileAccessMask)desiredAccess & FileAccessMask.FILE_READ_EA) > 0 || + ((FileAccessMask)desiredAccess & FileAccessMask.FILE_READ_ATTRIBUTES) > 0 || + (desiredAccess & AccessMask.MAXIMUM_ALLOWED) > 0 || + (desiredAccess & AccessMask.GENERIC_ALL) > 0 || + (desiredAccess & AccessMask.GENERIC_READ) > 0) { result |= FileAccess.Read; } - if ((desiredAccess.File & FileAccessMask.FILE_WRITE_DATA) > 0 || - (desiredAccess.File & FileAccessMask.FILE_APPEND_DATA) > 0 || - (desiredAccess.File & FileAccessMask.FILE_WRITE_EA) > 0 || - (desiredAccess.File & FileAccessMask.FILE_WRITE_ATTRIBUTES) > 0 || - (desiredAccess.File & FileAccessMask.DELETE) > 0 || - (desiredAccess.File & FileAccessMask.WRITE_DAC) > 0 || - (desiredAccess.File & FileAccessMask.WRITE_OWNER) > 0 || - (desiredAccess.File & FileAccessMask.MAXIMUM_ALLOWED) > 0 || - (desiredAccess.File & FileAccessMask.GENERIC_ALL) > 0 || - (desiredAccess.File & FileAccessMask.GENERIC_WRITE) > 0) + if (((FileAccessMask)desiredAccess & FileAccessMask.FILE_WRITE_DATA) > 0 || + ((FileAccessMask)desiredAccess & FileAccessMask.FILE_APPEND_DATA) > 0 || + ((FileAccessMask)desiredAccess & FileAccessMask.FILE_WRITE_EA) > 0 || + ((FileAccessMask)desiredAccess & FileAccessMask.FILE_WRITE_ATTRIBUTES) > 0 || + (desiredAccess & AccessMask.DELETE) > 0 || + (desiredAccess & AccessMask.WRITE_DAC) > 0 || + (desiredAccess & AccessMask.WRITE_OWNER) > 0 || + (desiredAccess & AccessMask.MAXIMUM_ALLOWED) > 0 || + (desiredAccess & AccessMask.GENERIC_ALL) > 0 || + (desiredAccess & AccessMask.GENERIC_WRITE) > 0) { result |= FileAccess.Write; } - if ((desiredAccess.Directory & DirectoryAccessMask.FILE_DELETE_CHILD) > 0) + if (((DirectoryAccessMask)desiredAccess & DirectoryAccessMask.FILE_DELETE_CHILD) > 0) { result |= FileAccess.Write; } @@ -103,7 +103,7 @@ namespace SMBLibrary { object handle; FileStatus fileStatus; - NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, path, FileAccessMask.FILE_READ_ATTRIBUTES, 0, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, 0, securityContext); + NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, path, (AccessMask)FileAccessMask.FILE_READ_ATTRIBUTES, 0, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, 0, securityContext); if (openStatus != NTStatus.STATUS_SUCCESS) { return null; diff --git a/SMBLibrary/NTFileStore/Structures/ACE/AccessAllowedACE.cs b/SMBLibrary/NTFileStore/Structures/ACE/AccessAllowedACE.cs index 9106ba1..efdb7de 100644 --- a/SMBLibrary/NTFileStore/Structures/ACE/AccessAllowedACE.cs +++ b/SMBLibrary/NTFileStore/Structures/ACE/AccessAllowedACE.cs @@ -1,4 +1,4 @@ -/* Copyright (C) 2014 Tal Aloni . All rights reserved. +/* Copyright (C) 2014-2017 Tal Aloni . All rights reserved. * * You can redistribute this program and/or modify it under the terms of * the GNU Lesser Public License as published by the Free Software Foundation, @@ -29,7 +29,7 @@ namespace SMBLibrary public AccessAllowedACE(byte[] buffer, int offset) { Header = new AceHeader(buffer, offset + 0); - Mask = new AccessMask(buffer, offset + 4); + Mask = (AccessMask)LittleEndianConverter.ToUInt32(buffer, offset + 4); Sid = new SID(buffer, offset + 8); } diff --git a/SMBLibrary/SMB1/Commands/NTCreateAndXRequest.cs b/SMBLibrary/SMB1/Commands/NTCreateAndXRequest.cs index 6a71623..df81cd1 100644 --- a/SMBLibrary/SMB1/Commands/NTCreateAndXRequest.cs +++ b/SMBLibrary/SMB1/Commands/NTCreateAndXRequest.cs @@ -25,7 +25,7 @@ namespace SMBLibrary.SMB1 // ushort NameLength; // in bytes public NTCreateFlags Flags; public uint RootDirectoryFID; - public FileAccessMask DesiredAccess; + public AccessMask DesiredAccess; public long AllocationSize; public ExtendedFileAttributes ExtFileAttributes; public ShareAccess ShareAccess; @@ -46,7 +46,7 @@ namespace SMBLibrary.SMB1 ushort nameLength = LittleEndianConverter.ToUInt16(this.SMBParameters, 5); Flags = (NTCreateFlags)LittleEndianConverter.ToUInt32(this.SMBParameters, 7); RootDirectoryFID = LittleEndianConverter.ToUInt32(this.SMBParameters, 11); - DesiredAccess = (FileAccessMask)LittleEndianConverter.ToUInt32(this.SMBParameters, 15); + DesiredAccess = (AccessMask)LittleEndianConverter.ToUInt32(this.SMBParameters, 15); AllocationSize = LittleEndianConverter.ToInt64(this.SMBParameters, 19); ExtFileAttributes = (ExtendedFileAttributes)LittleEndianConverter.ToUInt32(this.SMBParameters, 27); ShareAccess = (ShareAccess)LittleEndianConverter.ToUInt32(this.SMBParameters, 31); diff --git a/SMBLibrary/SMB1/Commands/NTCreateAndXResponseExtended.cs b/SMBLibrary/SMB1/Commands/NTCreateAndXResponseExtended.cs index 8c2dc1e..5024540 100644 --- a/SMBLibrary/SMB1/Commands/NTCreateAndXResponseExtended.cs +++ b/SMBLibrary/SMB1/Commands/NTCreateAndXResponseExtended.cs @@ -18,9 +18,9 @@ namespace SMBLibrary.SMB1 { public const int ParametersLength = 100; // Parameters: - //CommandName AndXCommand; - //byte AndXReserved; - //ushort AndXOffset; + // CommandName AndXCommand; + // byte AndXReserved; + // ushort AndXOffset; public OpLockLevel OpLockLevel; public ushort FID; public CreateDisposition CreateDisposition; @@ -61,8 +61,8 @@ namespace SMBLibrary.SMB1 Directory = (ByteReader.ReadByte(this.SMBParameters, ref parametersOffset) > 0); VolumeGuid = LittleEndianReader.ReadGuid(this.SMBParameters, ref parametersOffset); FileID = LittleEndianReader.ReadUInt64(this.SMBParameters, ref parametersOffset); - MaximalAccessRights = new AccessMask(this.SMBParameters, ref parametersOffset); - GuestMaximalAccessRights = new AccessMask(this.SMBParameters, ref parametersOffset); + MaximalAccessRights = (AccessMask)LittleEndianReader.ReadUInt32(this.SMBParameters, ref parametersOffset); + GuestMaximalAccessRights = (AccessMask)LittleEndianReader.ReadUInt32(this.SMBParameters, ref parametersOffset); } public override byte[] GetBytes(bool isUnicode) @@ -84,8 +84,8 @@ namespace SMBLibrary.SMB1 ByteWriter.WriteByte(this.SMBParameters, ref parametersOffset, Convert.ToByte(Directory)); LittleEndianWriter.WriteGuidBytes(this.SMBParameters, ref parametersOffset, VolumeGuid); LittleEndianWriter.WriteUInt64(this.SMBParameters, ref parametersOffset, FileID); - MaximalAccessRights.WriteBytes(this.SMBParameters, ref parametersOffset); - GuestMaximalAccessRights.WriteBytes(this.SMBParameters, ref parametersOffset); + LittleEndianWriter.WriteUInt32(this.SMBParameters, ref parametersOffset, (uint)MaximalAccessRights); + LittleEndianWriter.WriteUInt32(this.SMBParameters, ref parametersOffset, (uint)GuestMaximalAccessRights); return base.GetBytes(isUnicode); } diff --git a/SMBLibrary/SMB1/Commands/OpenAndXResponseExtended.cs b/SMBLibrary/SMB1/Commands/OpenAndXResponseExtended.cs index f2fe900..4bbdf73 100644 --- a/SMBLibrary/SMB1/Commands/OpenAndXResponseExtended.cs +++ b/SMBLibrary/SMB1/Commands/OpenAndXResponseExtended.cs @@ -18,9 +18,9 @@ namespace SMBLibrary.SMB1 { public const int ParametersLength = 38; // Parameters: - //CommandName AndXCommand; - //byte AndXReserved; - //ushort AndXOffset; + // CommandName AndXCommand; + // byte AndXReserved; + // ushort AndXOffset; public ushort FID; public SMBFileAttributes FileAttrs; public DateTime? LastWriteTime; // UTime @@ -57,8 +57,8 @@ namespace SMBLibrary.SMB1 OpenResults.WriteBytes(this.SMBParameters, ref parametersOffset); LittleEndianWriter.WriteUInt32(this.SMBParameters, ref parametersOffset, ServerFID); LittleEndianWriter.WriteUInt16(this.SMBParameters, ref parametersOffset, Reserved); - MaximalAccessRights.WriteBytes(this.SMBParameters, ref parametersOffset); - GuestMaximalAccessRights.WriteBytes(this.SMBParameters, ref parametersOffset); + LittleEndianWriter.WriteUInt32(this.SMBParameters, ref parametersOffset, (uint)MaximalAccessRights); + LittleEndianWriter.WriteUInt32(this.SMBParameters, ref parametersOffset, (uint)GuestMaximalAccessRights); return base.GetBytes(isUnicode); } diff --git a/SMBLibrary/SMB1/Commands/TreeConnectAndXResponseExtended.cs b/SMBLibrary/SMB1/Commands/TreeConnectAndXResponseExtended.cs index ea9bdc5..7fd2d7c 100644 --- a/SMBLibrary/SMB1/Commands/TreeConnectAndXResponseExtended.cs +++ b/SMBLibrary/SMB1/Commands/TreeConnectAndXResponseExtended.cs @@ -18,9 +18,9 @@ namespace SMBLibrary.SMB1 { public const int ParametersLength = 14; // Parameters: - //CommandName AndXCommand; - //byte AndXReserved; - //ushort AndXOffset; + // CommandName AndXCommand; + // byte AndXReserved; + // ushort AndXOffset; public OptionalSupportFlags OptionalSupport; public AccessMask MaximalShareAccessRights; public AccessMask GuestMaximalShareAccessRights; @@ -36,8 +36,8 @@ namespace SMBLibrary.SMB1 { int parametersOffset = 4; OptionalSupport = (OptionalSupportFlags)LittleEndianReader.ReadUInt16(this.SMBParameters, ref parametersOffset); - MaximalShareAccessRights = new AccessMask(this.SMBParameters, ref parametersOffset); - GuestMaximalShareAccessRights = new AccessMask(this.SMBParameters, ref parametersOffset); + MaximalShareAccessRights = (AccessMask)LittleEndianReader.ReadUInt32(this.SMBParameters, ref parametersOffset); + GuestMaximalShareAccessRights = (AccessMask)LittleEndianReader.ReadUInt32(this.SMBParameters, ref parametersOffset); int dataOffset = 0; string serviceString = ByteReader.ReadNullTerminatedAnsiString(this.SMBData, ref dataOffset); @@ -51,8 +51,8 @@ namespace SMBLibrary.SMB1 this.SMBParameters = new byte[ParametersLength]; int parametersOffset = 4; LittleEndianWriter.WriteUInt16(this.SMBParameters, ref parametersOffset, (ushort)OptionalSupport); - MaximalShareAccessRights.WriteBytes(this.SMBParameters, ref parametersOffset); - GuestMaximalShareAccessRights.WriteBytes(this.SMBParameters, ref parametersOffset); + LittleEndianWriter.WriteUInt32(this.SMBParameters, ref parametersOffset, (uint)MaximalShareAccessRights); + LittleEndianWriter.WriteUInt32(this.SMBParameters, ref parametersOffset, (uint)GuestMaximalShareAccessRights); // Should be written as OEM string but it doesn't really matter string serviceString = ServiceNameHelper.GetServiceString(Service); diff --git a/SMBLibrary/SMB1/NTTransactSubcommands/NTTransactCreateRequest.cs b/SMBLibrary/SMB1/NTTransactSubcommands/NTTransactCreateRequest.cs index 94bd0a0..decfa3a 100644 --- a/SMBLibrary/SMB1/NTTransactSubcommands/NTTransactCreateRequest.cs +++ b/SMBLibrary/SMB1/NTTransactSubcommands/NTTransactCreateRequest.cs @@ -20,15 +20,15 @@ namespace SMBLibrary.SMB1 // Parameters: public NTCreateFlags Flags; public uint RootDirectoryFID; - public FileAccessMask DesiredAccess; + public AccessMask DesiredAccess; public long AllocationSize; public ExtendedFileAttributes ExtFileAttributes; public ShareAccess ShareAccess; public CreateDisposition CreateDisposition; public CreateOptions CreateOptions; - //uint SecurityDescriptiorLength; - //uint EALength; - //uint NameLength; + // uint SecurityDescriptiorLength; + // uint EALength; + // uint NameLength; public ImpersonationLevel ImpersonationLevel; public SecurityFlags SecurityFlags; public string Name; // OEM / Unicode. NOT null terminated. (MUST be aligned to start on a 2-byte boundary from the start of the NT_Trans_Parameters) @@ -45,7 +45,7 @@ namespace SMBLibrary.SMB1 int parametersOffset = 0; Flags = (NTCreateFlags)LittleEndianReader.ReadUInt32(parameters, ref parametersOffset); RootDirectoryFID = LittleEndianReader.ReadUInt32(parameters, ref parametersOffset); - DesiredAccess = (FileAccessMask)LittleEndianReader.ReadUInt32(parameters, ref parametersOffset); + DesiredAccess = (AccessMask)LittleEndianReader.ReadUInt32(parameters, ref parametersOffset); AllocationSize = LittleEndianReader.ReadInt64(parameters, ref parametersOffset); ExtFileAttributes = (ExtendedFileAttributes)LittleEndianReader.ReadUInt32(parameters, ref parametersOffset); ShareAccess = (ShareAccess)LittleEndianReader.ReadUInt32(parameters, ref parametersOffset); diff --git a/SMBLibrary/SMB2/Commands/CreateRequest.cs b/SMBLibrary/SMB2/Commands/CreateRequest.cs index 112809a..f5644a2 100644 --- a/SMBLibrary/SMB2/Commands/CreateRequest.cs +++ b/SMBLibrary/SMB2/Commands/CreateRequest.cs @@ -49,7 +49,7 @@ namespace SMBLibrary.SMB2 ImpersonationLevel = (ImpersonationLevel)LittleEndianConverter.ToUInt32(buffer, offset + SMB2Header.Length + 4); SmbCreateFlags = LittleEndianConverter.ToUInt64(buffer, offset + SMB2Header.Length + 8); Reserved = LittleEndianConverter.ToUInt64(buffer, offset + SMB2Header.Length + 16); - DesiredAccess = new AccessMask(buffer, offset + SMB2Header.Length + 24); + DesiredAccess = (AccessMask)LittleEndianConverter.ToUInt32(buffer, offset + SMB2Header.Length + 24); FileAttributes = (FileAttributes)LittleEndianConverter.ToUInt32(buffer, offset + SMB2Header.Length + 28); ShareAccess = (ShareAccess)LittleEndianConverter.ToUInt32(buffer, offset + SMB2Header.Length + 32); CreateDisposition = (CreateDisposition)LittleEndianConverter.ToUInt32(buffer, offset + SMB2Header.Length + 36); @@ -87,7 +87,7 @@ namespace SMBLibrary.SMB2 LittleEndianWriter.WriteUInt32(buffer, offset + 4, (uint)ImpersonationLevel); LittleEndianWriter.WriteUInt64(buffer, offset + 8, (ulong)SmbCreateFlags); LittleEndianWriter.WriteUInt64(buffer, offset + 16, (ulong)Reserved); - DesiredAccess.WriteBytes(buffer, offset + 24); + LittleEndianWriter.WriteUInt32(buffer, offset + 24, (uint)DesiredAccess); LittleEndianWriter.WriteUInt32(buffer, offset + 28, (uint)FileAttributes); LittleEndianWriter.WriteUInt32(buffer, offset + 32, (uint)ShareAccess); LittleEndianWriter.WriteUInt32(buffer, offset + 36, (uint)CreateDisposition); diff --git a/SMBLibrary/SMB2/Commands/TreeConnectResponse.cs b/SMBLibrary/SMB2/Commands/TreeConnectResponse.cs index 6209e8b..eac670c 100644 --- a/SMBLibrary/SMB2/Commands/TreeConnectResponse.cs +++ b/SMBLibrary/SMB2/Commands/TreeConnectResponse.cs @@ -37,7 +37,7 @@ namespace SMBLibrary.SMB2 Reserved = ByteReader.ReadByte(buffer, offset + SMB2Header.Length + 3); ShareFlags = (ShareFlags)LittleEndianConverter.ToUInt32(buffer, offset + SMB2Header.Length + 4); Capabilities = (ShareCapabilities)LittleEndianConverter.ToUInt32(buffer, offset + SMB2Header.Length + 8); - MaximalAccess = new AccessMask(buffer, offset + SMB2Header.Length + 12); + MaximalAccess = (AccessMask)LittleEndianConverter.ToUInt32(buffer, offset + SMB2Header.Length + 12); } public override void WriteCommandBytes(byte[] buffer, int offset) @@ -47,7 +47,7 @@ namespace SMBLibrary.SMB2 ByteWriter.WriteByte(buffer, offset + 3, Reserved); LittleEndianWriter.WriteUInt32(buffer, offset + 4, (uint)ShareFlags); LittleEndianWriter.WriteUInt32(buffer, offset + 8, (uint)Capabilities); - MaximalAccess.WriteBytes(buffer, offset + 12); + LittleEndianWriter.WriteUInt32(buffer, offset + 12, (uint)MaximalAccess); } public override int CommandLength diff --git a/SMBLibrary/SMBLibrary.csproj b/SMBLibrary/SMBLibrary.csproj index 87c2a16..ea03ce6 100644 --- a/SMBLibrary/SMBLibrary.csproj +++ b/SMBLibrary/SMBLibrary.csproj @@ -61,7 +61,6 @@ - @@ -94,6 +93,9 @@ + + + diff --git a/SMBLibrary/Server/SMB1/NTCreateHelper.cs b/SMBLibrary/Server/SMB1/NTCreateHelper.cs index ab621f9..711087c 100644 --- a/SMBLibrary/Server/SMB1/NTCreateHelper.cs +++ b/SMBLibrary/Server/SMB1/NTCreateHelper.cs @@ -41,7 +41,7 @@ namespace SMBLibrary.Server.SMB1 FileStatus fileStatus; FileAttributes fileAttributes = ToFileAttributes(request.ExtFileAttributes); // GetFileInformation/FileNetworkOpenInformation requires FILE_READ_ATTRIBUTES - FileAccessMask desiredAccess = request.DesiredAccess | FileAccessMask.FILE_READ_ATTRIBUTES; + AccessMask desiredAccess = request.DesiredAccess | (AccessMask)FileAccessMask.FILE_READ_ATTRIBUTES; NTStatus createStatus = share.FileStore.CreateFile(out handle, out fileStatus, path, desiredAccess, fileAttributes, request.ShareAccess, request.CreateDisposition, request.CreateOptions, session.SecurityContext); if (createStatus != NTStatus.STATUS_SUCCESS) { @@ -112,15 +112,15 @@ namespace SMBLibrary.Server.SMB1 status.ReadMode = ReadMode.MessageMode; status.NamedPipeType = NamedPipeType.MessageModePipe; response.NMPipeStatus = status; - response.MaximalAccessRights.File = FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA | FileAccessMask.FILE_APPEND_DATA | - FileAccessMask.FILE_READ_EA | FileAccessMask.FILE_WRITE_EA | - FileAccessMask.FILE_EXECUTE | - FileAccessMask.FILE_READ_ATTRIBUTES | FileAccessMask.FILE_WRITE_ATTRIBUTES | - FileAccessMask.DELETE | FileAccessMask.READ_CONTROL | FileAccessMask.WRITE_DAC | FileAccessMask.WRITE_OWNER | FileAccessMask.SYNCHRONIZE; - response.GuestMaximalAccessRights.File = FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA | - FileAccessMask.FILE_READ_EA | FileAccessMask.FILE_WRITE_EA | - FileAccessMask.FILE_READ_ATTRIBUTES | FileAccessMask.FILE_WRITE_ATTRIBUTES | - FileAccessMask.READ_CONTROL | FileAccessMask.SYNCHRONIZE; + response.MaximalAccessRights = (AccessMask)(FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA | FileAccessMask.FILE_APPEND_DATA | + FileAccessMask.FILE_READ_EA | FileAccessMask.FILE_WRITE_EA | + FileAccessMask.FILE_EXECUTE | + FileAccessMask.FILE_READ_ATTRIBUTES | FileAccessMask.FILE_WRITE_ATTRIBUTES) | + AccessMask.DELETE | AccessMask.READ_CONTROL | AccessMask.WRITE_DAC | AccessMask.WRITE_OWNER | AccessMask.SYNCHRONIZE; + response.GuestMaximalAccessRights = (AccessMask)(FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA | + FileAccessMask.FILE_READ_EA | FileAccessMask.FILE_WRITE_EA | + FileAccessMask.FILE_READ_ATTRIBUTES | FileAccessMask.FILE_WRITE_ATTRIBUTES) | + AccessMask.READ_CONTROL | AccessMask.SYNCHRONIZE; return response; } @@ -156,15 +156,15 @@ namespace SMBLibrary.Server.SMB1 response.ResourceType = ResourceType.FileTypeDisk; response.FileStatusFlags = FileStatusFlags.NO_EAS | FileStatusFlags.NO_SUBSTREAMS | FileStatusFlags.NO_REPARSETAG; response.Directory = fileInfo.IsDirectory; - response.MaximalAccessRights.File = FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA | FileAccessMask.FILE_APPEND_DATA | - FileAccessMask.FILE_READ_EA | FileAccessMask.FILE_WRITE_EA | - FileAccessMask.FILE_EXECUTE | - FileAccessMask.FILE_READ_ATTRIBUTES | FileAccessMask.FILE_WRITE_ATTRIBUTES | - FileAccessMask.DELETE | FileAccessMask.READ_CONTROL | FileAccessMask.WRITE_DAC | FileAccessMask.WRITE_OWNER | FileAccessMask.SYNCHRONIZE; - response.GuestMaximalAccessRights.File = FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA | - FileAccessMask.FILE_READ_EA | FileAccessMask.FILE_WRITE_EA | - FileAccessMask.FILE_READ_ATTRIBUTES | FileAccessMask.FILE_WRITE_ATTRIBUTES | - FileAccessMask.READ_CONTROL | FileAccessMask.SYNCHRONIZE; + response.MaximalAccessRights = (AccessMask)(FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA | FileAccessMask.FILE_APPEND_DATA | + FileAccessMask.FILE_READ_EA | FileAccessMask.FILE_WRITE_EA | + FileAccessMask.FILE_EXECUTE | + FileAccessMask.FILE_READ_ATTRIBUTES | FileAccessMask.FILE_WRITE_ATTRIBUTES) | + AccessMask.DELETE | AccessMask.READ_CONTROL | AccessMask.WRITE_DAC | AccessMask.WRITE_OWNER | AccessMask.SYNCHRONIZE; + response.GuestMaximalAccessRights = (AccessMask)(FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA | + FileAccessMask.FILE_READ_EA | FileAccessMask.FILE_WRITE_EA | + FileAccessMask.FILE_READ_ATTRIBUTES | FileAccessMask.FILE_WRITE_ATTRIBUTES) | + AccessMask.READ_CONTROL | AccessMask.SYNCHRONIZE; return response; } diff --git a/SMBLibrary/Server/SMB1/OpenAndXHelper.cs b/SMBLibrary/Server/SMB1/OpenAndXHelper.cs index 27b0b63..c9a5853 100644 --- a/SMBLibrary/Server/SMB1/OpenAndXHelper.cs +++ b/SMBLibrary/Server/SMB1/OpenAndXHelper.cs @@ -103,19 +103,19 @@ namespace SMBLibrary.Server.SMB1 { if (accessMode == AccessMode.Read) { - return FileAccessMask.GENERIC_READ; + return AccessMask.GENERIC_READ; } - if (accessMode == AccessMode.Write) + else if (accessMode == AccessMode.Write) { - return FileAccessMask.GENERIC_WRITE | FileAccessMask.FILE_READ_ATTRIBUTES; + return AccessMask.GENERIC_WRITE | (AccessMask)FileAccessMask.FILE_READ_ATTRIBUTES; } else if (accessMode == AccessMode.ReadWrite) { - return FileAccessMask.GENERIC_READ | FileAccessMask.GENERIC_WRITE; + return AccessMask.GENERIC_READ | AccessMask.GENERIC_WRITE; } else if (accessMode == AccessMode.Execute) { - return FileAccessMask.GENERIC_READ | FileAccessMask.GENERIC_EXECUTE; + return AccessMask.GENERIC_READ | AccessMask.GENERIC_EXECUTE; } else { @@ -301,15 +301,15 @@ namespace SMBLibrary.Server.SMB1 response.AccessRights = AccessRights.SMB_DA_ACCESS_READ; response.ResourceType = ResourceType.FileTypeDisk; response.OpenResults.OpenResult = openResult; - response.MaximalAccessRights.File = FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA | FileAccessMask.FILE_APPEND_DATA | - FileAccessMask.FILE_READ_EA | FileAccessMask.FILE_WRITE_EA | - FileAccessMask.FILE_EXECUTE | - FileAccessMask.FILE_READ_ATTRIBUTES | FileAccessMask.FILE_WRITE_ATTRIBUTES | - FileAccessMask.DELETE | FileAccessMask.READ_CONTROL | FileAccessMask.WRITE_DAC | FileAccessMask.WRITE_OWNER | FileAccessMask.SYNCHRONIZE; - response.GuestMaximalAccessRights.File = FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA | - FileAccessMask.FILE_READ_EA | FileAccessMask.FILE_WRITE_EA | - FileAccessMask.FILE_READ_ATTRIBUTES | FileAccessMask.FILE_WRITE_ATTRIBUTES | - FileAccessMask.READ_CONTROL | FileAccessMask.SYNCHRONIZE; + response.MaximalAccessRights = (AccessMask)(FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA | FileAccessMask.FILE_APPEND_DATA | + FileAccessMask.FILE_READ_EA | FileAccessMask.FILE_WRITE_EA | + FileAccessMask.FILE_EXECUTE | + FileAccessMask.FILE_READ_ATTRIBUTES | FileAccessMask.FILE_WRITE_ATTRIBUTES) | + AccessMask.DELETE | AccessMask.READ_CONTROL | AccessMask.WRITE_DAC | AccessMask.WRITE_OWNER | AccessMask.SYNCHRONIZE; + response.GuestMaximalAccessRights = (AccessMask)(FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA | + FileAccessMask.FILE_READ_EA | FileAccessMask.FILE_WRITE_EA | + FileAccessMask.FILE_READ_ATTRIBUTES | FileAccessMask.FILE_WRITE_ATTRIBUTES) | + AccessMask.READ_CONTROL | AccessMask.SYNCHRONIZE; return response; } } diff --git a/SMBLibrary/Server/SMB1/SMB1FileStoreHelper.Query.cs b/SMBLibrary/Server/SMB1/SMB1FileStoreHelper.Query.cs index 98b3af0..66eaa24 100644 --- a/SMBLibrary/Server/SMB1/SMB1FileStoreHelper.Query.cs +++ b/SMBLibrary/Server/SMB1/SMB1FileStoreHelper.Query.cs @@ -18,7 +18,7 @@ namespace SMBLibrary.Server.SMB1 { object handle; FileStatus fileStatus; - NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, path, FileAccessMask.FILE_READ_ATTRIBUTES, 0, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, 0, securityContext); + NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, path, (AccessMask)FileAccessMask.FILE_READ_ATTRIBUTES, 0, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, 0, securityContext); if (openStatus != NTStatus.STATUS_SUCCESS) { result = null; diff --git a/SMBLibrary/Server/SMB1/SMB1FileStoreHelper.QueryDirectory.cs b/SMBLibrary/Server/SMB1/SMB1FileStoreHelper.QueryDirectory.cs index b351f67..86e415a 100644 --- a/SMBLibrary/Server/SMB1/SMB1FileStoreHelper.QueryDirectory.cs +++ b/SMBLibrary/Server/SMB1/SMB1FileStoreHelper.QueryDirectory.cs @@ -33,7 +33,7 @@ namespace SMBLibrary.Server.SMB1 FileStatus fileStatus; DirectoryAccessMask accessMask = DirectoryAccessMask.FILE_LIST_DIRECTORY | DirectoryAccessMask.FILE_TRAVERSE | DirectoryAccessMask.SYNCHRONIZE; CreateOptions createOptions = CreateOptions.FILE_DIRECTORY_FILE | CreateOptions.FILE_SYNCHRONOUS_IO_NONALERT; - NTStatus status = fileStore.CreateFile(out handle, out fileStatus, path, accessMask, 0, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, createOptions, securityContext); + NTStatus status = fileStore.CreateFile(out handle, out fileStatus, path, (AccessMask)accessMask, 0, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, createOptions, securityContext); if (status != NTStatus.STATUS_SUCCESS) { result = null; diff --git a/SMBLibrary/Server/SMB1/SMB1FileStoreHelper.cs b/SMBLibrary/Server/SMB1/SMB1FileStoreHelper.cs index 99ff50f..792cf39 100644 --- a/SMBLibrary/Server/SMB1/SMB1FileStoreHelper.cs +++ b/SMBLibrary/Server/SMB1/SMB1FileStoreHelper.cs @@ -18,7 +18,7 @@ namespace SMBLibrary.Server.SMB1 { object handle; FileStatus fileStatus; - NTStatus createStatus = fileStore.CreateFile(out handle, out fileStatus, path, DirectoryAccessMask.FILE_ADD_SUBDIRECTORY, 0, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_CREATE, CreateOptions.FILE_DIRECTORY_FILE, securityContext); + NTStatus createStatus = fileStore.CreateFile(out handle, out fileStatus, path, (AccessMask)DirectoryAccessMask.FILE_ADD_SUBDIRECTORY, 0, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_CREATE, CreateOptions.FILE_DIRECTORY_FILE, securityContext); if (createStatus != NTStatus.STATUS_SUCCESS) { return createStatus; @@ -42,7 +42,7 @@ namespace SMBLibrary.Server.SMB1 object handle; FileStatus fileStatus; ShareAccess shareAccess = ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE | ShareAccess.FILE_SHARE_DELETE; - NTStatus status = fileStore.CreateFile(out handle, out fileStatus, path, DirectoryAccessMask.DELETE, 0, shareAccess, CreateDisposition.FILE_OPEN, createOptions, securityContext); + NTStatus status = fileStore.CreateFile(out handle, out fileStatus, path, AccessMask.DELETE, 0, shareAccess, CreateDisposition.FILE_OPEN, createOptions, securityContext); if (status != NTStatus.STATUS_SUCCESS) { return status; @@ -66,7 +66,7 @@ namespace SMBLibrary.Server.SMB1 createOptions = CreateOptions.FILE_NON_DIRECTORY_FILE; } ShareAccess shareAccess = ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE | ShareAccess.FILE_SHARE_DELETE; - NTStatus status = fileStore.CreateFile(out handle, out fileStatus, oldName, DirectoryAccessMask.DELETE, 0, shareAccess, CreateDisposition.FILE_OPEN, createOptions, securityContext); + NTStatus status = fileStore.CreateFile(out handle, out fileStatus, oldName, AccessMask.DELETE, 0, shareAccess, CreateDisposition.FILE_OPEN, createOptions, securityContext); if (status != NTStatus.STATUS_SUCCESS) { return status; @@ -97,7 +97,7 @@ namespace SMBLibrary.Server.SMB1 { object handle; FileStatus fileStatus; - NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, path, FileAccessMask.FILE_READ_ATTRIBUTES, 0, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, 0, securityContext); + NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, path, (AccessMask)FileAccessMask.FILE_READ_ATTRIBUTES, 0, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, 0, securityContext); if (openStatus != NTStatus.STATUS_SUCCESS) { fileInfo = null; @@ -113,7 +113,7 @@ namespace SMBLibrary.Server.SMB1 { object handle; FileStatus fileStatus; - NTStatus status = fileStore.CreateFile(out handle, out fileStatus, path, FileAccessMask.FILE_WRITE_ATTRIBUTES, (FileAttributes)0, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, 0, securityContext); + NTStatus status = fileStore.CreateFile(out handle, out fileStatus, path, (AccessMask)FileAccessMask.FILE_WRITE_ATTRIBUTES, (FileAttributes)0, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, 0, securityContext); if (status != NTStatus.STATUS_SUCCESS) { return status; diff --git a/SMBLibrary/Server/SMB1/TreeConnectHelper.cs b/SMBLibrary/Server/SMB1/TreeConnectHelper.cs index 2a6be77..213e55c 100644 --- a/SMBLibrary/Server/SMB1/TreeConnectHelper.cs +++ b/SMBLibrary/Server/SMB1/TreeConnectHelper.cs @@ -93,15 +93,15 @@ namespace SMBLibrary.Server.SMB1 { TreeConnectAndXResponseExtended response = new TreeConnectAndXResponseExtended(); response.OptionalSupport = supportFlags; - response.MaximalShareAccessRights.File = FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA | FileAccessMask.FILE_APPEND_DATA | - FileAccessMask.FILE_READ_EA | FileAccessMask.FILE_WRITE_EA | - FileAccessMask.FILE_EXECUTE | - FileAccessMask.FILE_READ_ATTRIBUTES | FileAccessMask.FILE_WRITE_ATTRIBUTES | - FileAccessMask.DELETE | FileAccessMask.READ_CONTROL | FileAccessMask.WRITE_DAC | FileAccessMask.WRITE_OWNER | FileAccessMask.SYNCHRONIZE; - response.GuestMaximalShareAccessRights.File = FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA | - FileAccessMask.FILE_READ_EA | FileAccessMask.FILE_WRITE_EA | - FileAccessMask.FILE_READ_ATTRIBUTES | FileAccessMask.FILE_WRITE_ATTRIBUTES | - FileAccessMask.READ_CONTROL | FileAccessMask.SYNCHRONIZE; + response.MaximalShareAccessRights = (AccessMask)(FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA | FileAccessMask.FILE_APPEND_DATA | + FileAccessMask.FILE_READ_EA | FileAccessMask.FILE_WRITE_EA | + FileAccessMask.FILE_EXECUTE | + FileAccessMask.FILE_READ_ATTRIBUTES | FileAccessMask.FILE_WRITE_ATTRIBUTES) | + AccessMask.DELETE | AccessMask.READ_CONTROL | AccessMask.WRITE_DAC | AccessMask.WRITE_OWNER | AccessMask.SYNCHRONIZE; + response.GuestMaximalShareAccessRights = (AccessMask)(FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA | + FileAccessMask.FILE_READ_EA | FileAccessMask.FILE_WRITE_EA | + FileAccessMask.FILE_READ_ATTRIBUTES | FileAccessMask.FILE_WRITE_ATTRIBUTES) | + AccessMask.READ_CONTROL | AccessMask.SYNCHRONIZE; response.NativeFileSystem = String.Empty; response.Service = serviceName; return response; diff --git a/SMBLibrary/Server/SMB2/CreateHelper.cs b/SMBLibrary/Server/SMB2/CreateHelper.cs index d09700a..4cb3744 100644 --- a/SMBLibrary/Server/SMB2/CreateHelper.cs +++ b/SMBLibrary/Server/SMB2/CreateHelper.cs @@ -36,7 +36,7 @@ namespace SMBLibrary.Server.SMB2 object handle; FileStatus fileStatus; // GetFileInformation/FileNetworkOpenInformation requires FILE_READ_ATTRIBUTES - AccessMask desiredAccess = request.DesiredAccess.File | FileAccessMask.FILE_READ_ATTRIBUTES; + AccessMask desiredAccess = request.DesiredAccess | (AccessMask)FileAccessMask.FILE_READ_ATTRIBUTES; NTStatus createStatus = share.FileStore.CreateFile(out handle, out fileStatus, path, desiredAccess, request.FileAttributes, request.ShareAccess, request.CreateDisposition, request.CreateOptions, session.SecurityContext); if (createStatus != NTStatus.STATUS_SUCCESS) { diff --git a/SMBLibrary/Server/SMB2/TreeConnectHelper.cs b/SMBLibrary/Server/SMB2/TreeConnectHelper.cs index b7190c5..048571f 100644 --- a/SMBLibrary/Server/SMB2/TreeConnectHelper.cs +++ b/SMBLibrary/Server/SMB2/TreeConnectHelper.cs @@ -54,11 +54,11 @@ namespace SMBLibrary.Server.SMB2 response.Header.TreeID = treeID.Value; response.ShareType = shareType; response.ShareFlags = shareFlags; - response.MaximalAccess.File = FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA | FileAccessMask.FILE_APPEND_DATA | - FileAccessMask.FILE_READ_EA | FileAccessMask.FILE_WRITE_EA | - FileAccessMask.FILE_EXECUTE | - FileAccessMask.FILE_READ_ATTRIBUTES | FileAccessMask.FILE_WRITE_ATTRIBUTES | - FileAccessMask.DELETE | FileAccessMask.READ_CONTROL | FileAccessMask.WRITE_DAC | FileAccessMask.WRITE_OWNER | FileAccessMask.SYNCHRONIZE; + response.MaximalAccess = (AccessMask)(FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA | FileAccessMask.FILE_APPEND_DATA | + FileAccessMask.FILE_READ_EA | FileAccessMask.FILE_WRITE_EA | + FileAccessMask.FILE_EXECUTE | + FileAccessMask.FILE_READ_ATTRIBUTES | FileAccessMask.FILE_WRITE_ATTRIBUTES) | + AccessMask.DELETE | AccessMask.READ_CONTROL | AccessMask.WRITE_DAC | AccessMask.WRITE_OWNER | AccessMask.SYNCHRONIZE; return response; } diff --git a/SMBLibrary/Win32/NTFileStore/NTDirectoryFileSystem.cs b/SMBLibrary/Win32/NTFileStore/NTDirectoryFileSystem.cs index ba92407..17b5da0 100644 --- a/SMBLibrary/Win32/NTFileStore/NTDirectoryFileSystem.cs +++ b/SMBLibrary/Win32/NTFileStore/NTDirectoryFileSystem.cs @@ -165,12 +165,12 @@ namespace SMBLibrary.Win32 // NtQueryDirectoryFile will return STATUS_PENDING if the directory handle was not opened with SYNCHRONIZE and FILE_SYNCHRONOUS_IO_ALERT or FILE_SYNCHRONOUS_IO_NONALERT. // Our usage of NtNotifyChangeDirectoryFile assumes the directory handle is opened with SYNCHRONIZE and FILE_SYNCHRONOUS_IO_ALERT (or FILE_SYNCHRONOUS_IO_NONALERT starting from Windows Vista). // Note: Sometimes a directory will be opened without specifying FILE_DIRECTORY_FILE. - desiredAccess.Directory |= DirectoryAccessMask.SYNCHRONIZE; + desiredAccess |= AccessMask.SYNCHRONIZE; createOptions &= ~CreateOptions.FILE_SYNCHRONOUS_IO_NONALERT; createOptions |= CreateOptions.FILE_SYNCHRONOUS_IO_ALERT; if ((createOptions & CreateOptions.FILE_NO_INTERMEDIATE_BUFFERING) > 0 && - (desiredAccess.File & FileAccessMask.FILE_APPEND_DATA) > 0) + ((FileAccessMask)desiredAccess & FileAccessMask.FILE_APPEND_DATA) > 0) { // FILE_NO_INTERMEDIATE_BUFFERING is incompatible with FILE_APPEND_DATA // [MS-SMB2] 3.3.5.9 suggests setting FILE_APPEND_DATA to zero in this case. @@ -345,7 +345,7 @@ namespace SMBLibrary.Win32 IntPtr volumeHandle; FileStatus fileStatus; string nativePath = @"\??\" + m_directory.FullName.Substring(0, 3); - NTStatus status = CreateFile(out volumeHandle, out fileStatus, nativePath, DirectoryAccessMask.GENERIC_READ, 0, (FileAttributes)0, ShareAccess.FILE_SHARE_READ, CreateDisposition.FILE_OPEN, (CreateOptions)0); + NTStatus status = CreateFile(out volumeHandle, out fileStatus, nativePath, AccessMask.GENERIC_READ, 0, (FileAttributes)0, ShareAccess.FILE_SHARE_READ, CreateDisposition.FILE_OPEN, (CreateOptions)0); result = null; if (status != NTStatus.STATUS_SUCCESS) {