initial commit
Some checks failed
BlockStorage/repertory_osx/pipeline/head There was a failure building this commit
BlockStorage/repertory_windows/pipeline/head This commit looks good
BlockStorage/repertory_linux_builds/pipeline/head This commit looks good

This commit is contained in:
2022-03-05 00:30:50 -06:00
commit 3ff46723b8
626 changed files with 178600 additions and 0 deletions

View File

@ -0,0 +1,94 @@
/*
Copyright <2018-2022> <scott.e.graves@protonmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_I_REMOTE_INSTANCE_HPP_
#define INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_I_REMOTE_INSTANCE_HPP_
#include "common.hpp"
#include "drives/remote/i_remote_json.hpp"
namespace repertory::remote_winfsp {
class i_remote_instance : public virtual i_remote_json {
INTERFACE_SETUP(i_remote_instance);
public:
virtual packet::error_type winfsp_can_delete(PVOID fileDesc, PWSTR fileName) = 0;
virtual packet::error_type winfsp_cleanup(PVOID fileDesc, PWSTR fileName, UINT32 flags,
BOOLEAN &wasClosed) = 0;
virtual packet::error_type winfsp_close(PVOID fileDesc) = 0;
virtual packet::error_type winfsp_create(PWSTR fileName, UINT32 createOptions,
UINT32 grantedAccess, UINT32 fileAttributes,
UINT64 allocationSize, PVOID *fileDesc,
remote::file_info *fileInfo, std::string &normalizedName,
BOOLEAN &exists) = 0;
virtual packet::error_type winfsp_flush(PVOID fileDesc, remote::file_info *fileInfo) = 0;
virtual packet::error_type winfsp_get_dir_buffer(PVOID fileDesc, PVOID *&ptr) = 0;
virtual packet::error_type winfsp_get_file_info(PVOID fileDesc, remote::file_info *fileInfo) = 0;
virtual packet::error_type winfsp_get_security_by_name(PWSTR fileName, PUINT32 fileAttributes,
std::uint64_t *securityDescriptorSize,
std::wstring &strDescriptor) = 0;
virtual packet::error_type winfsp_get_volume_info(UINT64 &totalSize, UINT64 &freeSize,
std::string &volumeLabel) = 0;
virtual packet::error_type winfsp_mounted(const std::wstring &location) = 0;
virtual packet::error_type winfsp_open(PWSTR fileName, UINT32 createOptions, UINT32 grantedAccess,
PVOID *fileDesc, remote::file_info *fileInfo,
std::string &normalizedName) = 0;
virtual packet::error_type winfsp_overwrite(PVOID fileDesc, UINT32 fileAttributes,
BOOLEAN replaceFileAttributes, UINT64 allocationSize,
remote::file_info *fileInfo) = 0;
virtual packet::error_type winfsp_read(PVOID fileDesc, PVOID buffer, UINT64 offset, UINT32 length,
PUINT32 bytesTransferred) = 0;
virtual packet::error_type winfsp_read_directory(PVOID fileDesc, PWSTR pattern, PWSTR marker,
json &itemList) = 0;
virtual packet::error_type winfsp_rename(PVOID fileDesc, PWSTR fileName, PWSTR newFileName,
BOOLEAN replaceIfExists) = 0;
virtual packet::error_type winfsp_set_basic_info(PVOID fileDesc, UINT32 fileAttributes,
UINT64 creationTime, UINT64 lastAccessTime,
UINT64 lastWriteTime, UINT64 changeTime,
remote::file_info *fileInfo) = 0;
virtual packet::error_type winfsp_set_file_size(PVOID fileDesc, UINT64 newSize,
BOOLEAN setAllocationSize,
remote::file_info *fileInfo) = 0;
virtual packet::error_type winfsp_unmounted(const std::wstring &location) = 0;
virtual packet::error_type winfsp_write(PVOID fileDesc, PVOID buffer, UINT64 offset,
UINT32 length, BOOLEAN writeToEndOfFile,
BOOLEAN constrainedIo, PUINT32 bytesTransferred,
remote::file_info *fileInfo) = 0;
};
typedef std::function<std::unique_ptr<i_remote_instance>()> remote_instance_factory;
} // namespace repertory::remote_winfsp
#endif // INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_I_REMOTE_INSTANCE_HPP_

View File

@ -0,0 +1,125 @@
/*
Copyright <2018-2022> <scott.e.graves@protonmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_CLIENT_HPP_
#define INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_CLIENT_HPP_
#include "common.hpp"
#include "comm/packet/packet.hpp"
#include "comm/packet/packet_client.hpp"
#include "drives/winfsp/remotewinfsp/i_remote_instance.hpp"
#include "drives/remote/remote_open_file_table.hpp"
namespace repertory {
class app_config;
namespace remote_winfsp {
class remote_client final : public remote_open_file_table, public virtual i_remote_instance {
public:
explicit remote_client(const app_config &config);
private:
const app_config &config_;
packet_client packet_client_;
private:
#ifdef _WIN32
#define to_handle(x) (x)
#else
static OSHandle to_handle(PVOID file_desc) {
return static_cast<OSHandle>(reinterpret_cast<std::uint64_t>(file_desc));
}
#endif
protected:
void delete_open_directory(void * /*dir*/) override {}
public:
packet::error_type json_create_directory_snapshot(const std::string &path,
json &json_data) override;
packet::error_type json_read_directory_snapshot(const std::string &path,
const remote::file_handle &handle,
const std::uint32_t &page,
json &json_data) override;
packet::error_type json_release_directory_snapshot(const std::string &path,
const remote::file_handle &handle) override;
packet::error_type winfsp_can_delete(PVOID file_desc, PWSTR file_name) override;
packet::error_type winfsp_cleanup(PVOID file_desc, PWSTR file_name, UINT32 flags,
BOOLEAN &was_closed) override;
packet::error_type winfsp_close(PVOID file_desc) override;
packet::error_type winfsp_create(PWSTR file_name, UINT32 create_options, UINT32 granted_access,
UINT32 attributes, UINT64 allocation_size, PVOID *file_desc,
remote::file_info *file_info, std::string &normalized_name,
BOOLEAN &exists) override;
packet::error_type winfsp_flush(PVOID file_desc, remote::file_info *file_info) override;
packet::error_type winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) override;
packet::error_type winfsp_get_file_info(PVOID file_desc, remote::file_info *file_info) override;
packet::error_type winfsp_get_security_by_name(PWSTR file_name, PUINT32 attributes,
std::uint64_t *descriptor_size,
std::wstring &string_descriptor) override;
packet::error_type winfsp_get_volume_info(UINT64 &total_size, UINT64 &free_size,
std::string &volume_label) override;
packet::error_type winfsp_mounted(const std::wstring &location) override;
packet::error_type winfsp_open(PWSTR file_name, UINT32 create_options, UINT32 granted_access,
PVOID *file_desc, remote::file_info *file_info,
std::string &normalized_name) override;
packet::error_type winfsp_overwrite(PVOID file_desc, UINT32 attributes,
BOOLEAN replace_attributes, UINT64 allocation_size,
remote::file_info *file_info) override;
packet::error_type winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length,
PUINT32 bytes_transferred) override;
packet::error_type winfsp_read_directory(PVOID file_desc, PWSTR pattern, PWSTR marker,
json &itemList) override;
packet::error_type winfsp_rename(PVOID file_desc, PWSTR file_name, PWSTR new_file_name,
BOOLEAN replace_if_exists) override;
packet::error_type winfsp_set_basic_info(PVOID file_desc, UINT32 attributes, UINT64 creation_time,
UINT64 last_access_time, UINT64 last_write_time,
UINT64 change_time,
remote::file_info *file_info) override;
packet::error_type winfsp_set_file_size(PVOID file_desc, UINT64 new_size,
BOOLEAN set_allocation_size,
remote::file_info *file_info) override;
packet::error_type winfsp_unmounted(const std::wstring &location) override;
packet::error_type winfsp_write(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length,
BOOLEAN write_to_end, BOOLEAN constrained_io,
PUINT32 bytes_transferred, remote::file_info *file_info) override;
};
} // namespace remote_winfsp
} // namespace repertory
#endif // INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_CLIENT_HPP_

