diff --git a/SMBLibrary/Client/SMB2FileStore.cs b/SMBLibrary/Client/SMB2FileStore.cs index a6bc4218..8f08ba99 100644 --- a/SMBLibrary/Client/SMB2FileStore.cs +++ b/SMBLibrary/Client/SMB2FileStore.cs @@ -28,9 +28,27 @@ public SMB2FileStore(SMB2Client client, uint treeID, bool encryptShareData) } public NTStatus CreateFile(out object handle, out FileStatus fileStatus, string path, AccessMask desiredAccess, FileAttributes fileAttributes, ShareAccess shareAccess, CreateDisposition createDisposition, CreateOptions createOptions, SecurityContext securityContext) + { + List responseCreateContexts; + return CreateFile(out handle, out fileStatus, out responseCreateContexts, path, desiredAccess, fileAttributes, shareAccess, createDisposition, createOptions, securityContext, null); + } + + /// + /// Creates or opens a file, sending the given create contexts with the request and returning + /// the create contexts the server answered with. + /// + /// + /// [MS-SMB2] 2.2.13.2 create contexts to send, or null to send none. + /// + /// + /// The create contexts returned by the server, or null when the file was not opened. An open + /// that succeeded but drew no contexts from the server yields an empty list. + /// + public NTStatus CreateFile(out object handle, out FileStatus fileStatus, out List responseCreateContexts, string path, AccessMask desiredAccess, FileAttributes fileAttributes, ShareAccess shareAccess, CreateDisposition createDisposition, CreateOptions createOptions, SecurityContext securityContext, List createContexts) { handle = null; fileStatus = FileStatus.FILE_DOES_NOT_EXIST; + responseCreateContexts = null; CreateRequest request = new CreateRequest(); if (m_isDfsOperation) { @@ -45,6 +63,10 @@ public NTStatus CreateFile(out object handle, out FileStatus fileStatus, string request.CreateDisposition = createDisposition; request.CreateOptions = createOptions; request.ImpersonationLevel = ImpersonationLevel.Impersonation; + if (createContexts != null) + { + request.CreateContexts.AddRange(createContexts); + } TrySendCommand(request); SMB2Command response = m_client.WaitForCommand(request.MessageID, out bool connectionTerminated); @@ -55,6 +77,7 @@ public NTStatus CreateFile(out object handle, out FileStatus fileStatus, string CreateResponse createResponse = ((CreateResponse)response); handle = createResponse.FileId; fileStatus = ToFileStatus(createResponse.CreateAction); + responseCreateContexts = createResponse.CreateContexts; } return response.Header.Status; }