mirror of
https://github.com/TalAloni/SMBLibrary.git
synced 2025-08-17 04:33:46 +02:00
INTFileStore interface was added for better separation between the object store layer and the SMB layer
This commit is contained in:
parent
cc170322ed
commit
fb43fb966d
43 changed files with 1715 additions and 1487 deletions
184
SMBLibrary/Server/SMB1/SMB1FileStoreHelper.cs
Normal file
184
SMBLibrary/Server/SMB1/SMB1FileStoreHelper.cs
Normal file
|
@ -0,0 +1,184 @@
|
|||
/* Copyright (C) 2014-2017 Tal Aloni <tal.aloni.il@gmail.com>. 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 SMBLibrary.SMB1;
|
||||
using Utilities;
|
||||
|
||||
namespace SMBLibrary.Server.SMB1
|
||||
{
|
||||
public partial class SMB1FileStoreHelper
|
||||
{
|
||||
public static NTStatus CreateDirectory(INTFileStore fileStore, string path)
|
||||
{
|
||||
object handle;
|
||||
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);
|
||||
if (createStatus != NTStatus.STATUS_SUCCESS)
|
||||
{
|
||||
return createStatus;
|
||||
}
|
||||
fileStore.CloseFile(handle);
|
||||
return createStatus;
|
||||
}
|
||||
|
||||
public static NTStatus DeleteDirectory(INTFileStore fileStore, string path)
|
||||
{
|
||||
return Delete(fileStore, path, CreateOptions.FILE_DIRECTORY_FILE);
|
||||
}
|
||||
|
||||
public static NTStatus DeleteFile(INTFileStore fileStore, string path)
|
||||
{
|
||||
return Delete(fileStore, path, CreateOptions.FILE_NON_DIRECTORY_FILE);
|
||||
}
|
||||
|
||||
public static NTStatus Delete(INTFileStore fileStore, string path, CreateOptions createOptions)
|
||||
{
|
||||
object handle;
|
||||
FileStatus fileStatus;
|
||||
NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, path, DirectoryAccessMask.DELETE, 0, CreateDisposition.FILE_OPEN, createOptions);
|
||||
if (openStatus != NTStatus.STATUS_SUCCESS)
|
||||
{
|
||||
return openStatus;
|
||||
}
|
||||
FileDispositionInformation fileDispositionInfo = new FileDispositionInformation();
|
||||
fileDispositionInfo.DeletePending = true;
|
||||
NTStatus setStatus = fileStore.SetFileInformation(handle, fileDispositionInfo);
|
||||
if (setStatus != NTStatus.STATUS_SUCCESS)
|
||||
{
|
||||
return setStatus;
|
||||
}
|
||||
NTStatus closeStatus = fileStore.CloseFile(handle);
|
||||
return closeStatus;
|
||||
}
|
||||
|
||||
public static NTStatus Rename(INTFileStore fileStore, string oldName, string newName, SMBFileAttributes searchAttributes)
|
||||
{
|
||||
object handle;
|
||||
FileStatus fileStatus;
|
||||
CreateOptions createOptions = 0;
|
||||
if (searchAttributes == SMBFileAttributes.Normal)
|
||||
{
|
||||
createOptions = CreateOptions.FILE_NON_DIRECTORY_FILE;
|
||||
}
|
||||
else if ((searchAttributes & SMBFileAttributes.Directory) > 0)
|
||||
{
|
||||
createOptions = CreateOptions.FILE_DIRECTORY_FILE;
|
||||
}
|
||||
NTStatus openStatus = fileStore.CreateFile(out handle, out fileStatus, oldName, DirectoryAccessMask.DELETE, 0, CreateDisposition.FILE_OPEN, createOptions);
|
||||
if (openStatus != NTStatus.STATUS_SUCCESS)
|
||||
{
|
||||
return openStatus;
|
||||
}
|
||||
FileRenameInformationType2 renameInfo = new FileRenameInformationType2();
|
||||
renameInfo.ReplaceIfExists = false;
|
||||
renameInfo.FileName = newName;
|
||||
NTStatus setStatus = fileStore.SetFileInformation(handle, renameInfo);
|
||||
if (setStatus != NTStatus.STATUS_SUCCESS)
|
||||
{
|
||||
return setStatus;
|
||||
}
|
||||
NTStatus closeStatus = fileStore.CloseFile(handle);
|
||||
return closeStatus;
|
||||
}
|
||||
|
||||
public static NTStatus CheckDirectory(INTFileStore fileStore, string path)
|
||||
{
|
||||
object handle;
|
||||
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);
|
||||
if (openStatus != NTStatus.STATUS_SUCCESS)
|
||||
{
|
||||
return openStatus;
|
||||
}
|
||||
|
||||
fileStore.CloseFile(handle);
|
||||
return NTStatus.STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
public static NTStatus QueryInformation(out FileNetworkOpenInformation fileInfo, INTFileStore fileStore, string path)
|
||||
{
|
||||
object handle;
|
||||
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);
|
||||
if (openStatus != NTStatus.STATUS_SUCCESS)
|
||||
{
|
||||
fileInfo = null;
|
||||
return openStatus;
|
||||
}
|
||||
|
||||
fileInfo = NTFileStoreHelper.GetNetworkOpenInformation(fileStore, handle);
|
||||
return NTStatus.STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
public static NTStatus SetInformation(INTFileStore fileStore, string path, SMBFileAttributes fileAttributes, DateTime? lastWriteTime)
|
||||
{
|
||||
object handle;
|
||||
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);
|
||||
if (openStatus != NTStatus.STATUS_SUCCESS)
|
||||
{
|
||||
return openStatus;
|
||||
}
|
||||
|
||||
FileBasicInformation basicInfo = new FileBasicInformation();
|
||||
basicInfo.LastWriteTime = lastWriteTime;
|
||||
|
||||
if ((fileAttributes & SMBFileAttributes.Hidden) > 0)
|
||||
{
|
||||
basicInfo.FileAttributes |= FileAttributes.Hidden;
|
||||
}
|
||||
|
||||
if ((fileAttributes & SMBFileAttributes.ReadOnly) > 0)
|
||||
{
|
||||
basicInfo.FileAttributes |= FileAttributes.ReadOnly;
|
||||
}
|
||||
|
||||
if ((fileAttributes & SMBFileAttributes.Archive) > 0)
|
||||
{
|
||||
basicInfo.FileAttributes |= FileAttributes.Archive;
|
||||
}
|
||||
|
||||
return fileStore.SetFileInformation(handle, basicInfo);
|
||||
}
|
||||
|
||||
public static NTStatus SetInformation2(INTFileStore fileStore, object handle, DateTime? creationTime, DateTime? lastAccessTime, DateTime? lastWriteTime)
|
||||
{
|
||||
FileNetworkOpenInformation fileInfo = NTFileStoreHelper.GetNetworkOpenInformation(fileStore, handle);
|
||||
FileBasicInformation basicInfo = new FileBasicInformation();
|
||||
basicInfo.FileAttributes = fileInfo.FileAttributes;
|
||||
basicInfo.CreationTime = creationTime;
|
||||
basicInfo.LastAccessTime = lastAccessTime;
|
||||
basicInfo.LastWriteTime = lastWriteTime;
|
||||
return fileStore.SetFileInformation(handle, basicInfo);
|
||||
}
|
||||
|
||||
public static SMBFileAttributes GetFileAttributes(FileAttributes attributes)
|
||||
{
|
||||
SMBFileAttributes result = SMBFileAttributes.Normal;
|
||||
if ((attributes & FileAttributes.Hidden) > 0)
|
||||
{
|
||||
result |= SMBFileAttributes.Hidden;
|
||||
}
|
||||
if ((attributes & FileAttributes.ReadOnly) > 0)
|
||||
{
|
||||
result |= SMBFileAttributes.ReadOnly;
|
||||
}
|
||||
if ((attributes & FileAttributes.Archive) > 0)
|
||||
{
|
||||
result |= SMBFileAttributes.Archive;
|
||||
}
|
||||
if ((attributes & FileAttributes.Directory) > 0)
|
||||
{
|
||||
result |= SMBFileAttributes.Directory;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue