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


Deno Not Giving Up Over JavaScript Trademark
01/07/2025

Deno has faced a setback in its attempt to get Oracle to relinquish the JavaScript Trademark. The US Patents Office Trademark Trial and Appeal Board (TTAB) dismissed Deno's fraud claim which is one th [ ... ]



CISA and NSA - Use Rust Or Perhaps Java
02/07/2025

The CISA and the NSA are urging us to adopt memory-safe languages (MSLs) for the sake of cybersecurity. You probably think they mean Rust but things aren't as clear cut as you might expect.


More News

pico book

 

Comments




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

 




Last Updated ( Monday, 01 July 2024 )