diff --git a/build/VStudio/winfsp_dll.vcxproj b/build/VStudio/winfsp_dll.vcxproj
index 67346b30..d1b9d4e8 100644
--- a/build/VStudio/winfsp_dll.vcxproj
+++ b/build/VStudio/winfsp_dll.vcxproj
@@ -33,7 +33,7 @@
-
+
diff --git a/build/VStudio/winfsp_dll.vcxproj.filters b/build/VStudio/winfsp_dll.vcxproj.filters
index 8e5d8446..1d7d16a2 100644
--- a/build/VStudio/winfsp_dll.vcxproj.filters
+++ b/build/VStudio/winfsp_dll.vcxproj.filters
@@ -97,12 +97,12 @@
Source\fuse
-
- Source\fuse
-
Source
+
+ Source\fuse
+
diff --git a/src/dll/fuse/fuse.c b/src/dll/fuse/fuse.c
index c38c8e9a..575388e5 100644
--- a/src/dll/fuse/fuse.c
+++ b/src/dll/fuse/fuse.c
@@ -240,12 +240,6 @@ static NTSTATUS fsp_fuse_preflight(struct fuse *f)
static NTSTATUS fsp_fuse_svcstart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv)
{
- static FSP_FILE_SYSTEM_INTERFACE intf =
- {
- 0,
- 0,
- fsp_fuse_op_get_security_by_name,
- };
struct fuse *f = Service->UserContext;
struct fuse_context *context;
struct fuse_conn_info conn;
@@ -339,7 +333,7 @@ static NTSTATUS fsp_fuse_svcstart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv)
Result = FspFileSystemCreate(
f->VolumeParams.Prefix[0] ?
L"" FSP_FSCTL_NET_DEVICE_NAME : L"" FSP_FSCTL_DISK_DEVICE_NAME,
- &f->VolumeParams, &intf,
+ &f->VolumeParams, &fsp_fuse_intf,
&f->FileSystem);
if (!NT_SUCCESS(Result))
{
@@ -347,38 +341,8 @@ static NTSTATUS fsp_fuse_svcstart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv)
L"Cannot create " FSP_FUSE_LIBRARY_NAME " file system.");
goto fail;
}
- f->FileSystem->UserContext = f;
- FspFileSystemSetOperation(f->FileSystem, FspFsctlTransactCreateKind,
- fsp_fuse_op_create);
- FspFileSystemSetOperation(f->FileSystem, FspFsctlTransactOverwriteKind,
- fsp_fuse_op_overwrite);
- FspFileSystemSetOperation(f->FileSystem, FspFsctlTransactCleanupKind,
- fsp_fuse_op_cleanup);
- FspFileSystemSetOperation(f->FileSystem, FspFsctlTransactCloseKind,
- fsp_fuse_op_close);
- FspFileSystemSetOperation(f->FileSystem, FspFsctlTransactReadKind,
- fsp_fuse_op_read);
- FspFileSystemSetOperation(f->FileSystem, FspFsctlTransactWriteKind,
- fsp_fuse_op_write);
- FspFileSystemSetOperation(f->FileSystem, FspFsctlTransactQueryInformationKind,
- fsp_fuse_op_query_information);
- FspFileSystemSetOperation(f->FileSystem, FspFsctlTransactSetInformationKind,
- fsp_fuse_op_set_information);
- FspFileSystemSetOperation(f->FileSystem, FspFsctlTransactFlushBuffersKind,
- fsp_fuse_op_flush_buffers);
- FspFileSystemSetOperation(f->FileSystem, FspFsctlTransactQueryVolumeInformationKind,
- fsp_fuse_op_query_volume_information);
- FspFileSystemSetOperation(f->FileSystem, FspFsctlTransactSetVolumeInformationKind,
- fsp_fuse_op_set_volume_information);
- FspFileSystemSetOperation(f->FileSystem, FspFsctlTransactQueryDirectoryKind,
- fsp_fuse_op_query_directory);
- FspFileSystemSetOperation(f->FileSystem, FspFsctlTransactQuerySecurityKind,
- fsp_fuse_op_query_security);
- FspFileSystemSetOperation(f->FileSystem, FspFsctlTransactSetSecurityKind,
- fsp_fuse_op_set_security);
- FspFileSystemSetOperationGuard(f->FileSystem, fsp_fuse_op_enter, fsp_fuse_op_leave);
-
+ f->FileSystem->UserContext = f;
FspFileSystemSetDebugLog(f->FileSystem, f->DebugLog);
if (L'\0' != f->MountPoint)
diff --git a/src/dll/fuse/fuseop.c b/src/dll/fuse/fuseintf.c
similarity index 54%
rename from src/dll/fuse/fuseop.c
rename to src/dll/fuse/fuseintf.c
index 14b947d6..21f082b7 100644
--- a/src/dll/fuse/fuseop.c
+++ b/src/dll/fuse/fuseintf.c
@@ -1,5 +1,5 @@
/**
- * @file dll/fuse/fuseop.c
+ * @file dll/fuse/fuseintf.c
*
* @copyright 2015-2016 Bill Zissimopoulos
*/
@@ -17,7 +17,7 @@
#include
-static NTSTATUS fsp_fuse_op_set_context(FSP_FILE_SYSTEM *FileSystem, HANDLE Token)
+static NTSTATUS fsp_fuse_intf_set_context(FSP_FILE_SYSTEM *FileSystem, HANDLE Token)
{
struct fuse_context *context;
UINT32 Uid = -1, Gid = -1;
@@ -114,23 +114,22 @@ exit:
return Result;
}
-VOID fsp_fuse_op_enter(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+NTSTATUS fsp_fuse_intf_GetVolumeInfo(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ FSP_FSCTL_VOLUME_INFO *VolumeInfo)
{
+ return STATUS_INVALID_DEVICE_REQUEST;
}
-VOID fsp_fuse_op_leave(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+NTSTATUS fsp_fuse_intf_SetVolumeLabel(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PWSTR VolumeLabel,
+ FSP_FSCTL_VOLUME_INFO *VolumeInfo)
{
- struct fuse_context *context;
-
- context = fsp_fuse_get_context(0);
- context->fuse = 0;
- context->uid = -1;
- context->gid = -1;
+ return STATUS_INVALID_DEVICE_REQUEST;
}
-NTSTATUS fsp_fuse_op_get_security_by_name(FSP_FILE_SYSTEM *FileSystem,
+NTSTATUS fsp_fuse_intf_GetSecurityByName(FSP_FILE_SYSTEM *FileSystem,
PWSTR FileName, PUINT32 PFileAttributes,
PSECURITY_DESCRIPTOR SecurityDescriptorBuf, SIZE_T *PSecurityDescriptorSize)
{
@@ -195,86 +194,160 @@ exit:
return Result;
}
-NTSTATUS fsp_fuse_op_create(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+NTSTATUS fsp_fuse_intf_Create(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PWSTR FileName, BOOLEAN CaseSensitive, UINT32 CreateOptions,
+ UINT32 FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize,
+ PVOID *PFileNode, FSP_FSCTL_FILE_INFO *FileInfo)
{
return STATUS_INVALID_DEVICE_REQUEST;
}
-NTSTATUS fsp_fuse_op_overwrite(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+NTSTATUS fsp_fuse_intf_Open(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PWSTR FileName, BOOLEAN CaseSensitive, UINT32 CreateOptions,
+ PVOID *PFileNode, FSP_FSCTL_FILE_INFO *FileInfo)
{
return STATUS_INVALID_DEVICE_REQUEST;
}
-NTSTATUS fsp_fuse_op_cleanup(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+NTSTATUS fsp_fuse_intf_Overwrite(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PVOID FileNode, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes,
+ FSP_FSCTL_FILE_INFO *FileInfo)
{
return STATUS_INVALID_DEVICE_REQUEST;
}
-NTSTATUS fsp_fuse_op_close(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+VOID fsp_fuse_intf_Cleanup(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PVOID FileNode, PWSTR FileName, BOOLEAN Delete)
+{
+}
+
+VOID fsp_fuse_intf_Close(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PVOID FileNode)
+{
+}
+
+NTSTATUS fsp_fuse_intf_Read(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PVOID FileNode, PVOID Buffer, UINT64 Offset, ULONG Length,
+ PULONG PBytesTransferred)
{
return STATUS_INVALID_DEVICE_REQUEST;
}
-NTSTATUS fsp_fuse_op_read(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+NTSTATUS fsp_fuse_intf_Write(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PVOID FileNode, PVOID Buffer, UINT64 Offset, ULONG Length,
+ BOOLEAN WriteToEndOfFile, BOOLEAN ConstrainedIo,
+ PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo)
{
return STATUS_INVALID_DEVICE_REQUEST;
}
-NTSTATUS fsp_fuse_op_write(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+NTSTATUS fsp_fuse_intf_Flush(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PVOID FileNode)
{
return STATUS_INVALID_DEVICE_REQUEST;
}
-NTSTATUS fsp_fuse_op_flush_buffers(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+NTSTATUS fsp_fuse_intf_GetFileInfo(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PVOID FileNode,
+ FSP_FSCTL_FILE_INFO *FileInfo)
{
return STATUS_INVALID_DEVICE_REQUEST;
}
-NTSTATUS fsp_fuse_op_query_information(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+NTSTATUS fsp_fuse_intf_SetBasicInfo(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PVOID FileNode, UINT32 FileAttributes,
+ UINT64 CreationTime, UINT64 LastAccessTime, UINT64 LastWriteTime,
+ FSP_FSCTL_FILE_INFO *FileInfo)
{
return STATUS_INVALID_DEVICE_REQUEST;
}
-NTSTATUS fsp_fuse_op_set_information(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+NTSTATUS fsp_fuse_intf_SetAllocationSize(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PVOID FileNode, UINT64 AllocationSize,
+ FSP_FSCTL_FILE_INFO *FileInfo)
{
return STATUS_INVALID_DEVICE_REQUEST;
}
-NTSTATUS fsp_fuse_op_query_volume_information(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+NTSTATUS fsp_fuse_intf_SetFileSize(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PVOID FileNode, UINT64 FileSize,
+ FSP_FSCTL_FILE_INFO *FileInfo)
{
return STATUS_INVALID_DEVICE_REQUEST;
}
-NTSTATUS fsp_fuse_op_set_volume_information(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+NTSTATUS fsp_fuse_intf_CanDelete(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PVOID FileNode, PWSTR FileName)
{
return STATUS_INVALID_DEVICE_REQUEST;
}
-NTSTATUS fsp_fuse_op_query_directory(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+NTSTATUS fsp_fuse_intf_Rename(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PVOID FileNode,
+ PWSTR FileName, PWSTR NewFileName, BOOLEAN ReplaceIfExists)
{
return STATUS_INVALID_DEVICE_REQUEST;
}
-NTSTATUS fsp_fuse_op_query_security(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+NTSTATUS fsp_fuse_intf_GetSecurity(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PVOID FileNode,
+ PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize)
{
return STATUS_INVALID_DEVICE_REQUEST;
}
-NTSTATUS fsp_fuse_op_set_security(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+NTSTATUS fsp_fuse_intf_SetSecurity(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PVOID FileNode,
+ SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR SecurityDescriptor)
{
return STATUS_INVALID_DEVICE_REQUEST;
}
+
+NTSTATUS fsp_fuse_intf_ReadDirectory(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PVOID FileNode, PVOID Buffer, UINT64 Offset, ULONG Length,
+ PWSTR Pattern,
+ PULONG PBytesTransferred)
+{
+ return STATUS_INVALID_DEVICE_REQUEST;
+}
+
+FSP_FILE_SYSTEM_INTERFACE fsp_fuse_intf =
+{
+ fsp_fuse_intf_GetVolumeInfo,
+ fsp_fuse_intf_SetVolumeLabel,
+ fsp_fuse_intf_GetSecurityByName,
+ fsp_fuse_intf_Create,
+ fsp_fuse_intf_Open,
+ fsp_fuse_intf_Overwrite,
+ fsp_fuse_intf_Cleanup,
+ fsp_fuse_intf_Close,
+ fsp_fuse_intf_Read,
+ fsp_fuse_intf_Write,
+ fsp_fuse_intf_Flush,
+ fsp_fuse_intf_GetFileInfo,
+ fsp_fuse_intf_SetBasicInfo,
+ fsp_fuse_intf_SetAllocationSize,
+ fsp_fuse_intf_SetFileSize,
+ fsp_fuse_intf_CanDelete,
+ fsp_fuse_intf_Rename,
+ fsp_fuse_intf_GetSecurity,
+ fsp_fuse_intf_SetSecurity,
+ fsp_fuse_intf_ReadDirectory,
+};
diff --git a/src/dll/fuse/library.h b/src/dll/fuse/library.h
index c753fb1e..bf04ad0c 100644
--- a/src/dll/fuse/library.h
+++ b/src/dll/fuse/library.h
@@ -37,40 +37,6 @@ struct fuse
BOOLEAN fsinit;
};
-VOID fsp_fuse_op_enter(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
-VOID fsp_fuse_op_leave(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
-NTSTATUS fsp_fuse_op_get_security_by_name(FSP_FILE_SYSTEM *FileSystem,
- PWSTR FileName, PUINT32 PFileAttributes,
- PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize);
-NTSTATUS fsp_fuse_op_create(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
-NTSTATUS fsp_fuse_op_overwrite(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
-NTSTATUS fsp_fuse_op_cleanup(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
-NTSTATUS fsp_fuse_op_close(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
-NTSTATUS fsp_fuse_op_read(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
-NTSTATUS fsp_fuse_op_write(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
-NTSTATUS fsp_fuse_op_flush_buffers(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
-NTSTATUS fsp_fuse_op_query_information(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
-NTSTATUS fsp_fuse_op_set_information(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
-NTSTATUS fsp_fuse_op_query_volume_information(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
-NTSTATUS fsp_fuse_op_set_volume_information(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
-NTSTATUS fsp_fuse_op_query_directory(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
-NTSTATUS fsp_fuse_op_query_security(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
-NTSTATUS fsp_fuse_op_set_security(FSP_FILE_SYSTEM *FileSystem,
- FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
+extern FSP_FILE_SYSTEM_INTERFACE fsp_fuse_intf;
#endif