1
0

Dokan changes

This commit is contained in:
Scott E. Graves
2017-02-11 15:34:37 -06:00
parent a70d22b568
commit 377c488803

View File

@@ -1,6 +1,7 @@
#include "stdafx.h" #include "stdafx.h"
#include "SiaDokanDrive.h" #include "SiaDokanDrive.h"
#include <dokan\dokan.h> #include <dokan\dokan.h>
#include <filesystem>
using namespace Sia::Api; using namespace Sia::Api;
using namespace Sia::Api::Dokan; using namespace Sia::Api::Dokan;
@@ -19,12 +20,16 @@ private:
static std::mutex _dokanMutex; static std::mutex _dokanMutex;
static CSiaApi* _siaApi; static CSiaApi* _siaApi;
static DOKAN_OPERATIONS _dokanOps; static DOKAN_OPERATIONS _dokanOps;
static DOKAN_OPTIONS _dokanOptions;
static String _cacheLocation; static String _cacheLocation;
static std::unordered_map<ULONG64, OpenFileInfo> _openFileMap; static std::unordered_map<ULONG64, OpenFileInfo> _openFileMap;
static std::unique_ptr<std::thread> _fileListThread; static std::unique_ptr<std::thread> _fileListThread;
static bool _fileListStopRequested; static bool _fileListStopRequested;
static CSiaFileTreePtr _siaFileTree; static CSiaFileTreePtr _siaFileTree;
static std::mutex _fileTreeMutex; static std::mutex _fileTreeMutex;
static std::unique_ptr<std::thread> _mountThread;
static NTSTATUS _mountStatus;
static String _mountPoint;
private: private:
static bool AddFileToCache(const String& siaPath, const String& cachePath) static bool AddFileToCache(const String& siaPath, const String& cachePath)
@@ -375,12 +380,46 @@ public:
_dokanOps.Unmounted = Sia_Unmounted; _dokanOps.Unmounted = Sia_Unmounted;
_dokanOps.WriteFile = nullptr; _dokanOps.WriteFile = nullptr;
_dokanOps.ZwCreateFile = SiaDrive_ZwCreateFile; _dokanOps.ZwCreateFile = SiaDrive_ZwCreateFile;
ZeroMemory(&_dokanOptions, sizeof(DOKAN_OPTIONS));
_dokanOptions.Version = DOKAN_VERSION;
_dokanOptions.ThreadCount = 0; // use default
_dokanOptions.Options |= DOKAN_OPTION_CURRENT_SESSION;
}
static void Mount(const wchar_t& driveLetter)
{
if (_siaApi && !_mountThread)
{
wchar_t tmp[] = { driveLetter, ':', '\\', 0 };
_mountPoint = tmp;
_mountThread.reset(new std::thread([&]()
{
_dokanOptions.MountPoint = _mountPoint.c_str();
_mountStatus = DokanMain(&_dokanOptions, &_dokanOps);
}));
}
}
static void Unmount()
{
if (_mountThread)
{
DokanRemoveMountPoint(_mountPoint.c_str());
_mountThread->join();
_mountThread.reset(nullptr);
_mountPoint.clear();
}
} }
static void Shutdown() static void Shutdown()
{ {
Unmount();
_siaApi = nullptr; _siaApi = nullptr;
ZeroMemory(&_dokanOps, sizeof(_dokanOps)); ZeroMemory(&_dokanOps, sizeof(_dokanOps));
ZeroMemory(&_dokanOptions, sizeof(_dokanOptions));
} }
static std::mutex& GetMutex() static std::mutex& GetMutex()
@@ -397,13 +436,16 @@ public:
std::mutex DokanImpl::_dokanMutex; std::mutex DokanImpl::_dokanMutex;
CSiaApi* DokanImpl::_siaApi = nullptr; CSiaApi* DokanImpl::_siaApi = nullptr;
DOKAN_OPERATIONS DokanImpl::_dokanOps; DOKAN_OPERATIONS DokanImpl::_dokanOps;
DOKAN_OPTIONS DokanImpl::_dokanOptions;
String DokanImpl::_cacheLocation; String DokanImpl::_cacheLocation;
bool DokanImpl::_fileListStopRequested; bool DokanImpl::_fileListStopRequested;
CSiaFileTreePtr DokanImpl::_siaFileTree; CSiaFileTreePtr DokanImpl::_siaFileTree;
std::mutex DokanImpl::_fileTreeMutex; std::mutex DokanImpl::_fileTreeMutex;
std::unique_ptr<std::thread> DokanImpl::_fileListThread; std::unique_ptr<std::thread> DokanImpl::_fileListThread;
std::unordered_map<ULONG64, DokanImpl::OpenFileInfo> DokanImpl::_openFileMap; std::unordered_map<ULONG64, DokanImpl::OpenFileInfo> DokanImpl::_openFileMap;
std::unique_ptr<std::thread> DokanImpl::_mountThread;
NTSTATUS DokanImpl::_mountStatus = STATUS_SUCCESS;
String DokanImpl::_mountPoint;
CSiaDokanDrive::CSiaDokanDrive(CSiaApi& siaApi) : CSiaDokanDrive::CSiaDokanDrive(CSiaApi& siaApi) :
_siaApi(siaApi), _siaApi(siaApi),