Browse Source

handle error in SelectPhysicalDisk

HOME 1 year ago
parent
commit
33a3318b77

+ 8 - 5
DiskAccessLibrary/Win32/Disks/PhysicalDisk.cs

@@ -303,17 +303,17 @@ namespace DiskAccessLibrary
         /// <summary>
         /// Available on Windows Vista and newer
         /// </summary>
-        public bool GetOnlineStatus()
+        public bool? GetOnlineStatus(out string err)
         {
             bool isReadOnly;
-            return GetOnlineStatus(out isReadOnly);
+            return GetOnlineStatus(out isReadOnly,out err);
         }
 
         /// <summary>
         /// Available on Windows Vista and newer
         /// </summary>
         /// <exception cref="System.IO.IOException"></exception>
-        public bool GetOnlineStatus(out bool isReadOnly)
+        public bool? GetOnlineStatus(out bool isReadOnly,out string err)
         {
             bool releaseHandle;
             SafeFileHandle handle = PhysicalDiskHandlePool.ObtainHandle(m_physicalDiskIndex, FileAccess.ReadWrite, ShareMode.Read, out releaseHandle);
@@ -324,6 +324,8 @@ namespace DiskAccessLibrary
                 {
                     PhysicalDiskHandlePool.ReleaseHandle(m_physicalDiskIndex);
                 }
+
+                err = null;
                 return isOnline;
             }
             else
@@ -333,8 +335,9 @@ namespace DiskAccessLibrary
 
                 // get error code and throw
                 int errorCode = Marshal.GetLastWin32Error();
-                string message = String.Format("Failed to get disk {0} online status, Win32 Error: {1}", m_physicalDiskIndex, errorCode);
-                throw new IOException(message);
+                isReadOnly = false;
+                err = $"Failed to get disk {m_physicalDiskIndex} online status, Win32 Error: {errorCode}";
+                return null;
             }
         }
 

+ 1 - 1
DiskAccessLibrary/Win32/Helpers/DiskOfflineHelper.cs

@@ -32,7 +32,7 @@ namespace DiskAccessLibrary.LogicalDiskManager
             foreach (PhysicalDisk disk in physicalDisks)
             {
                 bool isReadOnly;
-                bool isOnline = disk.GetOnlineStatus(out isReadOnly);
+                bool isOnline = disk.GetOnlineStatus(out isReadOnly,out _)?? false;
                 if (!isOnline || isReadOnly)
                 {
                     return false;

+ 14 - 8
ISCSIConsole/Win32/SelectPhysicalDiskForm.Designer.cs

@@ -40,8 +40,9 @@ namespace ISCSIConsole
             // 
             // btnCancel
             // 
+            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
             this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-            this.btnCancel.Location = new System.Drawing.Point(405, 191);
+            this.btnCancel.Location = new System.Drawing.Point(589, 265);
             this.btnCancel.Name = "btnCancel";
             this.btnCancel.Size = new System.Drawing.Size(75, 23);
             this.btnCancel.TabIndex = 1;
@@ -51,7 +52,8 @@ namespace ISCSIConsole
             // 
             // btnOK
             // 
-            this.btnOK.Location = new System.Drawing.Point(324, 191);
+            this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnOK.Location = new System.Drawing.Point(508, 265);
             this.btnOK.Name = "btnOK";
             this.btnOK.Size = new System.Drawing.Size(75, 23);
             this.btnOK.TabIndex = 2;
@@ -61,8 +63,9 @@ namespace ISCSIConsole
             // 
             // chkReadOnly
             // 
+            this.chkReadOnly.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
             this.chkReadOnly.AutoSize = true;
-            this.chkReadOnly.Location = new System.Drawing.Point(12, 195);
+            this.chkReadOnly.Location = new System.Drawing.Point(12, 269);
             this.chkReadOnly.Name = "chkReadOnly";
             this.chkReadOnly.Size = new System.Drawing.Size(78, 16);
             this.chkReadOnly.TabIndex = 3;
@@ -71,19 +74,23 @@ namespace ISCSIConsole
             // 
             // listPhysicalDisks
             // 
+            this.listPhysicalDisks.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
             this.listPhysicalDisks.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
             this.columnDisk,
             this.columnDescription,
             this.columnSerialNumber,
             this.columnSize});
             this.listPhysicalDisks.FullRowSelect = true;
