Exemple #1
0
        /// <summary>
        /// Invokes DokanNet.DokanMain function to mount a drive.
        /// The function blocks until the file system is unmounted.
        /// Administrator privilege is needed to communicate with Dokan driver.
        /// You need a manifest file for .NET application.
        /// </summary>
        /// <returns></returns>
        public void Start(object obj)
        {
            try
            {
                int repeatWait = 0;
                while (IsRunning &&
                       (repeatWait++ < 100)
                       )
                {
                    Log.Warn("Last Dokan is still running");
                    Thread.Sleep(250);
                }
                if (!IsRunning)
                {
                    if (currentConfigDetails == null)
                    {
                        ReadConfigDetails();
                    }
                    FireStateChange(LiquesceSvcState.InError, "Starting up");
                    if (currentConfigDetails == null)
                    {
                        Log.Fatal("Unable to read the config details to allow this service to run. Will now exit");
                        Environment.Exit(-1);
                        // ReSharper disable HeuristicUnreachableCode
                        return;
                        // ReSharper restore HeuristicUnreachableCode
                    }
                    SetNLogLevel(currentConfigDetails.ServiceLogLevel);

                    FireStateChange(LiquesceSvcState.Unknown, "Dokan initialised");
                    IsRunning = true;

                    // TODO: Search all usages of the DriveLetter and make sure they become MountPoint compatible
                    string mountPoint = currentConfigDetails.DriveLetter;
                    //if (mountPoint.Length == 1)
                    //   mountPoint += ":\\"; // Make this into a MountPoint for V 0.6.0
                    DokanOptions options = new DokanOptions
                    {
                        MountPoint  = mountPoint,
                        ThreadCount = currentConfigDetails.ThreadCount,
                        DebugMode   = currentConfigDetails.DebugMode,
                        //      public bool UseStdErr;
                        // UseAltStream = true, // This needs all sorts of extra API's
                        UseKeepAlive = true,  // When you set TRUE on DokanOptions->UseKeepAlive, dokan library automatically unmounts 15 seconds after user-mode file system hanged up
                        NetworkDrive = false, // Set this to true to see if it stops the recycler bin question until [workitem:7253] is sorted
                        VolumeLabel  = currentConfigDetails.VolumeLabel
                    };

                    IServicePlugin plugin = pluginProviders.Where(pluginProvider => 0 == String.Compare(pluginProvider.Metadata.Description, currentConfigDetails.PluginMode, true)).Select(pluginProvider => pluginProvider.Value.Create()).FirstOrDefault();
                    plugin.Initialise(currentConfigDetails.DriveLetter, currentConfigDetails.HoldOffBufferBytes);
                    dokanOperations = new LiquesceOps(currentConfigDetails, plugin);
                    ThreadPool.QueueUserWorkItem(dokanOperations.InitialiseShares, dokanOperations);

                    mountedDriveLetter = currentConfigDetails.DriveLetter[0];


                    try
                    {
                        Log.Info("DokanVersion:[{0}], DokanDriverVersion[{1}]", Dokan.DokanVersion(), Dokan.DokanDriverVersion());
                        Dokan.DokanUnmount(mountedDriveLetter);
                    }
                    catch (Exception ex)
                    {
                        Log.InfoException("Make sure it's unmounted threw:", ex);
                    }
                    int retVal = Dokan.DokanMain(options, dokanOperations);
                    Log.Warn("Dokan.DokanMain has exited");
                    IsRunning = false;
                    switch (retVal)
                    {
                    case Dokan.DOKAN_SUCCESS: // = 0;
                        FireStateChange(LiquesceSvcState.Stopped, "Dokan is not mounted");
                        break;

                    case Dokan.DOKAN_ERROR:// = -1; // General Error
                        FireStateChange(LiquesceSvcState.InError, "Dokan is not mounted [DOKAN_ERROR] - General Error");
                        break;

                    case Dokan.DOKAN_DRIVE_LETTER_ERROR: // = -2; // Bad Drive letter
                        FireStateChange(LiquesceSvcState.InError, "Dokan is not mounted [DOKAN_DRIVE_LETTER_ERROR] - Bad drive letter");
                        break;

                    case Dokan.DOKAN_DRIVER_INSTALL_ERROR: // = -3; // Can't install driver
                        FireStateChange(LiquesceSvcState.InError, "Dokan is not mounted [DOKAN_DRIVER_INSTALL_ERROR]");
                        Environment.Exit(-1);
                        break;

                    case Dokan.DOKAN_START_ERROR: // = -4; // Driver something wrong
                        FireStateChange(LiquesceSvcState.InError, "Dokan is not mounted [DOKAN_START_ERROR] - Driver Something is wrong");
                        Environment.Exit(-1);
                        break;

                    case Dokan.DOKAN_MOUNT_ERROR: // = -5; // Can't assign drive letter
                        FireStateChange(LiquesceSvcState.InError, "Dokan is not mounted [DOKAN_MOUNT_ERROR] - Can't assign drive letter");
                        break;

                    default:
                        FireStateChange(LiquesceSvcState.InError, String.Format("Dokan is not mounted [Uknown Error: {0}]", retVal));
                        Environment.Exit(-1);
                        break;
                    }
                }
                else
                {
                    FireStateChange(LiquesceSvcState.InError, "Seems like the last exit request into Dokan did not exit in time");
                }
            }
            catch (Exception ex)
            {
                Log.ErrorException("Start has failed in an uncontrolled way: ", ex);
                Environment.Exit(-1);
            }
            finally
            {
                IsRunning = false;
            }
        }