Browse Source

Updated to DiskAccessLibrary v1.4.1

Tal Aloni 7 years ago
parent
commit
b6f15e4c4b

+ 7 - 7
DiskAccessLibrary/DiskAccessLibrary.csproj

@@ -133,18 +133,18 @@
     <Compile Include="LogicalDiskManager\TOCBlock\TOCRegion.cs" />
     <Compile Include="LogicalDiskManager\VolumeManagerDatabase.cs" />
     <Compile Include="LogicalDiskManager\VolumeManagerDatabaseHeader.cs" />
+    <Compile Include="LogicalDiskManager\Volumes\DynamicColumn.cs" />
+    <Compile Include="LogicalDiskManager\Volumes\DynamicVolume.cs" />
+    <Compile Include="LogicalDiskManager\Volumes\MirroredVolume.cs" />
+    <Compile Include="LogicalDiskManager\Volumes\Raid5Volume.cs" />
+    <Compile Include="LogicalDiskManager\Volumes\SimpleVolume.cs" />
+    <Compile Include="LogicalDiskManager\Volumes\SpannedVolume.cs" />
+    <Compile Include="LogicalDiskManager\Volumes\StripedVolume.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="Volumes\DynamicColumn.cs" />
-    <Compile Include="Volumes\DynamicVolume.cs" />
     <Compile Include="Volumes\GPTPartition.cs" />
     <Compile Include="Volumes\MBRPartition.cs" />
-    <Compile Include="Volumes\MirroredVolume.cs" />
     <Compile Include="Volumes\Partition.cs" />
-    <Compile Include="Volumes\Raid5Volume.cs" />
     <Compile Include="Volumes\RemovableVolume.cs" />
-    <Compile Include="Volumes\SimpleVolume.cs" />
-    <Compile Include="Volumes\SpannedVolume.cs" />
-    <Compile Include="Volumes\StripedVolume.cs" />
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Win32\Disks\DiskImage.Win32.cs" />

DiskAccessLibrary/Volumes/DynamicColumn.cs → DiskAccessLibrary/LogicalDiskManager/Volumes/DynamicColumn.cs


DiskAccessLibrary/Volumes/DynamicVolume.cs → DiskAccessLibrary/LogicalDiskManager/Volumes/DynamicVolume.cs


DiskAccessLibrary/Volumes/MirroredVolume.cs → DiskAccessLibrary/LogicalDiskManager/Volumes/MirroredVolume.cs


DiskAccessLibrary/Volumes/Raid5Volume.cs → DiskAccessLibrary/LogicalDiskManager/Volumes/Raid5Volume.cs


DiskAccessLibrary/Volumes/SimpleVolume.cs → DiskAccessLibrary/LogicalDiskManager/Volumes/SimpleVolume.cs


DiskAccessLibrary/Volumes/SpannedVolume.cs → DiskAccessLibrary/LogicalDiskManager/Volumes/SpannedVolume.cs


DiskAccessLibrary/Volumes/StripedVolume.cs → DiskAccessLibrary/LogicalDiskManager/Volumes/StripedVolume.cs


+ 2 - 2
DiskAccessLibrary/Properties/AssemblyInfo.cs

@@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
 //
 // You can specify all the values or you can default the Revision and Build Numbers 
 // by using the '*' as shown below:
-[assembly: AssemblyVersion("1.4.0.0")]
-[assembly: AssemblyFileVersion("1.4.0.0")]
+[assembly: AssemblyVersion("1.4.1.0")]
+[assembly: AssemblyFileVersion("1.4.1.0")]

+ 2 - 0
DiskAccessLibrary/RevisionHistory.txt

@@ -74,3 +74,5 @@ Revision History:
 1.3.9 - Minor improvements.
 
 1.4.0 - API improvements.
+
+1.4.1 - Improved volume locking mechanism.

+ 4 - 8
DiskAccessLibrary/Win32/Helpers/LockHelper.cs

@@ -46,7 +46,7 @@ namespace DiskAccessLibrary
                 }
             }
 
-            success = LockAllMountedVolumesOrNone(volumeGuids);
+            success = LockAllVolumesOrNone(volumeGuids);
             if (!success)
             {
                 disk.ReleaseLock();
@@ -63,24 +63,20 @@ namespace DiskAccessLibrary
                 Guid? windowsVolumeGuid = WindowsVolumeHelper.GetWindowsVolumeGuid(partition);
                 if (windowsVolumeGuid.HasValue)
                 {
-                    if (WindowsVolumeManager.IsMounted(windowsVolumeGuid.Value))
-                    {
-                        WindowsVolumeManager.ReleaseLock(windowsVolumeGuid.Value);
-                    }
+                    WindowsVolumeManager.ReleaseLock(windowsVolumeGuid.Value);
                 }
             }
 
             disk.ReleaseLock();
         }
 
