| @@ -1,75 +1,75 @@ | ||||
| /* | ||||
|   Copyright <2018-2023> <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_I_WINFSP_DRIVE_HPP_ | ||||
| #define INCLUDE_DRIVES_WINFSP_I_WINFSP_DRIVE_HPP_ | ||||
| #ifdef _WIN32 | ||||
|  | ||||
| #include "types/remote.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| class i_winfsp_drive { | ||||
|   INTERFACE_SETUP(i_winfsp_drive); | ||||
|  | ||||
| public: | ||||
|   [[nodiscard]] virtual auto | ||||
|   get_directory_item_count(const std::string &api_path) const | ||||
|       -> std::uint64_t = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   get_directory_items(const std::string &api_path) const | ||||
|       -> directory_item_list = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_file_size(const std::string &api_path) const | ||||
|       -> std::uint64_t = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_item_meta(const std::string &api_path, | ||||
|                                            const std::string &name, | ||||
|                                            std::string &value) const | ||||
|       -> api_error = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_item_meta(const std::string &api_path, | ||||
|                                            api_meta_map &meta) const | ||||
|       -> api_error = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   get_security_by_name(PWSTR file_name, PUINT32 attributes, | ||||
|                        PSECURITY_DESCRIPTOR descriptor, | ||||
|                        std::uint64_t *descriptor_size) -> NTSTATUS = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_total_drive_space() const -> std::uint64_t = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_total_item_count() const -> std::uint64_t = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_used_drive_space() const -> std::uint64_t = 0; | ||||
|  | ||||
|   virtual void get_volume_info(UINT64 &total_size, UINT64 &free_size, | ||||
|                                std::string &volume_label) const = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto populate_file_info(const std::string &api_path, | ||||
|                                                 remote::file_info &fi) | ||||
|       -> api_error = 0; | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif // _WIN32 | ||||
| #endif // INCLUDE_DRIVES_WINFSP_I_WINFSP_DRIVE_HPP_ | ||||
| /* | ||||
|   Copyright <2018-2023> <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_I_WINFSP_DRIVE_HPP_ | ||||
| #define INCLUDE_DRIVES_WINFSP_I_WINFSP_DRIVE_HPP_ | ||||
| #ifdef _WIN32 | ||||
|  | ||||
| #include "types/remote.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| class i_winfsp_drive { | ||||
|   INTERFACE_SETUP(i_winfsp_drive); | ||||
|  | ||||
| public: | ||||
|   [[nodiscard]] virtual auto | ||||
|   get_directory_item_count(const std::string &api_path) const | ||||
|       -> std::uint64_t = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   get_directory_items(const std::string &api_path) const | ||||
|       -> directory_item_list = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_file_size(const std::string &api_path) const | ||||
|       -> std::uint64_t = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_item_meta(const std::string &api_path, | ||||
|                                            const std::string &name, | ||||
|                                            std::string &value) const | ||||
|       -> api_error = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_item_meta(const std::string &api_path, | ||||
|                                            api_meta_map &meta) const | ||||
|       -> api_error = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   get_security_by_name(PWSTR file_name, PUINT32 attributes, | ||||
|                        PSECURITY_DESCRIPTOR descriptor, | ||||
|                        std::uint64_t *descriptor_size) -> NTSTATUS = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_total_drive_space() const -> std::uint64_t = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_total_item_count() const -> std::uint64_t = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_used_drive_space() const -> std::uint64_t = 0; | ||||
|  | ||||
|   virtual void get_volume_info(UINT64 &total_size, UINT64 &free_size, | ||||
|                                std::string &volume_label) const = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto populate_file_info(const std::string &api_path, | ||||
|                                                 remote::file_info &fi) | ||||
|       -> api_error = 0; | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif // _WIN32 | ||||
| #endif // INCLUDE_DRIVES_WINFSP_I_WINFSP_DRIVE_HPP_ | ||||
|   | ||||
| @@ -1,117 +1,117 @@ | ||||
| /* | ||||
|   Copyright <2018-2023> <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 "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 auto winfsp_can_delete(PVOID fileDesc, PWSTR fileName) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_cleanup(PVOID fileDesc, PWSTR fileName, UINT32 flags, | ||||
|                               BOOLEAN &wasClosed) -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_close(PVOID fileDesc) -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_create(PWSTR fileName, UINT32 createOptions, | ||||
|                              UINT32 grantedAccess, UINT32 fileAttributes, | ||||
|                              UINT64 allocationSize, PVOID *fileDesc, | ||||
|                              remote::file_info *fileInfo, | ||||
|                              std::string &normalizedName, BOOLEAN &exists) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_flush(PVOID fileDesc, remote::file_info *fileInfo) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_get_dir_buffer(PVOID fileDesc, PVOID *&ptr) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_get_file_info(PVOID fileDesc, remote::file_info *fileInfo) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto | ||||
|   winfsp_get_security_by_name(PWSTR fileName, PUINT32 fileAttributes, | ||||
|                               std::uint64_t *securityDescriptorSize, | ||||
|                               std::wstring &strDescriptor) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_get_volume_info(UINT64 &totalSize, UINT64 &freeSize, | ||||
|                                       std::string &volumeLabel) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_mounted(const std::wstring &location) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_open(PWSTR fileName, UINT32 createOptions, | ||||
|                            UINT32 grantedAccess, PVOID *fileDesc, | ||||
|                            remote::file_info *fileInfo, | ||||
|                            std::string &normalizedName) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_overwrite(PVOID fileDesc, UINT32 fileAttributes, | ||||
|                                 BOOLEAN replaceFileAttributes, | ||||
|                                 UINT64 allocationSize, | ||||
|                                 remote::file_info *fileInfo) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_read(PVOID fileDesc, PVOID buffer, UINT64 offset, | ||||
|                            UINT32 length, PUINT32 bytesTransferred) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_read_directory(PVOID fileDesc, PWSTR pattern, | ||||
|                                      PWSTR marker, json &itemList) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_rename(PVOID fileDesc, PWSTR fileName, PWSTR newFileName, | ||||
|                              BOOLEAN replaceIfExists) -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_set_basic_info(PVOID fileDesc, UINT32 fileAttributes, | ||||
|                                      UINT64 creationTime, UINT64 lastAccessTime, | ||||
|                                      UINT64 lastWriteTime, UINT64 changeTime, | ||||
|                                      remote::file_info *fileInfo) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_set_file_size(PVOID fileDesc, UINT64 newSize, | ||||
|                                     BOOLEAN setAllocationSize, | ||||
|                                     remote::file_info *fileInfo) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_unmounted(const std::wstring &location) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_write(PVOID fileDesc, PVOID buffer, UINT64 offset, | ||||
|                             UINT32 length, BOOLEAN writeToEndOfFile, | ||||
|                             BOOLEAN constrainedIo, PUINT32 bytesTransferred, | ||||
|                             remote::file_info *fileInfo) | ||||
|       -> packet::error_type = 0; | ||||
| }; | ||||
|  | ||||
| using remote_instance_factory = | ||||
|     std::function<std::unique_ptr<i_remote_instance>()>; | ||||
| } // namespace repertory::remote_winfsp | ||||
|  | ||||
| #endif // INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_I_REMOTE_INSTANCE_HPP_ | ||||
| /* | ||||
|   Copyright <2018-2023> <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 "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 auto winfsp_can_delete(PVOID file_desc, PWSTR file_name) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_cleanup(PVOID file_desc, PWSTR file_name, UINT32 flags, | ||||
|                               BOOLEAN &was_closed) -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_close(PVOID file_desc) -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_create(PWSTR file_name, UINT32 create_options, | ||||
|                              UINT32 granted_access, UINT32 file_attributes, | ||||
|                              UINT64 allocation_size, PVOID *file_desc, | ||||
|                              remote::file_info *file_info, | ||||
|                              std::string &normalized_name, BOOLEAN &exists) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_flush(PVOID file_desc, remote::file_info *file_info) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_get_file_info(PVOID file_desc, remote::file_info *file_info) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto | ||||
|   winfsp_get_security_by_name(PWSTR file_name, PUINT32 file_attributes, | ||||
|                               std::uint64_t *security_descriptor_size, | ||||
|                               std::wstring &str_descriptor) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_get_volume_info(UINT64 &total_size, UINT64 &free_size, | ||||
|                                       std::string &volume_label) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_mounted(const std::wstring &location) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_open(PWSTR file_name, UINT32 create_options, | ||||
|                            UINT32 granted_access, PVOID *file_desc, | ||||
|                            remote::file_info *file_info, | ||||
|                            std::string &normalized_name) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_overwrite(PVOID file_desc, UINT32 file_attributes, | ||||
|                                 BOOLEAN replace_file_attributes, | ||||
|                                 UINT64 allocation_size, | ||||
|                                 remote::file_info *file_info) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, | ||||
|                            UINT32 length, PUINT32 bytes_transferred) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_read_directory(PVOID file_desc, PWSTR pattern, | ||||
|                                      PWSTR marker, json &itemList) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_rename(PVOID file_desc, PWSTR file_name, PWSTR new_file_name, | ||||
|                              BOOLEAN replace_if_exists) -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_set_basic_info(PVOID file_desc, UINT32 file_attributes, | ||||
|                                      UINT64 creation_time, UINT64 last_access_time, | ||||
|                                      UINT64 last_write_time, UINT64 change_time, | ||||
|                                      remote::file_info *file_info) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_set_file_size(PVOID file_desc, UINT64 new_size, | ||||
|                                     BOOLEAN set_allocation_size, | ||||
|                                     remote::file_info *file_info) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_unmounted(const std::wstring &location) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto 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) | ||||
|       -> packet::error_type = 0; | ||||
| }; | ||||
|  | ||||
| using remote_instance_factory = | ||||
|     std::function<std::unique_ptr<i_remote_instance>()>; | ||||
| } // namespace repertory::remote_winfsp | ||||
|  | ||||
| #endif // INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_I_REMOTE_INSTANCE_HPP_ | ||||
|   | ||||
| @@ -1,141 +1,141 @@ | ||||
| /* | ||||
|   Copyright <2018-2023> <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 "comm/packet/packet.hpp" | ||||
| #include "comm/packet/packet_client.hpp" | ||||
| #include "drives/remote/remote_open_file_table.hpp" | ||||
| #include "drives/winfsp/remotewinfsp/i_remote_instance.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 auto to_handle(PVOID file_desc) -> native_handle; | ||||
| #endif | ||||
|  | ||||
| protected: | ||||
|   void delete_open_directory(void * /*dir*/) override {} | ||||
|  | ||||
| public: | ||||
|   auto json_create_directory_snapshot(const std::string &path, json &json_data) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto json_read_directory_snapshot(const std::string &path, | ||||
|                                     const remote::file_handle &handle, | ||||
|                                     std::uint32_t page, json &json_data) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto json_release_directory_snapshot(const std::string &path, | ||||
|                                        const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_can_delete(PVOID file_desc, PWSTR file_name) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_cleanup(PVOID file_desc, PWSTR file_name, UINT32 flags, | ||||
|                       BOOLEAN &was_closed) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_close(PVOID file_desc) -> packet::error_type override; | ||||
|  | ||||
|   auto 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) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_flush(PVOID file_desc, remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_file_info(PVOID file_desc, remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_security_by_name(PWSTR file_name, PUINT32 attributes, | ||||
|                                    std::uint64_t *descriptor_size, | ||||
|                                    std::wstring &string_descriptor) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_volume_info(UINT64 &total_size, UINT64 &free_size, | ||||
|                               std::string &volume_label) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_mounted(const std::wstring &location) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_open(PWSTR file_name, UINT32 create_options, | ||||
|                    UINT32 granted_access, PVOID *file_desc, | ||||
|                    remote::file_info *file_info, std::string &normalized_name) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_overwrite(PVOID file_desc, UINT32 attributes, | ||||
|                         BOOLEAN replace_attributes, UINT64 allocation_size, | ||||
|                         remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, | ||||
|                    PUINT32 bytes_transferred) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_read_directory(PVOID file_desc, PWSTR pattern, PWSTR marker, | ||||
|                              json &itemList) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_rename(PVOID file_desc, PWSTR file_name, PWSTR new_file_name, | ||||
|                      BOOLEAN replace_if_exists) -> packet::error_type override; | ||||
|  | ||||
|   auto 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) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_set_file_size(PVOID file_desc, UINT64 new_size, | ||||
|                             BOOLEAN set_allocation_size, | ||||
|                             remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_unmounted(const std::wstring &location) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto 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) | ||||
|       -> packet::error_type override; | ||||
| }; | ||||
| } // namespace remote_winfsp | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif // INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_CLIENT_HPP_ | ||||
| /* | ||||
|   Copyright <2018-2023> <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 "comm/packet/packet.hpp" | ||||
| #include "comm/packet/packet_client.hpp" | ||||
| #include "drives/remote/remote_open_file_table.hpp" | ||||
| #include "drives/winfsp/remotewinfsp/i_remote_instance.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 auto to_handle(PVOID file_desc) -> native_handle; | ||||
| #endif | ||||
|  | ||||
| protected: | ||||
|   void delete_open_directory(void * /*dir*/) override {} | ||||
|  | ||||
| public: | ||||
|   auto json_create_directory_snapshot(const std::string &path, json &json_data) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto json_read_directory_snapshot(const std::string &path, | ||||
|                                     const remote::file_handle &handle, | ||||
|                                     std::uint32_t page, json &json_data) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto json_release_directory_snapshot(const std::string &path, | ||||
|                                        const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_can_delete(PVOID file_desc, PWSTR file_name) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_cleanup(PVOID file_desc, PWSTR file_name, UINT32 flags, | ||||
|                       BOOLEAN &was_closed) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_close(PVOID file_desc) -> packet::error_type override; | ||||
|  | ||||
|   auto 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) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_flush(PVOID file_desc, remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_file_info(PVOID file_desc, remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_security_by_name(PWSTR file_name, PUINT32 attributes, | ||||
|                                    std::uint64_t *descriptor_size, | ||||
|                                    std::wstring &string_descriptor) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_volume_info(UINT64 &total_size, UINT64 &free_size, | ||||
|                               std::string &volume_label) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_mounted(const std::wstring &location) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_open(PWSTR file_name, UINT32 create_options, | ||||
|                    UINT32 granted_access, PVOID *file_desc, | ||||
|                    remote::file_info *file_info, std::string &normalized_name) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_overwrite(PVOID file_desc, UINT32 attributes, | ||||
|                         BOOLEAN replace_attributes, UINT64 allocation_size, | ||||
|                         remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, | ||||
|                    PUINT32 bytes_transferred) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_read_directory(PVOID file_desc, PWSTR pattern, PWSTR marker, | ||||
|                              json &itemList) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_rename(PVOID file_desc, PWSTR file_name, PWSTR new_file_name, | ||||
|                      BOOLEAN replace_if_exists) -> packet::error_type override; | ||||
|  | ||||
|   auto 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) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_set_file_size(PVOID file_desc, UINT64 new_size, | ||||
|                             BOOLEAN set_allocation_size, | ||||
|                             remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_unmounted(const std::wstring &location) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto 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) | ||||
|       -> packet::error_type override; | ||||
| }; | ||||
| } // namespace remote_winfsp | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif // INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_CLIENT_HPP_ | ||||
|   | ||||
| @@ -1,286 +1,286 @@ | ||||
| /* | ||||
|   Copyright <2018-2023> <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 "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, | ||||
|                            utils::string::to_lower(mount_location)) {} | ||||
|  | ||||
| private: | ||||
|   [[nodiscard]] auto construct_path(std::string path) -> std::string; | ||||
|  | ||||
|   [[nodiscard]] auto populate_file_info(const std::string &api_path, | ||||
|                                         remote::file_info &file_info) | ||||
|       -> packet::error_type; | ||||
|  | ||||
|   void populate_stat(const char *path, bool directory, remote::stat &st, | ||||
|                      const struct _stat64 &st1); | ||||
|  | ||||
| public: | ||||
|   // FUSE Layer | ||||
|   auto fuse_access(const char *path, const std::int32_t &mask) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_chflags(const char *path, std::uint32_t flags) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_chmod(const char *path, const remote::file_mode &mode) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_chown(const char *path, const remote::user_id &uid, | ||||
|                   const remote::group_id &gid) -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_destroy() -> packet::error_type 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 ;*/ | ||||
|  | ||||
|   auto fuse_fgetattr(const char *path, remote::stat &st, bool &directory, | ||||
|                      const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_fsetattr_x(const char *path, const remote::setattr_x &attr, | ||||
|                        const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_fsync(const char *path, const std::int32_t &datasync, | ||||
|                   const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_ftruncate(const char *path, const remote::file_offset &size, | ||||
|                       const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_getattr(const char *path, remote::stat &st, bool &directory) | ||||
|       -> packet::error_type 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, std::uint32_t position) override ;*/ | ||||
|  | ||||
|   auto fuse_getxtimes(const char *path, remote::file_time &bkuptime, | ||||
|                       remote::file_time &crtime) -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_init() -> packet::error_type override; | ||||
|  | ||||
|   /*packet::error_type fuse_listxattr(const char *path, char *buffer, | ||||
|                                          const remote::file_size &size) override | ||||
|      ;*/ | ||||
|  | ||||
|   auto fuse_mkdir(const char *path, const remote::file_mode &mode) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_opendir(const char *path, remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_create(const char *path, const remote::file_mode &mode, | ||||
|                    const remote::open_flags &flags, remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_open(const char *path, const remote::open_flags &flags, | ||||
|                  remote::file_handle &handle) -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_read(const char *path, char *buffer, | ||||
|                  const remote::file_size &read_size, | ||||
|                  const remote::file_offset &read_offset, | ||||
|                  const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_rename(const char *from, const char *to) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto 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) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto 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) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_readdir(const char *path, const remote::file_offset &offset, | ||||
|                     const remote::file_handle &handle, std::string &item_path) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_release(const char *path, const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_releasedir(const char *path, const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   /*packet::error_type fuse_removexattr(const char *path, const char *name) | ||||
|    * override ;*/ | ||||
|  | ||||
|   auto fuse_rmdir(const char *path) -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_setattr_x(const char *path, remote::setattr_x &attr) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_setbkuptime(const char *path, const remote::file_time &bkuptime) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_setchgtime(const char *path, const remote::file_time &chgtime) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_setcrtime(const char *path, const remote::file_time &crtime) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_setvolname(const char *volname) -> packet::error_type 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, | ||||
|                                            std::uint32_t position) override ;*/ | ||||
|  | ||||
|   auto fuse_statfs(const char *path, std::uint64_t frsize, remote::statfs &st) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_statfs_x(const char *path, std::uint64_t bsize, | ||||
|                      remote::statfs_x &st) -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_truncate(const char *path, const remote::file_offset &size) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_unlink(const char *path) -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_utimens(const char *path, const remote::file_time *tv, | ||||
|                     std::uint64_t op0, std::uint64_t op1) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   void set_fuse_uid_gid(const remote::user_id &, | ||||
|                         const remote::group_id &) override {} | ||||
|  | ||||
|   // JSON Layer | ||||
|   auto json_create_directory_snapshot(const std::string &path, json &json_data) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto json_read_directory_snapshot(const std::string &path, | ||||
|                                     const remote::file_handle &handle, | ||||
|                                     std::uint32_t page, json &json_data) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto json_release_directory_snapshot(const std::string &path, | ||||
|                                        const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   // WinFSP Layer | ||||
|   auto winfsp_can_delete(PVOID file_desc, PWSTR file_name) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_cleanup(PVOID file_desc, PWSTR file_name, UINT32 flags, | ||||
|                       BOOLEAN &was_closed) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_close(PVOID file_desc) -> packet::error_type override; | ||||
|  | ||||
|   auto 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) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_flush(PVOID file_desc, remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_file_info(PVOID file_desc, remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_security_by_name(PWSTR file_name, PUINT32 attributes, | ||||
|                                    std::uint64_t *descriptor_size, | ||||
|                                    std::wstring &string_descriptor) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_volume_info(UINT64 &total_size, UINT64 &free_size, | ||||
|                               std::string &volume_label) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_mounted(const std::wstring &location) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_open(PWSTR file_name, UINT32 create_options, | ||||
|                    UINT32 granted_access, PVOID *file_desc, | ||||
|                    remote::file_info *file_info, std::string &normalized_name) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_overwrite(PVOID file_desc, UINT32 attributes, | ||||
|                         BOOLEAN replace_attributes, UINT64 allocation_size, | ||||
|                         remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, | ||||
|                    PUINT32 bytes_transferred) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_read_directory(PVOID file_desc, PWSTR pattern, PWSTR marker, | ||||
|                              json &item_list) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_rename(PVOID file_desc, PWSTR file_name, PWSTR new_file_name, | ||||
|                      BOOLEAN replace_if_exists) -> packet::error_type override; | ||||
|  | ||||
|   auto 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) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_set_file_size(PVOID file_desc, UINT64 newSize, | ||||
|                             BOOLEAN set_allocation_size, | ||||
|                             remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_unmounted(const std::wstring &location) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto 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) | ||||
|       -> packet::error_type override; | ||||
| }; | ||||
| } // namespace remote_winfsp | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif // _WIN32 | ||||
| #endif // INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_SERVER_HPP_ | ||||
| /* | ||||
|   Copyright <2018-2023> <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 "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, | ||||
|                            utils::string::to_lower(mount_location)) {} | ||||
|  | ||||
| private: | ||||
|   [[nodiscard]] auto construct_path(std::string path) -> std::string; | ||||
|  | ||||
|   [[nodiscard]] auto populate_file_info(const std::string &api_path, | ||||
|                                         remote::file_info &file_info) | ||||
|       -> packet::error_type; | ||||
|  | ||||
|   void populate_stat(const char *path, bool directory, remote::stat &st, | ||||
|                      const struct _stat64 &st1); | ||||
|  | ||||
| public: | ||||
|   // FUSE Layer | ||||
|   auto fuse_access(const char *path, const std::int32_t &mask) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_chflags(const char *path, std::uint32_t flags) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_chmod(const char *path, const remote::file_mode &mode) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_chown(const char *path, const remote::user_id &uid, | ||||
|                   const remote::group_id &gid) -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_destroy() -> packet::error_type 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 ;*/ | ||||
|  | ||||
|   auto fuse_fgetattr(const char *path, remote::stat &st, bool &directory, | ||||
|                      const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_fsetattr_x(const char *path, const remote::setattr_x &attr, | ||||
|                        const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_fsync(const char *path, const std::int32_t &datasync, | ||||
|                   const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_ftruncate(const char *path, const remote::file_offset &size, | ||||
|                       const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_getattr(const char *path, remote::stat &st, bool &directory) | ||||
|       -> packet::error_type 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, std::uint32_t position) override ;*/ | ||||
|  | ||||
|   auto fuse_getxtimes(const char *path, remote::file_time &bkuptime, | ||||
|                       remote::file_time &crtime) -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_init() -> packet::error_type override; | ||||
|  | ||||
|   /*packet::error_type fuse_listxattr(const char *path, char *buffer, | ||||
|                                          const remote::file_size &size) override | ||||
|      ;*/ | ||||
|  | ||||
|   auto fuse_mkdir(const char *path, const remote::file_mode &mode) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_opendir(const char *path, remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_create(const char *path, const remote::file_mode &mode, | ||||
|                    const remote::open_flags &flags, remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_open(const char *path, const remote::open_flags &flags, | ||||
|                  remote::file_handle &handle) -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_read(const char *path, char *buffer, | ||||
|                  const remote::file_size &read_size, | ||||
|                  const remote::file_offset &read_offset, | ||||
|                  const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_rename(const char *from, const char *to) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto 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) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto 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) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_readdir(const char *path, const remote::file_offset &offset, | ||||
|                     const remote::file_handle &handle, std::string &item_path) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_release(const char *path, const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_releasedir(const char *path, const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   /*packet::error_type fuse_removexattr(const char *path, const char *name) | ||||
|    * override ;*/ | ||||
|  | ||||
|   auto fuse_rmdir(const char *path) -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_setattr_x(const char *path, remote::setattr_x &attr) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_setbkuptime(const char *path, const remote::file_time &bkuptime) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_setchgtime(const char *path, const remote::file_time &chgtime) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_setcrtime(const char *path, const remote::file_time &crtime) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_setvolname(const char *volname) -> packet::error_type 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, | ||||
|                                            std::uint32_t position) override ;*/ | ||||
|  | ||||
|   auto fuse_statfs(const char *path, std::uint64_t frsize, remote::statfs &st) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_statfs_x(const char *path, std::uint64_t bsize, | ||||
|                      remote::statfs_x &st) -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_truncate(const char *path, const remote::file_offset &size) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_unlink(const char *path) -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_utimens(const char *path, const remote::file_time *tv, | ||||
|                     std::uint64_t op0, std::uint64_t op1) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   void set_fuse_uid_gid(const remote::user_id &, | ||||
|                         const remote::group_id &) override {} | ||||
|  | ||||
|   // JSON Layer | ||||
|   auto json_create_directory_snapshot(const std::string &path, json &json_data) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto json_read_directory_snapshot(const std::string &path, | ||||
|                                     const remote::file_handle &handle, | ||||
|                                     std::uint32_t page, json &json_data) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto json_release_directory_snapshot(const std::string &path, | ||||
|                                        const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   // WinFSP Layer | ||||
|   auto winfsp_can_delete(PVOID file_desc, PWSTR file_name) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_cleanup(PVOID file_desc, PWSTR file_name, UINT32 flags, | ||||
|                       BOOLEAN &was_closed) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_close(PVOID file_desc) -> packet::error_type override; | ||||
|  | ||||
|   auto 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) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_flush(PVOID file_desc, remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_file_info(PVOID file_desc, remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_security_by_name(PWSTR file_name, PUINT32 attributes, | ||||
|                                    std::uint64_t *descriptor_size, | ||||
|                                    std::wstring &string_descriptor) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_volume_info(UINT64 &total_size, UINT64 &free_size, | ||||
|                               std::string &volume_label) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_mounted(const std::wstring &location) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_open(PWSTR file_name, UINT32 create_options, | ||||
|                    UINT32 granted_access, PVOID *file_desc, | ||||
|                    remote::file_info *file_info, std::string &normalized_name) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_overwrite(PVOID file_desc, UINT32 attributes, | ||||
|                         BOOLEAN replace_attributes, UINT64 allocation_size, | ||||
|                         remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, | ||||
|                    PUINT32 bytes_transferred) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_read_directory(PVOID file_desc, PWSTR pattern, PWSTR marker, | ||||
|                              json &item_list) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_rename(PVOID file_desc, PWSTR file_name, PWSTR new_file_name, | ||||
|                      BOOLEAN replace_if_exists) -> packet::error_type override; | ||||
|  | ||||
|   auto 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) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_set_file_size(PVOID file_desc, UINT64 new_size, | ||||
|                             BOOLEAN set_allocation_size, | ||||
|                             remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_unmounted(const std::wstring &location) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto 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) | ||||
|       -> packet::error_type override; | ||||
| }; | ||||
| } // namespace remote_winfsp | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif // _WIN32 | ||||
| #endif // INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_SERVER_HPP_ | ||||
|   | ||||
| @@ -1,154 +1,154 @@ | ||||
| /* | ||||
|   Copyright <2018-2023> <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 "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, remote_instance_factory factory, | ||||
|                       lock_data &lock); | ||||
|  | ||||
|   ~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: | ||||
|     auto OnStart(ULONG, PWSTR *) -> NTSTATUS override; | ||||
|  | ||||
|     auto OnStop() -> NTSTATUS 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 populate_file_info(const json &item, FSP_FSCTL_FILE_INFO &file_info); | ||||
|  | ||||
|   static void set_file_info(FileInfo &dest, const remote::file_info &src); | ||||
|  | ||||
| public: | ||||
|   auto CanDelete(PVOID file_node, PVOID file_desc, PWSTR file_name) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   VOID Cleanup(PVOID file_node, PVOID file_desc, PWSTR file_name, | ||||
|                ULONG flags) override; | ||||
|  | ||||
|   VOID Close(PVOID file_node, PVOID file_desc) override; | ||||
|  | ||||
|   auto 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) -> NTSTATUS override; | ||||
|  | ||||
|   auto Flush(PVOID file_node, PVOID file_desc, FileInfo *file_info) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   auto GetFileInfo(PVOID file_node, PVOID file_desc, FileInfo *file_info) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   auto GetSecurityByName(PWSTR file_name, PUINT32 attributes, | ||||
|                          PSECURITY_DESCRIPTOR descriptor, | ||||
|                          SIZE_T *descriptor_size) -> NTSTATUS override; | ||||
|  | ||||
|   auto GetVolumeInfo(VolumeInfo *volume_info) -> NTSTATUS override; | ||||
|  | ||||
|   auto Init(PVOID host) -> NTSTATUS override; | ||||
|  | ||||
|   [[nodiscard]] auto mount(const std::vector<std::string> &drive_args) -> int; | ||||
|  | ||||
|   auto Mounted(PVOID host) -> NTSTATUS override; | ||||
|  | ||||
|   auto Open(PWSTR file_name, UINT32 create_options, UINT32 granted_access, | ||||
|             PVOID *file_node, PVOID *file_desc, OpenFileInfo *ofi) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   auto Overwrite(PVOID file_node, PVOID file_desc, UINT32 attributes, | ||||
|                  BOOLEAN replace_attributes, UINT64 allocation_size, | ||||
|                  FileInfo *file_info) -> NTSTATUS override; | ||||
|  | ||||
|   auto Read(PVOID file_node, PVOID file_desc, PVOID buffer, UINT64 offset, | ||||
|             ULONG length, PULONG bytes_transferred) -> NTSTATUS override; | ||||
|  | ||||
|   auto ReadDirectory(PVOID file_node, PVOID file_desc, PWSTR pattern, | ||||
|                      PWSTR marker, PVOID buffer, ULONG buffer_length, | ||||
|                      PULONG bytes_transferred) -> NTSTATUS override; | ||||
|  | ||||
|   auto Rename(PVOID file_node, PVOID file_desc, PWSTR file_name, | ||||
|               PWSTR new_file_name, BOOLEAN replace_if_exists) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   auto 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) -> NTSTATUS override; | ||||
|  | ||||
|   auto SetFileSize(PVOID file_node, PVOID file_desc, UINT64 new_size, | ||||
|                    BOOLEAN set_allocation_size, FileInfo *file_info) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   VOID Unmounted(PVOID host) override; | ||||
|  | ||||
|   auto 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) | ||||
|       -> NTSTATUS 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_ | ||||
| /* | ||||
|   Copyright <2018-2023> <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 "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, remote_instance_factory factory, | ||||
|                       lock_data &lock); | ||||
|  | ||||
|   ~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: | ||||
|     auto OnStart(ULONG, PWSTR *) -> NTSTATUS override; | ||||
|  | ||||
|     auto OnStop() -> NTSTATUS 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 populate_file_info(const json &item, FSP_FSCTL_FILE_INFO &file_info); | ||||
|  | ||||
|   static void set_file_info(FileInfo &dest, const remote::file_info &src); | ||||
|  | ||||
| public: | ||||
|   auto CanDelete(PVOID file_node, PVOID file_desc, PWSTR file_name) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   VOID Cleanup(PVOID file_node, PVOID file_desc, PWSTR file_name, | ||||
|                ULONG flags) override; | ||||
|  | ||||
|   VOID Close(PVOID file_node, PVOID file_desc) override; | ||||
|  | ||||
|   auto 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) -> NTSTATUS override; | ||||
|  | ||||
|   auto Flush(PVOID file_node, PVOID file_desc, FileInfo *file_info) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   auto GetFileInfo(PVOID file_node, PVOID file_desc, FileInfo *file_info) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   auto GetSecurityByName(PWSTR file_name, PUINT32 attributes, | ||||
|                          PSECURITY_DESCRIPTOR descriptor, | ||||
|                          SIZE_T *descriptor_size) -> NTSTATUS override; | ||||
|  | ||||
|   auto GetVolumeInfo(VolumeInfo *volume_info) -> NTSTATUS override; | ||||
|  | ||||
|   auto Init(PVOID host) -> NTSTATUS override; | ||||
|  | ||||
|   [[nodiscard]] auto mount(const std::vector<std::string> &drive_args) -> int; | ||||
|  | ||||
|   auto Mounted(PVOID host) -> NTSTATUS override; | ||||
|  | ||||
|   auto Open(PWSTR file_name, UINT32 create_options, UINT32 granted_access, | ||||
|             PVOID *file_node, PVOID *file_desc, OpenFileInfo *ofi) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   auto Overwrite(PVOID file_node, PVOID file_desc, UINT32 attributes, | ||||
|                  BOOLEAN replace_attributes, UINT64 allocation_size, | ||||
|                  FileInfo *file_info) -> NTSTATUS override; | ||||
|  | ||||
|   auto Read(PVOID file_node, PVOID file_desc, PVOID buffer, UINT64 offset, | ||||
|             ULONG length, PULONG bytes_transferred) -> NTSTATUS override; | ||||
|  | ||||
|   auto ReadDirectory(PVOID file_node, PVOID file_desc, PWSTR pattern, | ||||
|                      PWSTR marker, PVOID buffer, ULONG buffer_length, | ||||
|                      PULONG bytes_transferred) -> NTSTATUS override; | ||||
|  | ||||
|   auto Rename(PVOID file_node, PVOID file_desc, PWSTR file_name, | ||||
|               PWSTR new_file_name, BOOLEAN replace_if_exists) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   auto 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) -> NTSTATUS override; | ||||
|  | ||||
|   auto SetFileSize(PVOID file_node, PVOID file_desc, UINT64 new_size, | ||||
|                    BOOLEAN set_allocation_size, FileInfo *file_info) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   VOID Unmounted(PVOID host) override; | ||||
|  | ||||
|   auto 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) | ||||
|       -> NTSTATUS 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_ | ||||
|   | ||||
| @@ -1,203 +1,203 @@ | ||||
| /* | ||||
|   Copyright <2018-2023> <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_WINFSP_DRIVE_HPP_ | ||||
| #define INCLUDE_DRIVES_WINFSP_WINFSP_DRIVE_HPP_ | ||||
| #ifdef _WIN32 | ||||
|  | ||||
| #include "drives/eviction.hpp" | ||||
| #include "drives/winfsp/i_winfsp_drive.hpp" | ||||
| #include "drives/winfsp/remotewinfsp/remote_server.hpp" | ||||
| #include "events/event_system.hpp" | ||||
| #include "file_manager/file_manager.hpp" | ||||
| #include "rpc/server/full_server.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| class app_config; | ||||
| class lock_data; | ||||
| class i_provider; | ||||
|  | ||||
| class winfsp_drive final : public virtual i_winfsp_drive, | ||||
|                            public virtual FileSystemBase { | ||||
|   E_CONSUMER(); | ||||
|  | ||||
| public: | ||||
|   winfsp_drive(app_config &config, lock_data &lockData, i_provider &provider); | ||||
|  | ||||
|   ~winfsp_drive() override { E_CONSUMER_RELEASE(); } | ||||
|  | ||||
| private: | ||||
|   class winfsp_service final : virtual public Service { | ||||
|   public: | ||||
|     winfsp_service(lock_data &lock, winfsp_drive &drive, | ||||
|                    std::vector<std::string> drive_args, app_config &config); | ||||
|  | ||||
|     ~winfsp_service() override = default; | ||||
|  | ||||
|   private: | ||||
|     lock_data &lock_; | ||||
|     winfsp_drive &drive_; | ||||
|     const std::vector<std::string> drive_args_; | ||||
|     FileSystemHost host_; | ||||
|     app_config &config_; | ||||
|  | ||||
|   protected: | ||||
|     auto OnStart(ULONG, PWSTR *) -> NTSTATUS override; | ||||
|  | ||||
|     auto OnStop() -> NTSTATUS override; | ||||
|   }; | ||||
|  | ||||
| private: | ||||
|   i_provider &provider_; | ||||
|   app_config &config_; | ||||
|   lock_data &lock_; | ||||
|   std::unique_ptr<full_server> server_; | ||||
|   std::unique_ptr<file_manager> fm_; | ||||
|   std::unique_ptr<eviction> eviction_; | ||||
|   std::unique_ptr<remote_winfsp::remote_server> remote_server_; | ||||
|  | ||||
| private: | ||||
|   static auto parse_mount_location(const std::wstring &mount_location) | ||||
|       -> std::string; | ||||
|  | ||||
|   void populate_file_info(const std::string &api_path, std::uint64_t file_size, | ||||
|                           const api_meta_map &meta, | ||||
|                           FSP_FSCTL_OPEN_FILE_INFO &ofi); | ||||
|  | ||||
|   void populate_file_info(std::uint64_t file_size, api_meta_map meta, | ||||
|                           FSP_FSCTL_FILE_INFO &fi); | ||||
|  | ||||
|   static void set_file_info(remote::file_info &dest, | ||||
|                             const FSP_FSCTL_FILE_INFO &src); | ||||
|  | ||||
| public: | ||||
|   auto CanDelete(PVOID file_node, PVOID file_desc, PWSTR file_name) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   VOID Cleanup(PVOID file_node, PVOID file_desc, PWSTR file_name, | ||||
|                ULONG flags) override; | ||||
|  | ||||
|   VOID Close(PVOID file_node, PVOID file_desc) override; | ||||
|  | ||||
|   auto 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) -> NTSTATUS override; | ||||
|  | ||||
|   auto Flush(PVOID file_node, PVOID file_desc, FileInfo *file_info) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   [[nodiscard]] auto get_directory_item_count(const std::string &api_path) const | ||||
|       -> std::uint64_t override; | ||||
|  | ||||
|   [[nodiscard]] auto get_directory_items(const std::string &api_path) const | ||||
|       -> directory_item_list override; | ||||
|  | ||||
|   auto GetFileInfo(PVOID file_node, PVOID file_desc, FileInfo *file_info) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   [[nodiscard]] auto get_file_size(const std::string &api_path) const | ||||
|       -> std::uint64_t override; | ||||
|  | ||||
|   [[nodiscard]] auto get_item_meta(const std::string &api_path, | ||||
|                                    api_meta_map &meta) const | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto get_item_meta(const std::string &api_path, | ||||
|                                    const std::string &name, | ||||
|                                    std::string &value) const | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto get_security_by_name(PWSTR file_name, PUINT32 attributes, | ||||
|                                           PSECURITY_DESCRIPTOR descriptor, | ||||
|                                           std::uint64_t *descriptor_size) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   auto GetSecurityByName(PWSTR file_name, PUINT32 attributes, | ||||
|                          PSECURITY_DESCRIPTOR descriptor, | ||||
|                          SIZE_T *descriptor_size) -> NTSTATUS override; | ||||
|  | ||||
|   [[nodiscard]] auto get_total_drive_space() const -> std::uint64_t override; | ||||
|  | ||||
|   [[nodiscard]] auto get_total_item_count() const -> std::uint64_t override; | ||||
|  | ||||
|   [[nodiscard]] auto get_used_drive_space() const -> std::uint64_t override; | ||||
|  | ||||
|   void get_volume_info(UINT64 &total_size, UINT64 &free_size, | ||||
|                        std::string &volume_label) const override; | ||||
|  | ||||
|   auto GetVolumeInfo(VolumeInfo *volume_info) -> NTSTATUS override; | ||||
|  | ||||
|   auto Init(PVOID host) -> NTSTATUS override; | ||||
|  | ||||
|   [[nodiscard]] auto mount(const std::vector<std::string> &drive_args) -> int; | ||||
|  | ||||
|   auto Mounted(PVOID host) -> NTSTATUS override; | ||||
|  | ||||
|   auto Open(PWSTR file_name, UINT32 create_options, UINT32 granted_access, | ||||
|             PVOID *file_node, PVOID *file_desc, OpenFileInfo *ofi) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   auto Overwrite(PVOID file_node, PVOID file_desc, UINT32 attributes, | ||||
|                  BOOLEAN replace_attributes, UINT64 allocation_size, | ||||
|                  FileInfo *file_info) -> NTSTATUS override; | ||||
|  | ||||
|   [[nodiscard]] auto populate_file_info(const std::string &api_path, | ||||
|                                         remote::file_info &file_info) | ||||
|       -> api_error override; | ||||
|  | ||||
|   auto Read(PVOID file_node, PVOID file_desc, PVOID buffer, UINT64 offset, | ||||
|             ULONG length, PULONG bytes_transferred) -> NTSTATUS override; | ||||
|  | ||||
|   auto ReadDirectory(PVOID file_node, PVOID file_desc, PWSTR pattern, | ||||
|                      PWSTR marker, PVOID buffer, ULONG bufferLength, | ||||
|                      PULONG bytes_transferred) -> NTSTATUS override; | ||||
|  | ||||
|   auto Rename(PVOID file_node, PVOID file_desc, PWSTR file_name, | ||||
|               PWSTR newFileName, BOOLEAN replace_if_exists) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   auto 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) -> NTSTATUS override; | ||||
|  | ||||
|   auto SetFileSize(PVOID file_node, PVOID file_desc, UINT64 new_size, | ||||
|                    BOOLEAN set_allocation_size, FileInfo *file_info) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   VOID Unmounted(PVOID host) override; | ||||
|  | ||||
|   auto 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) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   void shutdown(); | ||||
|  | ||||
|   static void display_options(int argc, char *argv[]) {} | ||||
|  | ||||
|   static void display_version_information(int argc, char *argv[]) {} | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif // _WIN32 | ||||
| #endif // INCLUDE_DRIVES_WINFSP_WINFSP_DRIVE_HPP_ | ||||
| /* | ||||
|   Copyright <2018-2023> <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_WINFSP_DRIVE_HPP_ | ||||
| #define INCLUDE_DRIVES_WINFSP_WINFSP_DRIVE_HPP_ | ||||
| #ifdef _WIN32 | ||||
|  | ||||
| #include "drives/eviction.hpp" | ||||
| #include "drives/winfsp/i_winfsp_drive.hpp" | ||||
| #include "drives/winfsp/remotewinfsp/remote_server.hpp" | ||||
| #include "events/event_system.hpp" | ||||
| #include "file_manager/file_manager.hpp" | ||||
| #include "rpc/server/full_server.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| class app_config; | ||||
| class lock_data; | ||||
| class i_provider; | ||||
|  | ||||
| class winfsp_drive final : public virtual i_winfsp_drive, | ||||
|                            public virtual FileSystemBase { | ||||
|   E_CONSUMER(); | ||||
|  | ||||
| public: | ||||
|   winfsp_drive(app_config &config, lock_data &lockData, i_provider &provider); | ||||
|  | ||||
|   ~winfsp_drive() override { E_CONSUMER_RELEASE(); } | ||||
|  | ||||
| private: | ||||
|   class winfsp_service final : virtual public Service { | ||||
|   public: | ||||
|     winfsp_service(lock_data &lock, winfsp_drive &drive, | ||||
|                    std::vector<std::string> drive_args, app_config &config); | ||||
|  | ||||
|     ~winfsp_service() override = default; | ||||
|  | ||||
|   private: | ||||
|     lock_data &lock_; | ||||
|     winfsp_drive &drive_; | ||||
|     const std::vector<std::string> drive_args_; | ||||
|     FileSystemHost host_; | ||||
|     app_config &config_; | ||||
|  | ||||
|   protected: | ||||
|     auto OnStart(ULONG, PWSTR *) -> NTSTATUS override; | ||||
|  | ||||
|     auto OnStop() -> NTSTATUS override; | ||||
|   }; | ||||
|  | ||||
| private: | ||||
|   i_provider &provider_; | ||||
|   app_config &config_; | ||||
|   lock_data &lock_; | ||||
|   std::unique_ptr<full_server> server_; | ||||
|   std::unique_ptr<file_manager> fm_; | ||||
|   std::unique_ptr<eviction> eviction_; | ||||
|   std::unique_ptr<remote_winfsp::remote_server> remote_server_; | ||||
|  | ||||
| private: | ||||
|   static auto parse_mount_location(const std::wstring &mount_location) | ||||
|       -> std::string; | ||||
|  | ||||
|   void populate_file_info(const std::string &api_path, std::uint64_t file_size, | ||||
|                           const api_meta_map &meta, | ||||
|                           FSP_FSCTL_OPEN_FILE_INFO &ofi); | ||||
|  | ||||
|   void populate_file_info(std::uint64_t file_size, api_meta_map meta, | ||||
|                           FSP_FSCTL_FILE_INFO &fi); | ||||
|  | ||||
|   static void set_file_info(remote::file_info &dest, | ||||
|                             const FSP_FSCTL_FILE_INFO &src); | ||||
|  | ||||
| public: | ||||
|   auto CanDelete(PVOID file_node, PVOID file_desc, PWSTR file_name) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   VOID Cleanup(PVOID file_node, PVOID file_desc, PWSTR file_name, | ||||
|                ULONG flags) override; | ||||
|  | ||||
|   VOID Close(PVOID file_node, PVOID file_desc) override; | ||||
|  | ||||
|   auto 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) -> NTSTATUS override; | ||||
|  | ||||
|   auto Flush(PVOID file_node, PVOID file_desc, FileInfo *file_info) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   [[nodiscard]] auto get_directory_item_count(const std::string &api_path) const | ||||
|       -> std::uint64_t override; | ||||
|  | ||||
|   [[nodiscard]] auto get_directory_items(const std::string &api_path) const | ||||
|       -> directory_item_list override; | ||||
|  | ||||
|   auto GetFileInfo(PVOID file_node, PVOID file_desc, FileInfo *file_info) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   [[nodiscard]] auto get_file_size(const std::string &api_path) const | ||||
|       -> std::uint64_t override; | ||||
|  | ||||
|   [[nodiscard]] auto get_item_meta(const std::string &api_path, | ||||
|                                    api_meta_map &meta) const | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto get_item_meta(const std::string &api_path, | ||||
|                                    const std::string &name, | ||||
|                                    std::string &value) const | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto get_security_by_name(PWSTR file_name, PUINT32 attributes, | ||||
|                                           PSECURITY_DESCRIPTOR descriptor, | ||||
|                                           std::uint64_t *descriptor_size) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   auto GetSecurityByName(PWSTR file_name, PUINT32 attributes, | ||||
|                          PSECURITY_DESCRIPTOR descriptor, | ||||
|                          SIZE_T *descriptor_size) -> NTSTATUS override; | ||||
|  | ||||
|   [[nodiscard]] auto get_total_drive_space() const -> std::uint64_t override; | ||||
|  | ||||
|   [[nodiscard]] auto get_total_item_count() const -> std::uint64_t override; | ||||
|  | ||||
|   [[nodiscard]] auto get_used_drive_space() const -> std::uint64_t override; | ||||
|  | ||||
|   void get_volume_info(UINT64 &total_size, UINT64 &free_size, | ||||
|                        std::string &volume_label) const override; | ||||
|  | ||||
|   auto GetVolumeInfo(VolumeInfo *volume_info) -> NTSTATUS override; | ||||
|  | ||||
|   auto Init(PVOID host) -> NTSTATUS override; | ||||
|  | ||||
|   [[nodiscard]] auto mount(const std::vector<std::string> &drive_args) -> int; | ||||
|  | ||||
|   auto Mounted(PVOID host) -> NTSTATUS override; | ||||
|  | ||||
|   auto Open(PWSTR file_name, UINT32 create_options, UINT32 granted_access, | ||||
|             PVOID *file_node, PVOID *file_desc, OpenFileInfo *ofi) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   auto Overwrite(PVOID file_node, PVOID file_desc, UINT32 attributes, | ||||
|                  BOOLEAN replace_attributes, UINT64 allocation_size, | ||||
|                  FileInfo *file_info) -> NTSTATUS override; | ||||
|  | ||||
|   [[nodiscard]] auto populate_file_info(const std::string &api_path, | ||||
|                                         remote::file_info &file_info) | ||||
|       -> api_error override; | ||||
|  | ||||
|   auto Read(PVOID file_node, PVOID file_desc, PVOID buffer, UINT64 offset, | ||||
|             ULONG length, PULONG bytes_transferred) -> NTSTATUS override; | ||||
|  | ||||
|   auto ReadDirectory(PVOID file_node, PVOID file_desc, PWSTR pattern, | ||||
|                      PWSTR marker, PVOID buffer, ULONG bufferLength, | ||||
|                      PULONG bytes_transferred) -> NTSTATUS override; | ||||
|  | ||||
|   auto Rename(PVOID file_node, PVOID file_desc, PWSTR file_name, | ||||
|               PWSTR new_file_name, BOOLEAN replace_if_exists) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   auto 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) -> NTSTATUS override; | ||||
|  | ||||
|   auto SetFileSize(PVOID file_node, PVOID file_desc, UINT64 new_size, | ||||
|                    BOOLEAN set_allocation_size, FileInfo *file_info) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   VOID Unmounted(PVOID host) override; | ||||
|  | ||||
|   auto 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) | ||||
|       -> NTSTATUS override; | ||||
|  | ||||
|   void shutdown(); | ||||
|  | ||||
|   static void display_options(std::vector<const char *> args) {} | ||||
|  | ||||
|   static void display_version_information(std::vector<const char *> args) {} | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif // _WIN32 | ||||
| #endif // INCLUDE_DRIVES_WINFSP_WINFSP_DRIVE_HPP_ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user