diff --git a/build/VStudio/winfsp_dll.vcxproj b/build/VStudio/winfsp_dll.vcxproj
index 3b33f8f0..d6999a41 100644
--- a/build/VStudio/winfsp_dll.vcxproj
+++ b/build/VStudio/winfsp_dll.vcxproj
@@ -26,12 +26,14 @@
+
+
diff --git a/build/VStudio/winfsp_dll.vcxproj.filters b/build/VStudio/winfsp_dll.vcxproj.filters
index ec83dbde..90c8237b 100644
--- a/build/VStudio/winfsp_dll.vcxproj.filters
+++ b/build/VStudio/winfsp_dll.vcxproj.filters
@@ -47,6 +47,9 @@
Include\fuse
+
+ Source\fuse
+
@@ -94,6 +97,9 @@
Source\fuse
+
+ Source\fuse
+
diff --git a/src/dll/fs.c b/src/dll/fs.c
index 701eaa12..c3ffe8a9 100644
--- a/src/dll/fs.c
+++ b/src/dll/fs.c
@@ -123,7 +123,6 @@ FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath,
FileSystem->Operations[FspFsctlTransactQueryDirectoryKind] = FspFileSystemOpQueryDirectory;
FileSystem->Operations[FspFsctlTransactQuerySecurityKind] = FspFileSystemOpQuerySecurity;
FileSystem->Operations[FspFsctlTransactSetSecurityKind] = FspFileSystemOpSetSecurity;
- // !!!: ...
FileSystem->Interface = Interface;
*PFileSystem = FileSystem;
diff --git a/src/dll/fuse/fuse.c b/src/dll/fuse/fuse.c
index 1d55a41e..3de0b70c 100644
--- a/src/dll/fuse/fuse.c
+++ b/src/dll/fuse/fuse.c
@@ -15,7 +15,7 @@
* software.
*/
-#include
+#include
#include
#define FSP_FUSE_CORE_OPT(n, f, v) { n, offsetof(struct fsp_fuse_core_opt_data, f), v }
@@ -284,6 +284,12 @@ FSP_FUSE_API struct fuse *fsp_fuse_new(struct fsp_fuse_env *env,
struct fuse_chan *ch, struct fuse_args *args,
const struct fuse_operations *ops, size_t opsize, void *data)
{
+ static FSP_FILE_SYSTEM_INTERFACE intf =
+ {
+ 0,
+ 0,
+ fsp_fuse_op_get_security_by_name,
+ };
struct fsp_fuse_core_opt_data opt_data;
struct fuse *f = 0;
PWSTR ServiceName = FspDiagIdent();
@@ -330,7 +336,7 @@ FSP_FUSE_API struct fuse *fsp_fuse_new(struct fsp_fuse_env *env,
FspServiceAllowConsoleMode(f->Service);
f->Service->UserContext = f;
- Result = FspFileSystemCreate(L"" FSP_FSCTL_NET_DEVICE_NAME, &opt_data.VolumeParams, 0,
+ Result = FspFileSystemCreate(L"" FSP_FSCTL_NET_DEVICE_NAME, &opt_data.VolumeParams, &intf,
&f->FileSystem);
if (!NT_SUCCESS(Result))
{
@@ -338,6 +344,36 @@ FSP_FUSE_API struct fuse *fsp_fuse_new(struct fsp_fuse_env *env,
goto fail;
}
+ 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, 0, 0);
+
if (opt_data.debug)
FspFileSystemSetDebugLog(f->FileSystem, -1);
diff --git a/src/dll/fuse/fuse_main.c b/src/dll/fuse/fuse_main.c
index 6b7d009c..63b170cb 100644
--- a/src/dll/fuse/fuse_main.c
+++ b/src/dll/fuse/fuse_main.c
@@ -15,7 +15,7 @@
* software.
*/
-#include
+#include
#include
#define FSP_FUSE_MAIN_OPT(n, f, v) { n, offsetof(struct fsp_fuse_main_opt_data, f), v }
diff --git a/src/dll/fuse/fuse_opt.c b/src/dll/fuse/fuse_opt.c
index 9cc74f48..427d584e 100644
--- a/src/dll/fuse/fuse_opt.c
+++ b/src/dll/fuse/fuse_opt.c
@@ -15,7 +15,7 @@
* software.
*/
-#include
+#include
#include
#include
diff --git a/src/dll/fuse/fuseop.c b/src/dll/fuse/fuseop.c
new file mode 100644
index 00000000..9d83de63
--- /dev/null
+++ b/src/dll/fuse/fuseop.c
@@ -0,0 +1,110 @@
+/**
+ * @file dll/fuse/fuseop.c
+ *
+ * @copyright 2015-2016 Bill Zissimopoulos
+ */
+/*
+ * This file is part of WinFsp.
+ *
+ * You can redistribute it and/or modify it under the terms of the
+ * GNU Affero General Public License version 3 as published by the
+ * Free Software Foundation.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * software.
+ */
+
+#include
+
+NTSTATUS fsp_fuse_op_get_security_by_name(FSP_FILE_SYSTEM *FileSystem,
+ PWSTR FileName, PUINT32 PFileAttributes,
+ PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize)
+{
+ /* not a true file system op, required for access checks! */
+ return STATUS_INVALID_DEVICE_REQUEST;
+}
+
+NTSTATUS fsp_fuse_op_create(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+{
+ return STATUS_INVALID_DEVICE_REQUEST;
+}
+
+NTSTATUS fsp_fuse_op_overwrite(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+{
+ return STATUS_INVALID_DEVICE_REQUEST;
+}
+
+NTSTATUS fsp_fuse_op_cleanup(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+{
+ return STATUS_INVALID_DEVICE_REQUEST;
+}
+
+NTSTATUS fsp_fuse_op_close(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+{
+ return STATUS_INVALID_DEVICE_REQUEST;
+}
+
+NTSTATUS fsp_fuse_op_read(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+{
+ return STATUS_INVALID_DEVICE_REQUEST;
+}
+
+NTSTATUS fsp_fuse_op_write(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
+{
+ 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)
+{
+ 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)
+{
+ 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)
+{
+ 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)
+{
+ 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)
+{
+ 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)
+{
+ 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)
+{
+ 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)
+{
+ return STATUS_INVALID_DEVICE_REQUEST;
+}
diff --git a/src/dll/fuse/library.h b/src/dll/fuse/library.h
new file mode 100644
index 00000000..bbab7ba3
--- /dev/null
+++ b/src/dll/fuse/library.h
@@ -0,0 +1,55 @@
+/**
+ * @file dll/fuse/library.h
+ *
+ * @copyright 2015-2016 Bill Zissimopoulos
+ */
+/*
+ * This file is part of WinFsp.
+ *
+ * You can redistribute it and/or modify it under the terms of the
+ * GNU Affero General Public License version 3 as published by the
+ * Free Software Foundation.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * software.
+ */
+
+#ifndef WINFSP_DLL_FUSE_LIBRARY_H_INCLUDED
+#define WINFSP_DLL_FUSE_LIBRARY_H_INCLUDED
+
+#include
+
+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);
+
+#endif