-        public static bool LockAllMountedVolumesOrNone(List<Guid> volumeGuids)
+        public static bool LockAllVolumesOrNone(List<Guid> volumeGuids)
         {
             bool success = true;
             int lockIndex;
             for (lockIndex = 0; lockIndex < volumeGuids.Count; lockIndex++)
             {
-                // NOTE: The fact that a volume does not have mount points, does not mean it is not mounted and cannot be accessed by Windows
-                success = WindowsVolumeManager.ExclusiveLockIfMounted(volumeGuids[lockIndex]);
+                success = WindowsVolumeManager.ExclusiveLock(volumeGuids[lockIndex]);
                 if (!success)
                 {
                     break;

+ 6 - 18
DiskAccessLibrary/Win32/Helpers/WindowsVolumeManager.cs

@@ -16,23 +16,6 @@ namespace DiskAccessLibrary
 {
     public class WindowsVolumeManager
     {
-        public static bool ExclusiveLockIfMounted(Guid windowsVolumeGuid)
-        {
-            return ExclusiveLockIfMounted(windowsVolumeGuid, FileAccess.ReadWrite);
-        }
-
-        public static bool ExclusiveLockIfMounted(Guid windowsVolumeGuid, FileAccess fileAccess)
-        {
-            if (IsMounted(windowsVolumeGuid))
-            {
-                return ExclusiveLock(windowsVolumeGuid, fileAccess);
-            }
-            else
-            {
-                return true;
-            }
-        }
-
         public static bool ExclusiveLock(Guid windowsVolumeGuid)
         {
             return ExclusiveLock(windowsVolumeGuid, FileAccess.ReadWrite);
@@ -40,7 +23,7 @@ namespace DiskAccessLibrary
 
         /// <summary>
         /// Windows will flush all cached data to the volume before locking it.
-        /// Note: we can only lock a dynamic volume if the disk is online.
+        /// Note: we can only lock a dynamic volume if the disk is online and the volume is operational.
         /// </summary>
         /// <returns>True if a new lock has been obtained</returns>
         public static bool ExclusiveLock(Guid windowsVolumeGuid, FileAccess fileAccess)
@@ -98,6 +81,11 @@ namespace DiskAccessLibrary
             return VolumeHandlePool.ReleaseHandle(windowsVolumeGuid);
         }
 
+        /// <summary>
+        /// If Windows Automount is turned off, then partitions on new disks are not mounted. (but can be locked).
+        /// Failed dynamic volumes are not mounted as well. (and can't be locked).
+        /// Note: A volume can have 0 mount points and still be mounted and access by Windows.
+        /// </summary>
         public static bool IsMounted(Guid windowsVolumeGuid)
         {
             return VolumeUtils.IsVolumeMounted(windowsVolumeGuid);

+ 1 - 1
DiskAccessLibrary/Win32/LogicalDiskManager/LockHelper.cs

@@ -22,7 +22,7 @@ namespace DiskAccessLibrary
             }
 
             List<Guid> volumeGuids = DynamicVolumeHelper.GetVolumeGuids(volumesToLock);
-            success = LockAllMountedVolumesOrNone(volumeGuids);
+            success = LockAllVolumesOrNone(volumeGuids);
             if (!success)
             {
                 DiskLockHelper.ReleaseLock(disksToLock);

+ 11 - 1
DiskAccessLibrary/Win32/LogicalDiskManager/WindowsDynamicVolumeHelper.cs

@@ -32,7 +32,17 @@ namespace DiskAccessLibrary.LogicalDiskManager
                 }
             }
 
-            return DynamicVolumeHelper.GetDynamicVolumes(disks);
+            List<DynamicVolume> dynamicVolumes = DynamicVolumeHelper.GetDynamicVolumes(disks);
+            for (int index = 0; index < dynamicVolumes.Count; index++)
+            {
+                // non-operational volumes cannot be locked
+                if (!dynamicVolumes[index].IsOperational)
+                {
+                    dynamicVolumes.RemoveAt(index);
+                    index--;
+                }
+            }
+            return dynamicVolumes;
         }
     }
 }

+ 1 - 1
DiskAccessLibrary/Win32/Volumes/VolumeHandlePool.cs

@@ -13,7 +13,7 @@ using Utilities;
 
 namespace DiskAccessLibrary
 {
-    class VolumeHandlePool
+    public class VolumeHandlePool
     {
         // We will use the handle pool to share handles to volumes across the application (useful when handle need to lock access to a volume)
         private static Dictionary<Guid, SafeFileHandle> m_handlePool = new Dictionary<Guid, SafeFileHandle>();