View File

@ -0,0 +1,241 @@
/*
Copyright <2018-2022> <scott.e.graves@protonmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
// NOTE: Most of the WinFSP pass-through code has been modified from:
// https://github.com/billziss-gh/winfsp/blob/master/tst/passthrough-cpp/passthrough-cpp.cpp
#ifndef INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_SERVER_HPP_
#define INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_SERVER_HPP_
#ifdef _WIN32
#include "common.hpp"
#include "comm/packet/packet.hpp"
#include "drives/remote/remote_server_base.hpp"
#include "drives/winfsp/i_winfsp_drive.hpp"
namespace repertory {
class app_config;
namespace remote_winfsp {
class remote_server final : public virtual remote_server_base<i_winfsp_drive> {
public:
remote_server(app_config &config, i_winfsp_drive &drive, const std::string &mount_location)
: remote_server_base(config, drive, mount_location) {}
private:
std::string construct_path(std::string path);
packet::error_type populate_file_info(const std::string &api_path, remote::file_info &file_info);
void populate_stat(const char *path, const bool &directory, remote::stat &st,
const struct _stat64 &st1);
public:
// FUSE Layer
packet::error_type fuse_access(const char *path, const std::int32_t &mask) override;
packet::error_type fuse_chflags(const char *path, const std::uint32_t &flags) override;
packet::error_type fuse_chmod(const char *path, const remote::file_mode &mode) override;
packet::error_type fuse_chown(const char *path, const remote::user_id &uid,
const remote::group_id &gid) override;
packet::error_type fuse_destroy() override;
/*packet::error_type fuse_fallocate(const char *path, const std::int32_t &mode,
const remote::file_offset &offset,
const remote::file_offset &length,
const remote::file_handle &handle) override ;*/
packet::error_type fuse_fgetattr(const char *path, remote::stat &st, bool &directory,
const remote::file_handle &handle) override;
packet::error_type fuse_fsetattr_x(const char *path, const remote::setattr_x &attr,
const remote::file_handle &handle) override;
packet::error_type fuse_fsync(const char *path, const std::int32_t &datasync,
const remote::file_handle &handle) override;
packet::error_type fuse_ftruncate(const char *path, const remote::file_offset &size,
const remote::file_handle &handle) override;
packet::error_type fuse_getattr(const char *path, remote::stat &st, bool &directory) override;
/*packet::error_type fuse_getxattr(const char *path, const char *name, char *value,
const remote::file_size &size) override ;
packet::error_type fuse_getxattrOSX(const char *path, const char *name, char *value,
const remote::file_size &size,
const std::uint32_t &position) override ;*/
packet::error_type fuse_getxtimes(const char *path, remote::file_time &bkuptime,
remote::file_time &crtime) override;
packet::error_type fuse_init() override;
/*packet::error_type fuse_listxattr(const char *path, char *buffer,
const remote::file_size &size) override ;*/
packet::error_type fuse_mkdir(const char *path, const remote::file_mode &mode) override;
packet::error_type fuse_opendir(const char *path, remote::file_handle &handle) override;
packet::error_type fuse_create(const char *path, const remote::file_mode &mode,
const remote::open_flags &flags,
remote::file_handle &handle) override;
packet::error_type fuse_open(const char *path, const remote::open_flags &flags,
remote::file_handle &handle) override;
packet::error_type fuse_read(const char *path, char *buffer, const remote::file_size &read_size,
const remote::file_offset &read_offset,
const remote::file_handle &handle) override;
packet::error_type fuse_rename(const char *from, const char *to) override;
packet::error_type fuse_write(const char *path, const char *buffer,
const remote::file_size &write_size,
const remote::file_offset &write_offset,
const remote::file_handle &handle) override;
packet::error_type fuse_write_base64(const char *path, const char *buffer,
const remote::file_size &write_size,
const remote::file_offset &write_offset,
const remote::file_handle &handle) override;
packet::error_type fuse_readdir(const char *path, const remote::file_offset &offset,
const remote::file_handle &handle,
std::string &item_path) override;
packet::error_type fuse_release(const char *path, const remote::file_handle &handle) override;
packet::error_type fuse_releasedir(const char *path, const remote::file_handle &handle) override;
/*packet::error_type fuse_removexattr(const char *path, const char *name) override ;*/
packet::error_type fuse_rmdir(const char *path) override;
packet::error_type fuse_setattr_x(const char *path, remote::setattr_x &attr) override;
packet::error_type fuse_setbkuptime(const char *path, const remote::file_time &bkuptime) override;
packet::error_type fuse_setchgtime(const char *path, const remote::file_time &chgtime) override;
packet::error_type fuse_setcrtime(const char *path, const remote::file_time &crtime) override;
packet::error_type fuse_setvolname(const char *volname) override;
/*packet::error_type fuse_setxattr(const char *path, const char *name, const char *value,
const remote::file_size &size,
const std::int32_t &flags) override ;
packet::error_type fuse_setxattr_osx(const char *path, const char *name, const char *value,
const remote::file_size &size, const std::int32_t &flags,
const std::uint32_t &position) override ;*/
packet::error_type fuse_statfs(const char *path, const std::uint64_t &frsize,
remote::statfs &st) override;
packet::error_type fuse_statfs_x(const char *path, const std::uint64_t &bsize,
remote::statfs_x &st) override;
packet::error_type fuse_truncate(const char *path, const remote::file_offset &size) override;
packet::error_type fuse_unlink(const char *path) override;
packet::error_type fuse_utimens(const char *path, const remote::file_time *tv,
const std::uint64_t &op0, const std::uint64_t &op1) override;
void set_fuse_uid_gid(const remote::user_id &, const remote::group_id &) override {}
// JSON Layer
packet::error_type json_create_directory_snapshot(const std::string &path,
json &json_data) override;
packet::error_type json_read_directory_snapshot(const std::string &path,
const remote::file_handle &handle,
const std::uint32_t &page,
json &json_data) override;
packet::error_type json_release_directory_snapshot(const std::string &path,
const remote::file_handle &handle) override;
// WinFSP Layer
packet::error_type winfsp_can_delete(PVOID file_desc, PWSTR file_name) override;
packet::error_type winfsp_cleanup(PVOID file_desc, PWSTR file_name, UINT32 flags,
BOOLEAN &was_closed) override;
packet::error_type winfsp_close(PVOID file_desc) override;
packet::error_type winfsp_create(PWSTR file_name, UINT32 create_options, UINT32 granted_access,
UINT32 attributes, UINT64 allocation_size, PVOID *file_desc,
remote::file_info *file_info, std::string &normalized_name,
BOOLEAN &exists) override;
packet::error_type winfsp_flush(PVOID file_desc, remote::file_info *file_info) override;
packet::error_type winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) override;
packet::error_type winfsp_get_file_info(PVOID file_desc, remote::file_info *file_info) override;
packet::error_type winfsp_get_security_by_name(PWSTR file_name, PUINT32 attributes,
std::uint64_t *descriptor_size,
std::wstring &string_descriptor) override;
packet::error_type winfsp_get_volume_info(UINT64 &total_size, UINT64 &free_size,
std::string &volume_label) override;
packet::error_type winfsp_mounted(const std::wstring &location) override;
packet::error_type winfsp_open(PWSTR file_name, UINT32 create_options, UINT32 granted_access,
PVOID *file_desc, remote::file_info *file_info,
std::string &normalized_name) override;
packet::error_type winfsp_overwrite(PVOID file_desc, UINT32 attributes,
BOOLEAN replace_attributes, UINT64 allocation_size,
remote::file_info *file_info) override;
packet::error_type winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length,
PUINT32 bytes_transferred) override;
packet::error_type winfsp_read_directory(PVOID file_desc, PWSTR pattern, PWSTR marker,
json &item_list) override;
packet::error_type winfsp_rename(PVOID file_desc, PWSTR file_name, PWSTR new_file_name,
BOOLEAN replace_if_exists) override;
packet::error_type winfsp_set_basic_info(PVOID file_desc, UINT32 attributes, UINT64 creation_time,
UINT64 last_access_time, UINT64 last_write_time,
UINT64 change_time,
remote::file_info *file_info) override;
packet::error_type winfsp_set_file_size(PVOID file_desc, UINT64 newSize,
BOOLEAN set_allocation_size,
remote::file_info *file_info) override;
packet::error_type winfsp_unmounted(const std::wstring &location) override;
packet::error_type winfsp_write(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length,
BOOLEAN write_to_end, BOOLEAN constrained_io,
PUINT32 bytes_transferred, remote::file_info *file_info) override;
};
} // namespace remote_winfsp
} // namespace repertory
#endif // _WIN32
#endif // INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_SERVER_HPP_

