mirror of
https://github.com/TalAloni/SMBLibrary.git
synced 2025-07-26 02:38:15 +02:00
INTFileStore: CreateFile: Added FileAttributes parameter
This commit is contained in:
parent
1fbd003b0d
commit
2f39e9072c
10 changed files with 30 additions and 15 deletions
|
@ -25,7 +25,7 @@ namespace SMBLibrary
|
||||||
m_fileSystem = fileSystem;
|
m_fileSystem = fileSystem;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NTStatus CreateFile(out object handle, out FileStatus fileStatus, string path, AccessMask desiredAccess, ShareAccess shareAccess, CreateDisposition createDisposition, CreateOptions createOptions, SecurityContext securityContext)
|
public NTStatus CreateFile(out object handle, out FileStatus fileStatus, string path, AccessMask desiredAccess, FileAttributes fileAttributes, ShareAccess shareAccess, CreateDisposition createDisposition, CreateOptions createOptions, SecurityContext securityContext)
|
||||||
{
|
{
|
||||||
handle = null;
|
handle = null;
|
||||||
fileStatus = FileStatus.FILE_DOES_NOT_EXIST;
|
fileStatus = FileStatus.FILE_DOES_NOT_EXIST;
|
||||||
|
|
|
@ -16,7 +16,7 @@ namespace SMBLibrary
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface INTFileStore
|
public interface INTFileStore
|
||||||
{
|
{
|
||||||
NTStatus CreateFile(out object handle, out FileStatus fileStatus, string path, AccessMask desiredAccess, ShareAccess shareAccess, CreateDisposition createDisposition, CreateOptions createOptions, SecurityContext securityContext);
|
NTStatus CreateFile(out object handle, out FileStatus fileStatus, string path, AccessMask desiredAccess, FileAttributes fileAttributes, ShareAccess shareAccess, CreateDisposition createDisposition, CreateOptions createOptions, SecurityContext securityContext);
|
||||||
|
|
||||||
NTStatus CloseFile(object handle);
|
NTStatus CloseFile(object handle);
|
||||||
|
|
||||||
|
|
|
@ -103,7 +103,7 @@ namespace SMBLibrary
|
||||||
{
|
{
|
||||||
object handle;
|
object handle;
|
||||||
FileStatus fileStatus;
|
FileStatus fileStatus;
|
||||||
NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, path, FileAccessMask.FILE_READ_ATTRIBUTES, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, 0, securityContext);
|
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);
|
||||||
if (openStatus != NTStatus.STATUS_SUCCESS)
|
if (openStatus != NTStatus.STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -22,7 +22,7 @@ namespace SMBLibrary
|
||||||
m_services = services;
|
m_services = services;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NTStatus CreateFile(out object handle, out FileStatus fileStatus, string path, AccessMask desiredAccess, ShareAccess shareAccess, CreateDisposition createDisposition, CreateOptions createOptions, SecurityContext securityContext)
|
public NTStatus CreateFile(out object handle, out FileStatus fileStatus, string path, AccessMask desiredAccess, FileAttributes fileAttributes, ShareAccess shareAccess, CreateDisposition createDisposition, CreateOptions createOptions, SecurityContext securityContext)
|
||||||
{
|
{
|
||||||
fileStatus = FileStatus.FILE_DOES_NOT_EXIST;
|
fileStatus = FileStatus.FILE_DOES_NOT_EXIST;
|
||||||
// It is possible to have a named pipe that does not use RPC (e.g. MS-WSP),
|
// It is possible to have a named pipe that does not use RPC (e.g. MS-WSP),
|
||||||
|
|
|
@ -39,7 +39,8 @@ namespace SMBLibrary.Server.SMB1
|
||||||
|
|
||||||
object handle;
|
object handle;
|
||||||
FileStatus fileStatus;
|
FileStatus fileStatus;
|
||||||
NTStatus createStatus = share.FileStore.CreateFile(out handle, out fileStatus, path, request.DesiredAccess, request.ShareAccess, request.CreateDisposition, request.CreateOptions, session.SecurityContext);
|
FileAttributes fileAttributes = ToFileAttributes(request.ExtFileAttributes);
|
||||||
|
NTStatus createStatus = share.FileStore.CreateFile(out handle, out fileStatus, path, request.DesiredAccess, fileAttributes, request.ShareAccess, request.CreateDisposition, request.CreateOptions, session.SecurityContext);
|
||||||
if (createStatus != NTStatus.STATUS_SUCCESS)
|
if (createStatus != NTStatus.STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
state.LogToServer(Severity.Verbose, "Create: Opening '{0}{1}' failed. NTStatus: {2}.", share.Name, path, createStatus);
|
state.LogToServer(Severity.Verbose, "Create: Opening '{0}{1}' failed. NTStatus: {2}.", share.Name, path, createStatus);
|
||||||
|
@ -191,5 +192,19 @@ namespace SMBLibrary.Server.SMB1
|
||||||
return CreateDisposition.FILE_OPEN;
|
return CreateDisposition.FILE_OPEN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static FileAttributes ToFileAttributes(ExtendedFileAttributes extendedFileAttributes)
|
||||||
|
{
|
||||||
|
// We only return flags that can be used with NtCreateFile
|
||||||
|
FileAttributes fileAttributes = FileAttributes.ReadOnly |
|
||||||
|
FileAttributes.Hidden |
|
||||||
|
FileAttributes.System |
|
||||||
|
FileAttributes.Archive |
|
||||||
|
FileAttributes.Normal |
|
||||||
|
FileAttributes.Temporary |
|
||||||
|
FileAttributes.Offline |
|
||||||
|
FileAttributes.Encrypted;
|
||||||
|
return (fileAttributes & (FileAttributes)extendedFileAttributes);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ namespace SMBLibrary.Server.SMB1
|
||||||
|
|
||||||
object handle;
|
object handle;
|
||||||
FileStatus fileStatus;
|
FileStatus fileStatus;
|
||||||
header.Status = share.FileStore.CreateFile(out handle, out fileStatus, path, desiredAccess, shareAccess, createDisposition, createOptions, session.SecurityContext);
|
header.Status = share.FileStore.CreateFile(out handle, out fileStatus, path, desiredAccess, 0, shareAccess, createDisposition, createOptions, session.SecurityContext);
|
||||||
if (header.Status != NTStatus.STATUS_SUCCESS)
|
if (header.Status != NTStatus.STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
state.LogToServer(Severity.Verbose, "OpenAndX: Opening '{0}{1}' failed. NTStatus: {2}.", share.Name, path, header.Status);
|
state.LogToServer(Severity.Verbose, "OpenAndX: Opening '{0}{1}' failed. NTStatus: {2}.", share.Name, path, header.Status);
|
||||||
|
|
|
@ -18,7 +18,7 @@ namespace SMBLibrary.Server.SMB1
|
||||||
{
|
{
|
||||||
object handle;
|
object handle;
|
||||||
FileStatus fileStatus;
|
FileStatus fileStatus;
|
||||||
NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, path, FileAccessMask.FILE_READ_ATTRIBUTES, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, 0, securityContext);
|
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);
|
||||||
if (openStatus != NTStatus.STATUS_SUCCESS)
|
if (openStatus != NTStatus.STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
result = null;
|
result = null;
|
||||||
|
|
|
@ -31,7 +31,7 @@ namespace SMBLibrary.Server.SMB1
|
||||||
string fileName = fileNamePattern.Substring(separatorIndex + 1);
|
string fileName = fileNamePattern.Substring(separatorIndex + 1);
|
||||||
object handle;
|
object handle;
|
||||||
FileStatus fileStatus;
|
FileStatus fileStatus;
|
||||||
NTStatus createStatus = fileStore.CreateFile(out handle, out fileStatus, path, DirectoryAccessMask.FILE_LIST_DIRECTORY | DirectoryAccessMask.FILE_TRAVERSE, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, CreateOptions.FILE_DIRECTORY_FILE, securityContext);
|
NTStatus createStatus = fileStore.CreateFile(out handle, out fileStatus, path, DirectoryAccessMask.FILE_LIST_DIRECTORY | DirectoryAccessMask.FILE_TRAVERSE, 0, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, CreateOptions.FILE_DIRECTORY_FILE, securityContext);
|
||||||
if (createStatus != NTStatus.STATUS_SUCCESS)
|
if (createStatus != NTStatus.STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
result = null;
|
result = null;
|
||||||
|
|
|
@ -18,7 +18,7 @@ namespace SMBLibrary.Server.SMB1
|
||||||
{
|
{
|
||||||
object handle;
|
object handle;
|
||||||
FileStatus fileStatus;
|
FileStatus fileStatus;
|
||||||
NTStatus createStatus = fileStore.CreateFile(out handle, out fileStatus, path, DirectoryAccessMask.FILE_ADD_SUBDIRECTORY, 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, 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)
|
if (createStatus != NTStatus.STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
return createStatus;
|
return createStatus;
|
||||||
|
@ -41,7 +41,7 @@ namespace SMBLibrary.Server.SMB1
|
||||||
{
|
{
|
||||||
object handle;
|
object handle;
|
||||||
FileStatus fileStatus;
|
FileStatus fileStatus;
|
||||||
NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, path, DirectoryAccessMask.DELETE, 0, CreateDisposition.FILE_OPEN, createOptions, securityContext);
|
NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, path, DirectoryAccessMask.DELETE, 0, 0, CreateDisposition.FILE_OPEN, createOptions, securityContext);
|
||||||
if (openStatus != NTStatus.STATUS_SUCCESS)
|
if (openStatus != NTStatus.STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
return openStatus;
|
return openStatus;
|
||||||
|
@ -68,7 +68,7 @@ namespace SMBLibrary.Server.SMB1
|
||||||
{
|
{
|
||||||
createOptions = CreateOptions.FILE_NON_DIRECTORY_FILE;
|
createOptions = CreateOptions.FILE_NON_DIRECTORY_FILE;
|
||||||
}
|
}
|
||||||
NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, oldName, DirectoryAccessMask.DELETE, 0, CreateDisposition.FILE_OPEN, createOptions, securityContext);
|
NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, oldName, DirectoryAccessMask.DELETE, 0, 0, CreateDisposition.FILE_OPEN, createOptions, securityContext);
|
||||||
if (openStatus != NTStatus.STATUS_SUCCESS)
|
if (openStatus != NTStatus.STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
return openStatus;
|
return openStatus;
|
||||||
|
@ -89,7 +89,7 @@ namespace SMBLibrary.Server.SMB1
|
||||||
{
|
{
|
||||||
object handle;
|
object handle;
|
||||||
FileStatus fileStatus;
|
FileStatus fileStatus;
|
||||||
NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, path, (AccessMask)0, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, CreateOptions.FILE_DIRECTORY_FILE, securityContext);
|
NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, path, (AccessMask)0, 0, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, CreateOptions.FILE_DIRECTORY_FILE, securityContext);
|
||||||
if (openStatus != NTStatus.STATUS_SUCCESS)
|
if (openStatus != NTStatus.STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
return openStatus;
|
return openStatus;
|
||||||
|
@ -103,7 +103,7 @@ namespace SMBLibrary.Server.SMB1
|
||||||
{
|
{
|
||||||
object handle;
|
object handle;
|
||||||
FileStatus fileStatus;
|
FileStatus fileStatus;
|
||||||
NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, path, FileAccessMask.FILE_READ_ATTRIBUTES, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, 0, securityContext);
|
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);
|
||||||
if (openStatus != NTStatus.STATUS_SUCCESS)
|
if (openStatus != NTStatus.STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
fileInfo = null;
|
fileInfo = null;
|
||||||
|
@ -118,7 +118,7 @@ namespace SMBLibrary.Server.SMB1
|
||||||
{
|
{
|
||||||
object handle;
|
object handle;
|
||||||
FileStatus fileStatus;
|
FileStatus fileStatus;
|
||||||
NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, path, FileAccessMask.FILE_WRITE_ATTRIBUTES, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, 0, securityContext);
|
NTStatus openStatus = 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);
|
||||||
if (openStatus != NTStatus.STATUS_SUCCESS)
|
if (openStatus != NTStatus.STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
return openStatus;
|
return openStatus;
|
||||||
|
|
|
@ -35,7 +35,7 @@ namespace SMBLibrary.Server.SMB2
|
||||||
|
|
||||||
object handle;
|
object handle;
|
||||||
FileStatus fileStatus;
|
FileStatus fileStatus;
|
||||||
NTStatus createStatus = share.FileStore.CreateFile(out handle, out fileStatus, path, request.DesiredAccess, request.ShareAccess, request.CreateDisposition, request.CreateOptions, session.SecurityContext);
|
NTStatus createStatus = share.FileStore.CreateFile(out handle, out fileStatus, path, request.DesiredAccess, request.FileAttributes, request.ShareAccess, request.CreateDisposition, request.CreateOptions, session.SecurityContext);
|
||||||
if (createStatus != NTStatus.STATUS_SUCCESS)
|
if (createStatus != NTStatus.STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
state.LogToServer(Severity.Verbose, "Create: Opening '{0}{1}' failed. NTStatus: {2}.", share.Name, path, createStatus);
|
state.LogToServer(Severity.Verbose, "Create: Opening '{0}{1}' failed. NTStatus: {2}.", share.Name, path, createStatus);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue