ProjectArcade

Форк
0
117 строк · 4.8 Кб
1
using System;
2
using DokanNet.Logging;
3
using DokanNet.Native;
4

5
namespace DokanNet
6
{
7
    /// <summary>
8
    /// Created by <see cref="Dokan.CreateFileSystem"/>.
9
    /// It holds all the resources required to be alive for the time of the mount.
10
    /// </summary>
11
    public class DokanInstance : IDisposable
12
    {
13
        private static DOKAN_OPERATIONS PrepareOperations(ILogger logger, IDokanOperations operations)
14
        {
15
            var dokanOperationProxy = new DokanOperationProxy(logger, operations);
16

17
            return new DOKAN_OPERATIONS
18
            {
19
                ZwCreateFile = dokanOperationProxy.ZwCreateFileProxy,
20
                Cleanup = dokanOperationProxy.CleanupProxy,
21
                CloseFile = dokanOperationProxy.CloseFileProxy,
22
                ReadFile = dokanOperationProxy.ReadFileProxy,
23
                WriteFile = dokanOperationProxy.WriteFileProxy,
24
                FlushFileBuffers = dokanOperationProxy.FlushFileBuffersProxy,
25
                GetFileInformation = dokanOperationProxy.GetFileInformationProxy,
26
                FindFiles = dokanOperationProxy.FindFilesProxy,
27
                FindFilesWithPattern = dokanOperationProxy.FindFilesWithPatternProxy,
28
                SetFileAttributes = dokanOperationProxy.SetFileAttributesProxy,
29
                SetFileTime = dokanOperationProxy.SetFileTimeProxy,
30
                DeleteFile = dokanOperationProxy.DeleteFileProxy,
31
                DeleteDirectory = dokanOperationProxy.DeleteDirectoryProxy,
32
                MoveFile = dokanOperationProxy.MoveFileProxy,
33
                SetEndOfFile = dokanOperationProxy.SetEndOfFileProxy,
34
                SetAllocationSize = dokanOperationProxy.SetAllocationSizeProxy,
35
                LockFile = dokanOperationProxy.LockFileProxy,
36
                UnlockFile = dokanOperationProxy.UnlockFileProxy,
37
                GetDiskFreeSpace = dokanOperationProxy.GetDiskFreeSpaceProxy,
38
                GetVolumeInformation = dokanOperationProxy.GetVolumeInformationProxy,
39
                Mounted = dokanOperationProxy.MountedProxy,
40
                Unmounted = dokanOperationProxy.UnmountedProxy,
41
                GetFileSecurity = dokanOperationProxy.GetFileSecurityProxy,
42
                SetFileSecurity = dokanOperationProxy.SetFileSecurityProxy,
43
                FindStreams = dokanOperationProxy.FindStreamsProxy
44
            };
45
        }
46

47
        internal NativeStructWrapper<DOKAN_OPTIONS> DokanOptions { get; private set; }
48
        internal NativeStructWrapper<DOKAN_OPERATIONS> DokanOperations { get; private set; }
49
        internal DokanHandle DokanHandle { get; private set; }
50
        private readonly object _disposeLock;
51
        private bool _disposed = false;
52
        public bool IsDisposed
53
        {
54
            get { lock (_disposeLock) return _disposed; }
55
        }
56

57
        internal DokanInstance(ILogger logger, DOKAN_OPTIONS options, IDokanOperations operations)
58
        {
59
            DokanOptions = NativeStructWrapper.Wrap(options);
60
            var preparedOperations = PrepareOperations(logger, operations);
61
            DokanOperations = NativeStructWrapper.Wrap(preparedOperations);
62
            _disposeLock = new object();
63

64
            DokanHandle handle;
65
            var status = NativeMethods.DokanCreateFileSystem(DokanOptions, DokanOperations, out handle);
66
            if (status != DokanStatus.Success)
67
            {
68
                throw new DokanException(status);
69
            }
70
            DokanHandle = handle;
71
        }
72

73
        protected virtual void Dispose(bool disposing)
74
        {
75
            lock (_disposeLock)
76
            {
77
                if (!_disposed)
78
                {
79
                    if (disposing)
80
                    {
81
                        // Dispose managed state (managed objects)
82
                        if (DokanHandle != null)
83
                            DokanHandle.Dispose();     // This calls DokanCloseHandle and waits for dismount
84

85
                        if (DokanOptions != null)
86
                            DokanOptions.Dispose();    // After that, it is safe to free unmanaged memory
87

88
                        if (DokanOperations != null)
89
                            DokanOperations.Dispose();
90
                    }
91

92
                    // Free unmanaged resources (unmanaged objects) and override finalizer
93

94
                    // Set fields to null
95
                    DokanOptions = null;
96
                    DokanOperations = null;
97
                    DokanHandle = null;
98

99
                    _disposed = true;
100
                }
101
            }
102
        }
103

104
        ~DokanInstance()
105
        {
106
            // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
107
            Dispose(disposing: false);
108
        }
109

110
        public void Dispose()
111
        {
112
            // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
113
            Dispose(disposing: true);
114
            GC.SuppressFinalize(this);
115
        }
116
    }
117
}
118

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.