+            this.listPhysicalDisks.GridLines = true;
+            this.listPhysicalDisks.HideSelection = false;
             this.listPhysicalDisks.Location = new System.Drawing.Point(12, 12);
             this.listPhysicalDisks.Name = "listPhysicalDisks";
-            this.listPhysicalDisks.Size = new System.Drawing.Size(468, 173);
+            this.listPhysicalDisks.Size = new System.Drawing.Size(652, 251);
             this.listPhysicalDisks.TabIndex = 4;
             this.listPhysicalDisks.UseCompatibleStateImageBehavior = false;
             this.listPhysicalDisks.View = System.Windows.Forms.View.Details;
-            this.listPhysicalDisks.ColumnWidthChanging += new System.Windows.Forms.ColumnWidthChangingEventHandler(this.listPhysicalDisks_ColumnWidthChanging);
             // 
             // columnDisk
             // 
@@ -109,14 +116,13 @@ namespace ISCSIConsole
             this.AcceptButton = this.btnOK;
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
             this.CancelButton = this.btnCancel;
-            this.ClientSize = new System.Drawing.Size(484, 211);
+            this.ClientSize = new System.Drawing.Size(668, 289);
             this.Controls.Add(this.listPhysicalDisks);
             this.Controls.Add(this.chkReadOnly);
             this.Controls.Add(this.btnOK);
             this.Controls.Add(this.btnCancel);
-            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
             this.MaximizeBox = false;
-            this.MaximumSize = new System.Drawing.Size(500, 250);
+            this.MinimizeBox = false;
             this.MinimumSize = new System.Drawing.Size(500, 250);
             this.Name = "SelectPhysicalDiskForm";
             this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;

+ 12 - 11
ISCSIConsole/Win32/SelectPhysicalDiskForm.cs

@@ -36,9 +36,16 @@ namespace ISCSIConsole
                 item.SubItems.Add(sizeString);
                 if (Environment.OSVersion.Version.Major >= 6)
                 {
-                    bool isOnline = physicalDisk.GetOnlineStatus();
-                    string status = isOnline ? "Online" : "Offline";
-                    item.SubItems.Add(status);
+                    var isOnline = physicalDisk.GetOnlineStatus(out string err);
+                    if (isOnline == null)
+                    {
+                        item.SubItems.Add(err);
+                    }
+                    else
+                    {
+                        string status = isOnline.Value ? "Online" : "Offline";
+                        item.SubItems.Add(status);
+                    }
                 }
                 item.Tag = physicalDisk;
                 listPhysicalDisks.Items.Add(item);
@@ -62,7 +69,7 @@ namespace ISCSIConsole
                 if (Environment.OSVersion.Version.Major >= 6)
                 {
                     bool isDiskReadOnly;
-                    bool isOnline = selectedDisk.GetOnlineStatus(out isDiskReadOnly);
+                    bool isOnline = selectedDisk.GetOnlineStatus(out isDiskReadOnly, out _) ?? false;
                     if (isDiskReadOnly)
                     {
                         MessageBox.Show("The selected disk is set to readonly", "Error");
@@ -140,11 +147,5 @@ namespace ISCSIConsole
                 return m_selectedDisk;
             }
         }
-
-        private void listPhysicalDisks_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e)
-        {
-            e.NewWidth = ((ListView)sender).Columns[e.ColumnIndex].Width;
-            e.Cancel = true;
-        }
     }
-}
+}

+ 1 - 1
ISCSIConsole/Win32/VolumeInfo.cs

@@ -19,7 +19,7 @@ namespace ISCSIConsole
             IList<PhysicalDisk> disks = GetVolumeDisks(volume);
             foreach (PhysicalDisk disk in disks)
             {
-                bool isOnline = disk.GetOnlineStatus();
+                bool isOnline = disk.GetOnlineStatus(out _) ?? false;
                 if (isOnline)
                 {
                     return false;