2020-08-30 14:22:41 +01:00
|
|
|
using System;
|
|
|
|
|
using Fsp;
|
2020-09-02 16:53:21 +01:00
|
|
|
using Fsp.Interop;
|
2020-08-30 14:22:41 +01:00
|
|
|
|
|
|
|
|
namespace RomRepoMgr.Core.Filesystem
|
|
|
|
|
{
|
|
|
|
|
public class Winfsp : FileSystemBase
|
|
|
|
|
{
|
2020-09-02 16:53:21 +01:00
|
|
|
FileSystemHost _host;
|
|
|
|
|
|
2020-08-30 14:22:41 +01:00
|
|
|
public static bool IsAvailable
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
Version winfspVersion = FileSystemHost.Version();
|
|
|
|
|
|
|
|
|
|
if(winfspVersion == null)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
return winfspVersion.Major == 1 && winfspVersion.Minor >= 7;
|
|
|
|
|
}
|
|
|
|
|
catch(Exception)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-09-02 16:53:21 +01:00
|
|
|
|
|
|
|
|
internal bool Mount(string mountPoint)
|
|
|
|
|
{
|
|
|
|
|
_host = new FileSystemHost(this);
|
|
|
|
|
int ret = _host.Mount(mountPoint);
|
|
|
|
|
|
|
|
|
|
if(ret == STATUS_SUCCESS)
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
_host = null;
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal void Umount() => _host?.Unmount();
|
|
|
|
|
|
2020-09-02 23:52:38 +01:00
|
|
|
public override int SetVolumeLabel(string volumeLabel, out VolumeInfo volumeInfo)
|
2020-09-02 16:53:21 +01:00
|
|
|
{
|
2020-09-02 23:52:38 +01:00
|
|
|
volumeInfo = default;
|
2020-09-02 16:53:21 +01:00
|
|
|
|
|
|
|
|
return STATUS_MEDIA_WRITE_PROTECTED;
|
|
|
|
|
}
|
2020-09-02 23:52:38 +01:00
|
|
|
|
|
|
|
|
public override int Create(string fileName, uint createOptions, uint grantedAccess, uint fileAttributes,
|
|
|
|
|
byte[] securityDescriptor, ulong allocationSize, out object fileNode,
|
|
|
|
|
out object fileDesc, out FileInfo fileInfo, out string normalizedName)
|
|
|
|
|
{
|
|
|
|
|
fileNode = default;
|
|
|
|
|
fileDesc = default;
|
|
|
|
|
fileInfo = default;
|
|
|
|
|
normalizedName = default;
|
|
|
|
|
|
|
|
|
|
return STATUS_MEDIA_WRITE_PROTECTED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override int Overwrite(object fileNode, object fileDesc, uint fileAttributes, bool replaceFileAttributes,
|
|
|
|
|
ulong allocationSize, out FileInfo fileInfo)
|
|
|
|
|
{
|
|
|
|
|
fileInfo = default;
|
|
|
|
|
|
|
|
|
|
return STATUS_MEDIA_WRITE_PROTECTED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override int Write(object fileNode, object fileDesc, IntPtr buffer, ulong offset, uint length,
|
|
|
|
|
bool writeToEndOfFile, bool constrainedIo, out uint bytesTransferred,
|
|
|
|
|
out FileInfo fileInfo)
|
|
|
|
|
{
|
|
|
|
|
bytesTransferred = default;
|
|
|
|
|
fileInfo = default;
|
|
|
|
|
|
|
|
|
|
return STATUS_MEDIA_WRITE_PROTECTED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override int SetBasicInfo(object fileNode, object fileDesc, uint fileAttributes, ulong creationTime,
|
|
|
|
|
ulong lastAccessTime, ulong lastWriteTime, ulong changeTime,
|
|
|
|
|
out FileInfo fileInfo)
|
|
|
|
|
{
|
|
|
|
|
fileInfo = default;
|
|
|
|
|
|
|
|
|
|
return STATUS_MEDIA_WRITE_PROTECTED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override int SetFileSize(object fileNode, object fileDesc, ulong newSize, bool setAllocationSize,
|
|
|
|
|
out FileInfo fileInfo)
|
|
|
|
|
{
|
|
|
|
|
fileInfo = default;
|
|
|
|
|
|
|
|
|
|
return STATUS_MEDIA_WRITE_PROTECTED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override int CanDelete(object fileNode, object fileDesc, string fileName) =>
|
|
|
|
|
STATUS_MEDIA_WRITE_PROTECTED;
|
|
|
|
|
|
|
|
|
|
public override int Rename(object fileNode, object fileDesc, string fileName, string newFileName,
|
|
|
|
|
bool replaceIfExists) => STATUS_MEDIA_WRITE_PROTECTED;
|
2020-08-30 14:22:41 +01:00
|
|
|
}
|
|
|
|
|
}
|