Disk Drive Dangers - SMART and WMI
Written by Mike James   
Monday, 01 July 2024
Article Index
Disk Drive Dangers - SMART and WMI
WMI Query Language
Get Smart
Decoding WMI data
Processing the data
Listing

The Complete program with an additional textbox to show the processed data is:

namespace WinFormsApp1
{
    using System.Management;
    using System.Windows.Forms;
    public partial class Form1 : Form
    {
        public struct SMARTAttribute
        {
            public int status;
            public int value;
            public int rawvalue;
            public SMARTAttribute()
            {
                status = 0;
                value = 0;
                rawvalue = 0;
            }
        }
        public struct SMART
        {
         public SMARTAttribute RawReadErrorRate;
         public SMARTAttribute ReallocatedSectorCount;
         public SMARTAttribute ReallocationEventCount;
         public SMARTAttribute CurrentPendingSectorCount;
         public SMARTAttribute
OfflineScanUncorrectableSectorCount;
        }
        public Form1()
        {
            InitializeComponent();
            richTextBox2.Text = "Unknw\tUnknw\tAttribute
\tStatus\tUnknw\tValue\tWorst\t
Raw\t\tUnknw\n";
        }
        private void button1_Click(object sender, 
EventArgs e)
        {
            ManagementObjectSearcher WMISearch =
new ManagementObjectSearcher(
                      "Select * from Win32_DiskDrive");
            ManagementObjectCollection Drives =
WMISearch.Get();
            richTextBox1.Text = "Drive\t\t\tStatus\n";
            foreach (ManagementObject Drive in Drives)
            {
                richTextBox1.Text = richTextBox1.Text +
Drive.Properties["DeviceId"].
Value.ToString() + "\t";
                richTextBox1.Text = richTextBox1.Text +
Drive.Properties["Status"].Value.
ToString() + "\n";
            }
            WMISearch.Scope = new ManagementScope(
@"\root\wmi");
            WMISearch.Query = new ObjectQuery(
"Select * from
MSStorageDriver_FailurePredictData");
            ManagementObjectCollection FailDataSet =
WMISearch.Get();
            foreach (ManagementObject FailData
in FailDataSet)
            {
                Byte[] data = (Byte[])FailData.
Properties["VendorSpecific"].Value;
                for (int i = 0; i < data[0] - 1; i++)
                {
                    for (int j = 0; j < 12; j++)
                    {
                        richTextBox2.Text = richTextBox2.
Text + data[i * 12 + j] + "\t";
                    }
                    richTextBox2.Text = richTextBox2.
Text + "\n";
                }
            }
            SMART smartdata =new SMART();
            foreach (ManagementObject FailData2
in FailDataSet)
            {
                Byte[] data2 = (Byte[])FailData2.
Properties["VendorSpecific"].Value;
                for (int i = 0; i < data2[0] - 1; i++)
                {
                 int start = i * 12;
                 switch (data2[start + 2])
                 {
                  case 1:
                    smartdata.RawReadErrorRate.
value = data2[start + 5];
                    smartdata.RawReadErrorRate.rawvalue =
data2[start + 7] +
256 * data2[start + 8];
                            break;
                  case 5:
                    smartdata.ReallocatedSectorCount.
value = data2[start + 5];
                    smartdata.ReallocatedSectorCount.
rawvalue = data2[start + 7] +
256 * data2[start + 8];
                            break;
                  case 196:
                    smartdata.ReallocationEventCount.
value = data2[start + 5];
                    smartdata.ReallocationEventCount.
rawvalue = data2[start + 7] +
256 * data2[start + 8];
                            break;
                  case 197:
                    smartdata.CurrentPendingSectorCount.
value = data2[start + 5];
                    smartdata.CurrentPendingSectorCount.
rawvalue = data2[start + 7] +
256 * data2[start + 8];
                            break;
                 case 198:
                    smartdata.
OfflineScanUncorrectableSectorCount.
value = data2[start + 5];
                    smartdata.
OfflineScanUncorrectableSectorCount.
rawvalue = data2[start + 7] +
256 * data2[start + 8];
                            break;
                    }
                   
                }
                richTextBox3.Text +=
"Raw Read Error Rate " +
smartdata.RawReadErrorRate.value + "\n";
                richTextBox3.Text +=
"Reallocated Sector Count " +
smartdata.ReallocatedSectorCount.value + "\n";
                richTextBox3.Text +=
"Reallocation Event Count " +
smartdata.ReallocationEventCount.value + "\n";
                richTextBox3.Text +=
"Current Pending Sector Count " +
smartdata.CurrentPendingSectorCount.value + "\n";
                richTextBox3.Text +=
"Offline Scan Uncorrectable Sector Count "
+ smartdata.OfflineScanUncorrectableSectorCount.
value + "\n";
            }
        }
    }
}

More Information

USENIX study - Disk failures in the real world

Related Articles

Getting remote DCOM (WMI) to work

To be informed about new articles on I Programmer, sign up for our weekly newsletter, subscribe to the RSS feed and follow us on Twitter, Facebook or Linkedin.

Banner


Spring I/O 2024 Sessions Now Available Online
30/08/2024

The sessions from this year's premier Spring developer community conference, are now available online, for free.



Software Developer Jobs In Decline?
14/08/2024

After a post-pandemic boom in well-paid jobs for software developers, job openings are now down on pre-pandemic levels and after many, well-publicized, layoffs from major tech companies in 2023, this  [ ... ]


More News

kotlin book

 

Comments




or email your comment to: comments@i-programmer.info

 

<ASIN:0672321440>
<ASIN:1555582990>



Last Updated ( Monday, 01 July 2024 )