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