public static void Mount(this IDokanOperations operations, string mountPoint, DokanOptions mountOptions, int threadCount, int version, TimeSpan timeout) { var dokanOperationProxy = new DokanOperationProxy(operations); var dokanOptions = new DOKAN_OPTIONS { Version = (ushort)version, MountPoint = mountPoint, ThreadCount = (ushort)threadCount, Options = (uint)mountOptions, Timeout = (uint)timeout.Milliseconds }; var dokanOperations = new DOKAN_OPERATIONS { ZwCreateFile = dokanOperationProxy.ZwCreateFileProxy, Cleanup = dokanOperationProxy.CleanupProxy, CloseFile = dokanOperationProxy.CloseFileProxy, ReadFile = dokanOperationProxy.ReadFileProxy, WriteFile = dokanOperationProxy.WriteFileProxy, FlushFileBuffers = dokanOperationProxy.FlushFileBuffersProxy, GetFileInformation = dokanOperationProxy.GetFileInformationProxy, FindFiles = dokanOperationProxy.FindFilesProxy, SetFileAttributes = dokanOperationProxy.SetFileAttributesProxy, SetFileTime = dokanOperationProxy.SetFileTimeProxy, DeleteFile = dokanOperationProxy.DeleteFileProxy, DeleteDirectory = dokanOperationProxy.DeleteDirectoryProxy, MoveFile = dokanOperationProxy.MoveFileProxy, SetEndOfFile = dokanOperationProxy.SetEndOfFileProxy, SetAllocationSize = dokanOperationProxy.SetAllocationSizeProxy, LockFile = dokanOperationProxy.LockFileProxy, UnlockFile = dokanOperationProxy.UnlockFileProxy, GetDiskFreeSpace = dokanOperationProxy.GetDiskFreeSpaceProxy, GetVolumeInformation = dokanOperationProxy.GetVolumeInformationProxy, Unmount = dokanOperationProxy.UnmountProxy, GetFileSecurity = dokanOperationProxy.GetFileSecurityProxy, SetFileSecurity = dokanOperationProxy.SetFileSecurityProxy, FindStreams = dokanOperationProxy.FindStreamsProxy }; int status = NativeMethods.DokanMain(ref dokanOptions, ref dokanOperations); switch (status) { case DOKAN_ERROR: throw new DokanException(status, "Dokan error"); case DOKAN_DRIVE_LETTER_ERROR: throw new DokanException(status, "Bad drive letter"); case DOKAN_DRIVER_INSTALL_ERROR: throw new DokanException(status, "Can't install the Dokan driver"); case DOKAN_MOUNT_ERROR: throw new DokanException(status, "Can't assign a drive letter or mount point"); case DOKAN_START_ERROR: throw new DokanException(status, "Something's wrong with the Dokan driver"); case DOKAN_MOUNT_POINT_ERROR: throw new DokanException(status, "Mount point is invalid "); } }
public static extern DokanStatus DokanMain([In] DOKAN_OPTIONS options, [In] DOKAN_OPERATIONS operations);
public static extern int DokanMain(ref DOKAN_OPTIONS options, ref DOKAN_OPERATIONS operations);
public static void Mount(this IDokanOperations operations, string mountPoint, DokanOptions mountOptions, int threadCount, int version) { var dokanOperationProxy = new DokanOperationProxy(operations); var dokanOptions = new DOKAN_OPTIONS { Version = (ushort)version, MountPoint = mountPoint, ThreadCount = (ushort)threadCount, Options = (uint)mountOptions, }; /* dokanOptions.Options |= options.RemovableDrive ? DOKAN_OPTION_REMOVABLE : 0; dokanOptions.Options |= options.DebugMode ? DOKAN_OPTION_DEBUG : 0; dokanOptions.Options |= options.UseStandardError ? DOKAN_OPTION_STDERR : 0; dokanOptions.Options |= options.UseAlternativeStreams ? DOKAN_OPTION_ALT_STREAM : 0; dokanOptions.Options |= options.UseKeepAlive ? DOKAN_OPTION_KEEP_ALIVE : 0; dokanOptions.Options |= options.NetworkDrive ? DOKAN_OPTION_NETWORK : 0;*/ var dokanOperations = new DOKAN_OPERATIONS { CreateFile = dokanOperationProxy.CreateFileProxy, OpenDirectory = dokanOperationProxy.OpenDirectoryProxy, CreateDirectory = dokanOperationProxy.CreateDirectoryProxy, Cleanup = dokanOperationProxy.CleanupProxy, CloseFile = dokanOperationProxy.CloseFileProxy, ReadFile = dokanOperationProxy.ReadFileProxy, WriteFile = dokanOperationProxy.WriteFileProxy, FlushFileBuffers = dokanOperationProxy.FlushFileBuffersProxy, GetFileInformation = dokanOperationProxy.GetFileInformationProxy, FindFiles = dokanOperationProxy.FindFilesProxy, SetFileAttributes = dokanOperationProxy.SetFileAttributesProxy, SetFileTime = dokanOperationProxy.SetFileTimeProxy, DeleteFile = dokanOperationProxy.DeleteFileProxy, DeleteDirectory = dokanOperationProxy.DeleteDirectoryProxy, MoveFile = dokanOperationProxy.MoveFileProxy, SetEndOfFile = dokanOperationProxy.SetEndOfFileProxy, SetAllocationSize = dokanOperationProxy.SetAllocationSizeProxy, LockFile = dokanOperationProxy.LockFileProxy, UnlockFile = dokanOperationProxy.UnlockFileProxy, GetDiskFreeSpace = dokanOperationProxy.GetDiskFreeSpaceProxy, GetVolumeInformation = dokanOperationProxy.GetVolumeInformationProxy, Unmount = dokanOperationProxy.UnmountProxy, GetFileSecurity = dokanOperationProxy.GetFileSecurityProxy, SetFileSecurity = dokanOperationProxy.SetFileSecurityProxy, }; int status = NativeMethods.DokanMain(ref dokanOptions, ref dokanOperations); switch (status) { case DOKAN_ERROR: throw new DokanException(status, "Dokan error"); case DOKAN_DRIVE_LETTER_ERROR: throw new DokanException(status, "Bad drive letter"); case DOKAN_DRIVER_INSTALL_ERROR: throw new DokanException(status, "Can't install driver"); case DOKAN_MOUNT_ERROR: throw new DokanException(status, "Can't assign a drive letter or mount point"); case DOKAN_START_ERROR: throw new DokanException(status, "Something's wrong with Dokan driver"); case DOKAN_MOUNT_POINT_ERROR: throw new DokanException(status, "Mount point is invalid "); } }
/// <summary> /// Mount a new Dokan Volume. /// This function block until the device is unmount. /// </summary> /// <param name="operations">Instance of <see cref="IDokanOperations"/> that will be called for each request made by the kernel.</param> /// <param name="mountPoint">Mount point. Can be <c>M:\\</c> (drive letter) or <c>C:\\mount\\dokan</c> (path in NTFS)</param> /// <param name="mountOptions"><see cref="DokanOptions"/> features enable for the mount</param> /// <param name="threadCount">Number of threads to be used internally by Dokan library. More thread will handle more event at the same time.</param> /// <param name="version">Version of the dokan features requested (Version "123" is equal to Dokan version 1.2.3)</param> /// <param name="timeout">Max timeout in ms of each request before dokan give up.</param> /// <param name="uncName">UNC name used for network volume</param> /// <param name="allocationUnitSize">Allocation Unit Size of the volume. This will behave on the file size.</param> /// <param name="sectorSize">Sector Size of the volume. This will behave on the file size.</param> /// <param name="logger"><see cref="ILogger"/> that will log all DokanNet debug informations</param> /// <exception cref="DokanException">If the mount fails.</exception> public static void Mount(this IDokanOperations operations, string mountPoint, DokanOptions mountOptions, int threadCount, int version, TimeSpan timeout, string uncName = null, int allocationUnitSize = 512, int sectorSize = 512, ILogger logger = null) { #if TRACE if(logger == null){ logger = new ConsoleLogger("[DokanNet] "); } #endif if (logger == null) { logger = new NullLogger(); } var dokanOperationProxy = new DokanOperationProxy(operations, logger); var dokanOptions = new DOKAN_OPTIONS { Version = (ushort) version, MountPoint = mountPoint, UNCName = string.IsNullOrEmpty(uncName) ? null : uncName, ThreadCount = (ushort) threadCount, Options = (uint) mountOptions, Timeout = (uint) timeout.Milliseconds, AllocationUnitSize = (uint) allocationUnitSize, SectorSize = (uint) sectorSize }; var dokanOperations = new DOKAN_OPERATIONS { ZwCreateFile = dokanOperationProxy.ZwCreateFileProxy, Cleanup = dokanOperationProxy.CleanupProxy, CloseFile = dokanOperationProxy.CloseFileProxy, ReadFile = dokanOperationProxy.ReadFileProxy, WriteFile = dokanOperationProxy.WriteFileProxy, FlushFileBuffers = dokanOperationProxy.FlushFileBuffersProxy, GetFileInformation = dokanOperationProxy.GetFileInformationProxy, FindFiles = dokanOperationProxy.FindFilesProxy, FindFilesWithPattern = dokanOperationProxy.FindFilesWithPatternProxy, SetFileAttributes = dokanOperationProxy.SetFileAttributesProxy, SetFileTime = dokanOperationProxy.SetFileTimeProxy, DeleteFile = dokanOperationProxy.DeleteFileProxy, DeleteDirectory = dokanOperationProxy.DeleteDirectoryProxy, MoveFile = dokanOperationProxy.MoveFileProxy, SetEndOfFile = dokanOperationProxy.SetEndOfFileProxy, SetAllocationSize = dokanOperationProxy.SetAllocationSizeProxy, LockFile = dokanOperationProxy.LockFileProxy, UnlockFile = dokanOperationProxy.UnlockFileProxy, GetDiskFreeSpace = dokanOperationProxy.GetDiskFreeSpaceProxy, GetVolumeInformation = dokanOperationProxy.GetVolumeInformationProxy, Mounted = dokanOperationProxy.MountedProxy, Unmounted = dokanOperationProxy.UnmountedProxy, GetFileSecurity = dokanOperationProxy.GetFileSecurityProxy, SetFileSecurity = dokanOperationProxy.SetFileSecurityProxy, FindStreams = dokanOperationProxy.FindStreamsProxy }; var status = NativeMethods.DokanMain(ref dokanOptions, ref dokanOperations); switch (status) { case DOKAN_ERROR: throw new DokanException(status, Resource.ErrorDokan); case DOKAN_DRIVE_LETTER_ERROR: throw new DokanException(status, Resource.ErrorBadDriveLetter); case DOKAN_DRIVER_INSTALL_ERROR: throw new DokanException(status, Resource.ErrorDriverInstall); case DOKAN_MOUNT_ERROR: throw new DokanException(status, Resource.ErrorAssignDriveLetter); case DOKAN_START_ERROR: throw new DokanException(status, Resource.ErrorStart); case DOKAN_MOUNT_POINT_ERROR: throw new DokanException(status, Resource.ErrorMountPointInvalid); case DOKAN_VERSION_ERROR: throw new DokanException(status, Resource.ErrorVersion); } }