View File

@ -0,0 +1,140 @@
/*
Copyright <2018-2022> <scott.e.graves@protonmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_WINFSP_DRIVE_HPP_
#define INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_WINFSP_DRIVE_HPP_
#ifdef _WIN32
#include "common.hpp"
#include "drives/winfsp/remotewinfsp/i_remote_instance.hpp"
#include "events/event_system.hpp"
namespace repertory {
class app_config;
class lock_data;
class server;
namespace remote_winfsp {
class remote_winfsp_drive final : public virtual FileSystemBase {
E_CONSUMER();
public:
remote_winfsp_drive(app_config &config, lock_data &lockData,
remote_instance_factory remoteInstanceFactory);
~remote_winfsp_drive() override { E_CONSUMER_RELEASE(); }
public:
class winfsp_service : virtual public Service {
public:
winfsp_service(lock_data &lock, remote_winfsp_drive &drive, std::vector<std::string> drive_args,
app_config &config);
~winfsp_service() override = default;
private:
app_config &config_;
lock_data &lock_;
remote_winfsp_drive &drive_;
const std::vector<std::string> drive_args_;
FileSystemHost host_;
protected:
NTSTATUS OnStart(ULONG, PWSTR *) override;
NTSTATUS OnStop() override;
};
private:
app_config &config_;
lock_data &lock_;
remote_instance_factory factory_;
std::unique_ptr<i_remote_instance> remote_instance_;
std::unique_ptr<server> server_;
std::string mount_location_;
private:
void PopulateFileInfo(const json &item, FSP_FSCTL_FILE_INFO &file_info);
static void SetFileInfo(FileInfo &dest, const remote::file_info &src);
public:
NTSTATUS CanDelete(PVOID file_node, PVOID file_desc, PWSTR file_name) override;
VOID Cleanup(PVOID file_node, PVOID file_desc, PWSTR file_name, ULONG flags) override;
VOID Close(PVOID file_node, PVOID file_desc) override;
NTSTATUS Create(PWSTR file_name, UINT32 create_options, UINT32 granted_access, UINT32 attributes,
PSECURITY_DESCRIPTOR descriptor, UINT64 allocation_size, PVOID *file_node,
PVOID *file_desc, OpenFileInfo *ofi) override;
NTSTATUS Flush(PVOID file_node, PVOID file_desc, FileInfo *file_info) override;
NTSTATUS GetFileInfo(PVOID file_node, PVOID file_desc, FileInfo *file_info) override;
NTSTATUS GetSecurityByName(PWSTR file_name, PUINT32 attributes, PSECURITY_DESCRIPTOR descriptor,
SIZE_T *descriptor_size) override;
NTSTATUS GetVolumeInfo(VolumeInfo *volume_info) override;
NTSTATUS Init(PVOID host) override;
int mount(const std::vector<std::string> &drive_args);
NTSTATUS Mounted(PVOID host) override;
NTSTATUS Open(PWSTR file_name, UINT32 create_options, UINT32 granted_access, PVOID *file_node,
PVOID *file_desc, OpenFileInfo *ofi) override;
NTSTATUS Overwrite(PVOID file_node, PVOID file_desc, UINT32 attributes,
BOOLEAN replace_attributes, UINT64 allocation_size,
FileInfo *file_info) override;
NTSTATUS Read(PVOID file_node, PVOID file_desc, PVOID buffer, UINT64 offset, ULONG length,
PULONG bytes_transferred) override;
NTSTATUS ReadDirectory(PVOID file_node, PVOID file_desc, PWSTR pattern, PWSTR marker,
PVOID buffer, ULONG buffer_length, PULONG bytes_transferred) override;
NTSTATUS Rename(PVOID file_node, PVOID file_desc, PWSTR file_name, PWSTR new_file_name,
BOOLEAN replace_if_exists) override;
NTSTATUS SetBasicInfo(PVOID file_node, PVOID file_desc, UINT32 attributes, UINT64 creation_time,
UINT64 last_access_time, UINT64 last_write_time, UINT64 change_time,
FileInfo *file_info) override;
NTSTATUS SetFileSize(PVOID file_node, PVOID file_desc, UINT64 new_size,
BOOLEAN set_allocation_size, FileInfo *file_info) override;
VOID Unmounted(PVOID host) override;
NTSTATUS Write(PVOID file_node, PVOID file_desc, PVOID buffer, UINT64 offset, ULONG length,
BOOLEAN write_to_end, BOOLEAN constrained_io, PULONG bytes_transferred,
FileInfo *file_info) override;
void shutdown() { ::GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); }
static void display_options(int argc, char *argv[]) {}
static void display_version_information(int argc, char *argv[]) {}
};
} // namespace remote_winfsp
} // namespace repertory
#endif // _WIN32
#endif // INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_WINFSP_DRIVE_HPP_