diff --git a/SMBLibrary/Server/ConnectionState/OpenFileObject.cs b/SMBLibrary/Server/ConnectionState/OpenFileObject.cs index e865550..6bafe53 100644 --- a/SMBLibrary/Server/ConnectionState/OpenFileObject.cs +++ b/SMBLibrary/Server/ConnectionState/OpenFileObject.cs @@ -16,14 +16,16 @@ namespace SMBLibrary.Server private string m_shareName; private string m_path; private object m_handle; + private FileAccess m_fileAccess; private DateTime m_openedDT; - public OpenFileObject(uint treeID, string shareName, string path, object handle) + public OpenFileObject(uint treeID, string shareName, string path, object handle, FileAccess fileAccess) { m_treeID = treeID; m_shareName = shareName; m_path = path; m_handle = handle; + m_fileAccess = fileAccess; m_openedDT = DateTime.Now; } @@ -63,6 +65,14 @@ namespace SMBLibrary.Server } } + public FileAccess FileAccess + { + get + { + return m_fileAccess; + } + } + public DateTime OpenedDT { get diff --git a/SMBLibrary/Server/ConnectionState/SMB1Session.cs b/SMBLibrary/Server/ConnectionState/SMB1Session.cs index a7587e5..769c49c 100644 --- a/SMBLibrary/Server/ConnectionState/SMB1Session.cs +++ b/SMBLibrary/Server/ConnectionState/SMB1Session.cs @@ -88,21 +88,16 @@ namespace SMBLibrary.Server return m_connectedTrees.ContainsKey(treeID); } - /// Should include the path relative to the share + /// The path relative to the share /// FileID - public ushort? AddOpenFile(ushort treeID, string shareName, string relativePath) - { - return AddOpenFile(treeID, shareName, relativePath, null); - } - - public ushort? AddOpenFile(ushort treeID, string shareName, string relativePath, object handle) + public ushort? AddOpenFile(ushort treeID, string shareName, string relativePath, object handle, FileAccess fileAccess) { lock (m_connection) { ushort? fileID = m_connection.AllocateFileID(); if (fileID.HasValue) { - m_openFiles.Add(fileID.Value, new OpenFileObject(treeID, shareName, relativePath, handle)); + m_openFiles.Add(fileID.Value, new OpenFileObject(treeID, shareName, relativePath, handle, fileAccess)); } return fileID; } diff --git a/SMBLibrary/Server/ConnectionState/SMB2Session.cs b/SMBLibrary/Server/ConnectionState/SMB2Session.cs index f90c8b8..adcfce4 100644 --- a/SMBLibrary/Server/ConnectionState/SMB2Session.cs +++ b/SMBLibrary/Server/ConnectionState/SMB2Session.cs @@ -130,7 +130,7 @@ namespace SMBLibrary.Server return null; } - public FileID? AddOpenFile(uint treeID, string shareName, string relativePath, object handle) + public FileID? AddOpenFile(uint treeID, string shareName, string relativePath, object handle, FileAccess fileAccess) { lock (m_openFiles) { @@ -142,7 +142,7 @@ namespace SMBLibrary.Server // [MS-SMB2] FileId.Persistent MUST be set to Open.DurableFileId. // Note: We don't support durable handles so we use volatileFileID. fileID.Persistent = volatileFileID.Value; - m_openFiles.Add(volatileFileID.Value, new OpenFileObject(treeID, shareName, relativePath, handle)); + m_openFiles.Add(volatileFileID.Value, new OpenFileObject(treeID, shareName, relativePath, handle, fileAccess)); return fileID; } } diff --git a/SMBLibrary/Server/SMB1/NTCreateHelper.cs b/SMBLibrary/Server/SMB1/NTCreateHelper.cs index 711087c..a9e9fca 100644 --- a/SMBLibrary/Server/SMB1/NTCreateHelper.cs +++ b/SMBLibrary/Server/SMB1/NTCreateHelper.cs @@ -50,7 +50,8 @@ namespace SMBLibrary.Server.SMB1 return new ErrorResponse(request.CommandName); } - ushort? fileID = session.AddOpenFile(header.TID, share.Name, path, handle); + FileAccess fileAccess = NTFileStoreHelper.ToFileAccess(desiredAccess); + ushort? fileID = session.AddOpenFile(header.TID, share.Name, path, handle, fileAccess); if (!fileID.HasValue) { share.FileStore.CloseFile(handle); diff --git a/SMBLibrary/Server/SMB1/OpenAndXHelper.cs b/SMBLibrary/Server/SMB1/OpenAndXHelper.cs index 7a36e02..84cfef9 100644 --- a/SMBLibrary/Server/SMB1/OpenAndXHelper.cs +++ b/SMBLibrary/Server/SMB1/OpenAndXHelper.cs @@ -63,7 +63,8 @@ namespace SMBLibrary.Server.SMB1 return new ErrorResponse(request.CommandName); } - ushort? fileID = session.AddOpenFile(header.TID, share.Name, path, handle); + FileAccess fileAccess = ToFileAccess(request.AccessMode.AccessMode); + ushort? fileID = session.AddOpenFile(header.TID, share.Name, path, handle, fileAccess); if (!fileID.HasValue) { share.FileStore.CloseFile(handle); diff --git a/SMBLibrary/Server/SMB2/CreateHelper.cs b/SMBLibrary/Server/SMB2/CreateHelper.cs index 4cb3744..1c198cf 100644 --- a/SMBLibrary/Server/SMB2/CreateHelper.cs +++ b/SMBLibrary/Server/SMB2/CreateHelper.cs @@ -44,7 +44,8 @@ namespace SMBLibrary.Server.SMB2 return new ErrorResponse(request.CommandName, createStatus); } - FileID? fileID = session.AddOpenFile(request.Header.TreeID, share.Name, path, handle); + FileAccess fileAccess = NTFileStoreHelper.ToFileAccess(desiredAccess); + FileID? fileID = session.AddOpenFile(request.Header.TreeID, share.Name, path, handle, fileAccess); if (fileID == null) { share.FileStore.CloseFile(handle);