Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions SMBLibrary/Client/SMB2FileStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<CreateContext> responseCreateContexts;
return CreateFile(out handle, out fileStatus, out responseCreateContexts, path, desiredAccess, fileAttributes, shareAccess, createDisposition, createOptions, securityContext, null);
}

/// <summary>
/// Creates or opens a file, sending the given create contexts with the request and returning
/// the create contexts the server answered with.
/// </summary>
/// <param name="createContexts">
/// [MS-SMB2] 2.2.13.2 create contexts to send, or null to send none.
/// </param>
/// <param name="responseCreateContexts">
/// 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.
/// </param>
public NTStatus CreateFile(out object handle, out FileStatus fileStatus, out List<CreateContext> responseCreateContexts, string path, AccessMask desiredAccess, FileAttributes fileAttributes, ShareAccess shareAccess, CreateDisposition createDisposition, CreateOptions createOptions, SecurityContext securityContext, List<CreateContext> createContexts)
{
handle = null;
fileStatus = FileStatus.FILE_DOES_NOT_EXIST;
responseCreateContexts = null;
CreateRequest request = new CreateRequest();
if (m_isDfsOperation)
{
Expand All @@ -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);
Expand All @@ -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;
}
Expand Down