# HG changeset patch
# User moel.mich
# Date 1325529859 0
# Node ID f837f9f0973e63feb3a54e710de52dd88febd1f9
# Parent  e837e1e4b282ee694e19cbcbba10c48f651457b3
Added SMART support for Samsung SSDs.

diff -r e837e1e4b282 -r f837f9f0973e Hardware/HDD/AbstractHarddrive.cs
--- a/Hardware/HDD/AbstractHarddrive.cs	Sun Jan 01 17:12:34 2012 +0000
+++ b/Hardware/HDD/AbstractHarddrive.cs	Mon Jan 02 18:44:19 2012 +0000
@@ -54,6 +54,7 @@
       typeof(SSDIntel),
       typeof(SSDSandforce),
       typeof(SSDIndilinx),
+      typeof(SSDSamsung),
       typeof(GenericHarddisk)
     };
 
@@ -233,7 +234,7 @@
         r.AppendFormat(CultureInfo.InvariantCulture, 
           " {0}{1}{2}{3}{4}{5}{6}{7}",
           ("ID").PadRight(3),
-          ("Description").PadRight(32),
+          ("Description").PadRight(35),
           ("Raw Value").PadRight(13),
           ("Worst").PadRight(6),
           ("Value").PadRight(6),
@@ -268,7 +269,7 @@
           r.AppendFormat(CultureInfo.InvariantCulture, 
             " {0}{1}{2}{3}{4}{5}{6}{7}",
             value.Identifier.ToString("X2").PadRight(3),
-            description.PadRight(32),
+            description.PadRight(35),
             raw.Replace("-", "").PadRight(13),
             value.WorstValue.ToString(CultureInfo.InvariantCulture).PadRight(6),
             value.AttrValue.ToString(CultureInfo.InvariantCulture).PadRight(6),
diff -r e837e1e4b282 -r f837f9f0973e Hardware/HDD/DebugSmart.cs
--- a/Hardware/HDD/DebugSmart.cs	Sun Jan 01 17:12:34 2012 +0000
+++ b/Hardware/HDD/DebugSmart.cs	Mon Jan 02 18:44:19 2012 +0000
@@ -46,7 +46,7 @@
   internal class DebugSmart : ISmart {
 
     private Drive[] drives = {
-      new Drive("KINGSTON SNV425S264GB", 16,
+      new Drive("KINGSTON SNV425S264GB", null, 16,
         @" 01 000000000000 100 100      
            02 000000000000 100 100      
            03 000000000000 100 100      
@@ -65,7 +65,7 @@
            AA 07007B000000 100 100      
            AD 0E1E71304919 100 100"),
 
-      new Drive("PLEXTOR  PX-128M2S", 16, 
+      new Drive("PLEXTOR  PX-128M2S", "1.03", 16, 
         @" 01 000000000000 100 100 0   
            03 000000000000 100 100 0   
            04 000000000000 100 100 0   
@@ -84,7 +84,7 @@
            C6 000000000000 100 100 0   
            C7 000000000000 100 100 0"),
 
-      new Drive("OCZ-VERTEX2", 16, 
+      new Drive("OCZ-VERTEX2", "1.25", 16, 
         @" 01 DADAD5000000 100 106 50
            05 000000000000 100 100 3 
            09 DF0900004A2F 100 100 0 
@@ -105,7 +105,7 @@
            F1 000600000000 0   0   0 
            F2 801200000000 0   0   0"),
       
-      new Drive("WDC WD5000AADS-00S9B0", 10, 
+      new Drive("WDC WD5000AADS-00S9B0", null, 10, 
         @" 1   000000000000 200 200         
            3   820D00000000 149 150         
            4   610800000000 98  98          
@@ -127,7 +127,7 @@
            5   000000000000 0   0           
            1   000000000000 0   0"),
 
-      new Drive("INTEL SSDSA2M080G2GC", 10, 
+      new Drive("INTEL SSDSA2M080G2GC", null, 10, 
         @" 3   000000000000 100 100         
            4   000000000000 100 100         
            5   010000000000 100 100         
@@ -143,7 +143,7 @@
            184 000000000000 100 100         
            1   000000000000 0   0"),
 
-      new Drive("OCZ-VERTEX", 10, 
+      new Drive("OCZ-VERTEX", null, 10, 
         @" 1   000000000000 0   8   
            9   000000000000 30  99  
            12  000000000000 0   15  
@@ -167,7 +167,7 @@
            212 000000000000 0   0   
            213 000000000000 0   0"),
  
-      new Drive("INTEL SSDSA2CW120G3", 16,
+      new Drive("INTEL SSDSA2CW120G3", null, 16,
         @"03 000000000000 100 100 0
           04 000000000000 100 100 0
           05 000000000000 100 100 0
@@ -186,7 +186,26 @@
           E8 000000000000 100 100 0
           E9 000000000000 100 100 0
           F1 FF4300000000 100 100 0
-          F2 264F00000000 100 100 0")
+          F2 264F00000000 100 100 0"),
+
+     new Drive("CORSAIR CMFSSD-128GBG2D", "VBM19C1Q", 16, 
+       @"09 100900000000 99  99  0 
+         0C 560200000000 99  99  0 
+         AF 000000000000 100 100 10
+         B0 000000000000 100 100 10
+         B1 2A0000000000 99  99  17
+         B2 180000000000 60  60  10
+         B3 4B0000000000 98  98  10
+         B4 B50E00000000 98  98  10
+         B5 000000000000 100 100 10
+         B6 000000000000 100 100 10
+         B7 000000000000 100 100 10
+         BB 000000000000 100 100 0 
+         C3 000000000000 200 200 0 
+         C6 000000000000 100 100 0 
+         C7 810100000000 253 253 0 
+         E8 240000000000 60  60  10
+         E9 630594120000 92  92  0")
       };
 
     public IntPtr OpenDrive(int driveNumber) {
@@ -225,7 +244,7 @@
         throw new ArgumentOutOfRangeException();
 
       name = drives[driveNumber].Name;
-      firmwareRevision = "";
+      firmwareRevision = drives[driveNumber].FirmwareVersion;
       return true;
     }
 
@@ -234,8 +253,9 @@
 
     private class Drive {
 
-      public Drive(string name, int idBase, string value) {
+      public Drive(string name, string firmware, int idBase, string value) {
         this.Name = name;
+        this.FirmwareVersion = firmware;
 
         string[] lines = value.Split(new[] { '\r', '\n' }, 
           StringSplitOptions.RemoveEmptyEntries);
@@ -280,6 +300,8 @@
       public DriveThresholdValue[] DriveThresholdValues { get; private set; }
 
       public string Name { get; private set; }
+
+      public string FirmwareVersion { get; private set; }
     }
 
     public IntPtr InvalidHandle { get { return (IntPtr)(-1); } }
diff -r e837e1e4b282 -r f837f9f0973e Hardware/HDD/HDDGeneric.cs
--- a/Hardware/HDD/HDDGeneric.cs	Sun Jan 01 17:12:34 2012 +0000
+++ b/Hardware/HDD/HDDGeneric.cs	Mon Jan 02 18:44:19 2012 +0000
@@ -48,71 +48,71 @@
 
     private static readonly List<SmartAttribute> smartAttributes =
       new List<SmartAttribute> {
-      new SmartAttribute(0x01, SmartAttributeNames.ReadErrorRate),
-      new SmartAttribute(0x02, SmartAttributeNames.ThroughputPerformance),
-      new SmartAttribute(0x03, SmartAttributeNames.SpinUpTime),
-      new SmartAttribute(0x04, SmartAttributeNames.StartStopCount, RawToInt),
-      new SmartAttribute(0x05, SmartAttributeNames.ReallocatedSectorsCount),
-      new SmartAttribute(0x06, SmartAttributeNames.ReadChannelMargin),
-      new SmartAttribute(0x07, SmartAttributeNames.SeekErrorRate),
-      new SmartAttribute(0x08, SmartAttributeNames.SeekTimePerformance),
-      new SmartAttribute(0x09, SmartAttributeNames.PowerOnHours, RawToInt),
-      new SmartAttribute(0x0A, SmartAttributeNames.SpinRetryCount),
-      new SmartAttribute(0x0B, SmartAttributeNames.RecalibrationRetries),
-      new SmartAttribute(0x0C, SmartAttributeNames.PowerCycleCount, RawToInt),
-      new SmartAttribute(0x0D, SmartAttributeNames.SoftReadErrorRate),
-      new SmartAttribute(0xAA, SmartAttributeNames.Unknown), 
-      new SmartAttribute(0xAB, SmartAttributeNames.Unknown), 
-      new SmartAttribute(0xAC, SmartAttributeNames.Unknown),
-      new SmartAttribute(0xB7, SmartAttributeNames.SataDownshiftErrorCount),
-      new SmartAttribute(0xB8, SmartAttributeNames.EndToEndError),
-      new SmartAttribute(0xB9, SmartAttributeNames.HeadStability),
-      new SmartAttribute(0xBA, SmartAttributeNames.InducedOpVibrationDetection),
-      new SmartAttribute(0xBB, SmartAttributeNames.ReportedUncorrectableErrors),
-      new SmartAttribute(0xBC, SmartAttributeNames.CommandTimeout),
-      new SmartAttribute(0xBD, SmartAttributeNames.HighFlyWrites),
-      new SmartAttribute(0xBF, SmartAttributeNames.GSenseErrorRate),
-      new SmartAttribute(0xC0, SmartAttributeNames.EmergencyRetractCycleCount),
-      new SmartAttribute(0xC1, SmartAttributeNames.LoadCycleCount),
-      new SmartAttribute(0xC3, SmartAttributeNames.HardwareEccRecovered),
-      new SmartAttribute(0xC4, SmartAttributeNames.ReallocationEventCount),
-      new SmartAttribute(0xC5, SmartAttributeNames.CurrentPendingSectorCount),
-      new SmartAttribute(0xC6, SmartAttributeNames.UncorrectableSectorCount),
-      new SmartAttribute(0xC7, SmartAttributeNames.UltraDmaCrcErrorCount),
-      new SmartAttribute(0xC8, SmartAttributeNames.WriteErrorRate),
-      new SmartAttribute(0xCA, SmartAttributeNames.DataAddressMarkErrors),
-      new SmartAttribute(0xCB, SmartAttributeNames.RunOutCancel),
-      new SmartAttribute(0xCC, SmartAttributeNames.SoftEccCorrection),
-      new SmartAttribute(0xCD, SmartAttributeNames.ThermalAsperityRate),
-      new SmartAttribute(0xCE, SmartAttributeNames.FlyingHeight),
-      new SmartAttribute(0xCF, SmartAttributeNames.SpinHighCurrent),
-      new SmartAttribute(0xD0, SmartAttributeNames.SpinBuzz),
-      new SmartAttribute(0xD1, SmartAttributeNames.OfflineSeekPerformance),
-      new SmartAttribute(0xD3, SmartAttributeNames.VibrationDuringWrite),
-      new SmartAttribute(0xD4, SmartAttributeNames.ShockDuringWrite),
-      new SmartAttribute(0xDC, SmartAttributeNames.DiskShift),
-      new SmartAttribute(0xDD, SmartAttributeNames.AlternativeGSenseErrorRate), 
-      new SmartAttribute(0xDE, SmartAttributeNames.LoadedHours),
-      new SmartAttribute(0xDF, SmartAttributeNames.LoadUnloadRetryCount),
-      new SmartAttribute(0xE0, SmartAttributeNames.LoadFriction),
-      new SmartAttribute(0xE1, SmartAttributeNames.LoadUnloadCycleCount),
-      new SmartAttribute(0xE2, SmartAttributeNames.LoadInTime),
-      new SmartAttribute(0xE3, SmartAttributeNames.TorqueAmplificationCount),
-      new SmartAttribute(0xE4, SmartAttributeNames.PowerOffRetractCycle),
-      new SmartAttribute(0xE6, SmartAttributeNames.GmrHeadAmplitude),      
-      new SmartAttribute(0xE8, SmartAttributeNames.EnduranceRemaining),
-      new SmartAttribute(0xE9, SmartAttributeNames.PowerOnHours),
-      new SmartAttribute(0xF0, SmartAttributeNames.HeadFlyingHours),
-      new SmartAttribute(0xF1, SmartAttributeNames.TotalLbasWritten),
-      new SmartAttribute(0xF2, SmartAttributeNames.TotalLbasRead),
-      new SmartAttribute(0xFA, SmartAttributeNames.ReadErrorRetryRate),
-      new SmartAttribute(0xFE, SmartAttributeNames.FreeFallProtection),
+      new SmartAttribute(0x01, SmartNames.ReadErrorRate),
+      new SmartAttribute(0x02, SmartNames.ThroughputPerformance),
+      new SmartAttribute(0x03, SmartNames.SpinUpTime),
+      new SmartAttribute(0x04, SmartNames.StartStopCount, RawToInt),
+      new SmartAttribute(0x05, SmartNames.ReallocatedSectorsCount),
+      new SmartAttribute(0x06, SmartNames.ReadChannelMargin),
+      new SmartAttribute(0x07, SmartNames.SeekErrorRate),
+      new SmartAttribute(0x08, SmartNames.SeekTimePerformance),
+      new SmartAttribute(0x09, SmartNames.PowerOnHours, RawToInt),
+      new SmartAttribute(0x0A, SmartNames.SpinRetryCount),
+      new SmartAttribute(0x0B, SmartNames.RecalibrationRetries),
+      new SmartAttribute(0x0C, SmartNames.PowerCycleCount, RawToInt),
+      new SmartAttribute(0x0D, SmartNames.SoftReadErrorRate),
+      new SmartAttribute(0xAA, SmartNames.Unknown), 
+      new SmartAttribute(0xAB, SmartNames.Unknown), 
+      new SmartAttribute(0xAC, SmartNames.Unknown),
+      new SmartAttribute(0xB7, SmartNames.SataDownshiftErrorCount),
+      new SmartAttribute(0xB8, SmartNames.EndToEndError),
+      new SmartAttribute(0xB9, SmartNames.HeadStability),
+      new SmartAttribute(0xBA, SmartNames.InducedOpVibrationDetection),
+      new SmartAttribute(0xBB, SmartNames.ReportedUncorrectableErrors),
+      new SmartAttribute(0xBC, SmartNames.CommandTimeout),
+      new SmartAttribute(0xBD, SmartNames.HighFlyWrites),
+      new SmartAttribute(0xBF, SmartNames.GSenseErrorRate),
+      new SmartAttribute(0xC0, SmartNames.EmergencyRetractCycleCount),
+      new SmartAttribute(0xC1, SmartNames.LoadCycleCount),
+      new SmartAttribute(0xC3, SmartNames.HardwareEccRecovered),
+      new SmartAttribute(0xC4, SmartNames.ReallocationEventCount),
+      new SmartAttribute(0xC5, SmartNames.CurrentPendingSectorCount),
+      new SmartAttribute(0xC6, SmartNames.UncorrectableSectorCount),
+      new SmartAttribute(0xC7, SmartNames.UltraDmaCrcErrorCount),
+      new SmartAttribute(0xC8, SmartNames.WriteErrorRate),
+      new SmartAttribute(0xCA, SmartNames.DataAddressMarkErrors),
+      new SmartAttribute(0xCB, SmartNames.RunOutCancel),
+      new SmartAttribute(0xCC, SmartNames.SoftEccCorrection),
+      new SmartAttribute(0xCD, SmartNames.ThermalAsperityRate),
+      new SmartAttribute(0xCE, SmartNames.FlyingHeight),
+      new SmartAttribute(0xCF, SmartNames.SpinHighCurrent),
+      new SmartAttribute(0xD0, SmartNames.SpinBuzz),
+      new SmartAttribute(0xD1, SmartNames.OfflineSeekPerformance),
+      new SmartAttribute(0xD3, SmartNames.VibrationDuringWrite),
+      new SmartAttribute(0xD4, SmartNames.ShockDuringWrite),
+      new SmartAttribute(0xDC, SmartNames.DiskShift),
+      new SmartAttribute(0xDD, SmartNames.AlternativeGSenseErrorRate), 
+      new SmartAttribute(0xDE, SmartNames.LoadedHours),
+      new SmartAttribute(0xDF, SmartNames.LoadUnloadRetryCount),
+      new SmartAttribute(0xE0, SmartNames.LoadFriction),
+      new SmartAttribute(0xE1, SmartNames.LoadUnloadCycleCount),
+      new SmartAttribute(0xE2, SmartNames.LoadInTime),
+      new SmartAttribute(0xE3, SmartNames.TorqueAmplificationCount),
+      new SmartAttribute(0xE4, SmartNames.PowerOffRetractCycle),
+      new SmartAttribute(0xE6, SmartNames.GmrHeadAmplitude),      
+      new SmartAttribute(0xE8, SmartNames.EnduranceRemaining),
+      new SmartAttribute(0xE9, SmartNames.PowerOnHours),
+      new SmartAttribute(0xF0, SmartNames.HeadFlyingHours),
+      new SmartAttribute(0xF1, SmartNames.TotalLbasWritten),
+      new SmartAttribute(0xF2, SmartNames.TotalLbasRead),
+      new SmartAttribute(0xFA, SmartNames.ReadErrorRetryRate),
+      new SmartAttribute(0xFE, SmartNames.FreeFallProtection),
 
-      new SmartAttribute(0xC2, SmartAttributeNames.Temperature, 
+      new SmartAttribute(0xC2, SmartNames.Temperature, 
         (byte[] r, byte v) => { return r[0]; }, SensorType.Temperature, 0),
-      new SmartAttribute(0xE7, SmartAttributeNames.Temperature, 
+      new SmartAttribute(0xE7, SmartNames.Temperature, 
         (byte[] r, byte v) => { return r[0]; }, SensorType.Temperature, 0),
-      new SmartAttribute(0xBE, SmartAttributeNames.TemperatureDifferenceFrom100, 
+      new SmartAttribute(0xBE, SmartNames.TemperatureDifferenceFrom100, 
         null, SensorType.Temperature, 0)
     };
 
diff -r e837e1e4b282 -r f837f9f0973e Hardware/HDD/SSDIndilinx.cs
--- a/Hardware/HDD/SSDIndilinx.cs	Sun Jan 01 17:12:34 2012 +0000
+++ b/Hardware/HDD/SSDIndilinx.cs	Mon Jan 02 18:44:19 2012 +0000
@@ -46,26 +46,26 @@
     private static readonly IEnumerable<SmartAttribute> smartAttributes =
       new List<SmartAttribute> {
 
-     new SmartAttribute(0xB8, SmartAttributeNames.InitialBadBlockCount),
-     new SmartAttribute(0xC3, SmartAttributeNames.ProgramFailure),
-     new SmartAttribute(0xC4, SmartAttributeNames.EraseFailure),
-     new SmartAttribute(0xC5, SmartAttributeNames.ReadFailure),
-     new SmartAttribute(0xC6, SmartAttributeNames.SectorsRead),
-     new SmartAttribute(0xC7, SmartAttributeNames.SectorsWritten),
-     new SmartAttribute(0xC8, SmartAttributeNames.ReadCommands),
-     new SmartAttribute(0xC9, SmartAttributeNames.WriteCommands),
-     new SmartAttribute(0xCA, SmartAttributeNames.BitErrors),
-     new SmartAttribute(0xCB, SmartAttributeNames.CorrectedErrors),
-     new SmartAttribute(0xCC, SmartAttributeNames.BadBlockFullFlag),
-     new SmartAttribute(0xCD, SmartAttributeNames.MaxCellCycles),
-     new SmartAttribute(0xCE, SmartAttributeNames.MinErase),
-     new SmartAttribute(0xCF, SmartAttributeNames.MaxErase),
-     new SmartAttribute(0xD0, SmartAttributeNames.AverageEraseCount),
-     new SmartAttribute(0xD1, SmartAttributeNames.RemainingLife,
+     new SmartAttribute(0xB8, SmartNames.InitialBadBlockCount),
+     new SmartAttribute(0xC3, SmartNames.ProgramFailure),
+     new SmartAttribute(0xC4, SmartNames.EraseFailure),
+     new SmartAttribute(0xC5, SmartNames.ReadFailure),
+     new SmartAttribute(0xC6, SmartNames.SectorsRead),
+     new SmartAttribute(0xC7, SmartNames.SectorsWritten),
+     new SmartAttribute(0xC8, SmartNames.ReadCommands),
+     new SmartAttribute(0xC9, SmartNames.WriteCommands),
+     new SmartAttribute(0xCA, SmartNames.BitErrors),
+     new SmartAttribute(0xCB, SmartNames.CorrectedErrors),
+     new SmartAttribute(0xCC, SmartNames.BadBlockFullFlag),
+     new SmartAttribute(0xCD, SmartNames.MaxCellCycles),
+     new SmartAttribute(0xCE, SmartNames.MinErase),
+     new SmartAttribute(0xCF, SmartNames.MaxErase),
+     new SmartAttribute(0xD0, SmartNames.AverageEraseCount),
+     new SmartAttribute(0xD1, SmartNames.RemainingLife,
        null, SensorType.Level, 0),
-     new SmartAttribute(0xD2, SmartAttributeNames.UnknownUnique),
-     new SmartAttribute(0xD3, SmartAttributeNames.SataErrorCountCrc),
-     new SmartAttribute(0xD4, SmartAttributeNames.SataErrorCountHandshake),
+     new SmartAttribute(0xD2, SmartNames.UnknownUnique),
+     new SmartAttribute(0xD3, SmartNames.SataErrorCountCrc),
+     new SmartAttribute(0xD4, SmartNames.SataErrorCountHandshake),
     };
 
     public SSDIndilinx(ISmart smart, string name, string firmwareRevision, 
diff -r e837e1e4b282 -r f837f9f0973e Hardware/HDD/SSDIntel.cs
--- a/Hardware/HDD/SSDIntel.cs	Sun Jan 01 17:12:34 2012 +0000
+++ b/Hardware/HDD/SSDIntel.cs	Mon Jan 02 18:44:19 2012 +0000
@@ -47,27 +47,27 @@
     private static readonly IEnumerable<SmartAttribute> smartAttributes =
       new List<SmartAttribute> {
 
-      new SmartAttribute(0x01, SmartAttributeNames.ReadErrorRate),
-      new SmartAttribute(0x03, SmartAttributeNames.SpinUpTime),
-      new SmartAttribute(0x04, SmartAttributeNames.StartStopCount, RawToInt),
-      new SmartAttribute(0x05, SmartAttributeNames.ReallocatedSectorsCount),
-      new SmartAttribute(0x09, SmartAttributeNames.PowerOnHours, RawToInt),
-      new SmartAttribute(0x0C, SmartAttributeNames.PowerCycleCount, RawToInt),
-      new SmartAttribute(0xAA, SmartAttributeNames.AvailableReservedSpace),
-      new SmartAttribute(0xAB, SmartAttributeNames.ProgramFailCount),
-      new SmartAttribute(0xAC, SmartAttributeNames.EraseFailCount),
-      new SmartAttribute(0xB8, SmartAttributeNames.EndToEndError),
-      new SmartAttribute(0xC0, SmartAttributeNames.UnsafeShutdownCount), 
-      new SmartAttribute(0xE1, SmartAttributeNames.HostWrites, 
+      new SmartAttribute(0x01, SmartNames.ReadErrorRate),
+      new SmartAttribute(0x03, SmartNames.SpinUpTime),
+      new SmartAttribute(0x04, SmartNames.StartStopCount, RawToInt),
+      new SmartAttribute(0x05, SmartNames.ReallocatedSectorsCount),
+      new SmartAttribute(0x09, SmartNames.PowerOnHours, RawToInt),
+      new SmartAttribute(0x0C, SmartNames.PowerCycleCount, RawToInt),
+      new SmartAttribute(0xAA, SmartNames.AvailableReservedSpace),
+      new SmartAttribute(0xAB, SmartNames.ProgramFailCount),
+      new SmartAttribute(0xAC, SmartNames.EraseFailCount),
+      new SmartAttribute(0xB8, SmartNames.EndToEndError),
+      new SmartAttribute(0xC0, SmartNames.UnsafeShutdownCount), 
+      new SmartAttribute(0xE1, SmartNames.HostWrites, 
         (byte[] r, byte v) => { return RawToInt(r, v) / 0x20; }, 
         SensorType.Data, 0),
-      new SmartAttribute(0xE8, SmartAttributeNames.RemainingLife, 
+      new SmartAttribute(0xE8, SmartNames.RemainingLife, 
         null, SensorType.Level, 0),
-      new SmartAttribute(0xE9, SmartAttributeNames.MediaWearOutIndicator),
-      new SmartAttribute(0xF1, SmartAttributeNames.HostWrites,
+      new SmartAttribute(0xE9, SmartNames.MediaWearOutIndicator),
+      new SmartAttribute(0xF1, SmartNames.HostWrites,
         (byte[] r, byte v) => { return RawToInt(r, v) / 0x20; }, 
         SensorType.Data, 0),
-      new SmartAttribute(0xF2, SmartAttributeNames.HostReads, 
+      new SmartAttribute(0xF2, SmartNames.HostReads, 
         (byte[] r, byte v) => { return RawToInt(r, v) / 0x20; }, 
         SensorType.Data, 1),      
     };
diff -r e837e1e4b282 -r f837f9f0973e Hardware/HDD/SSDPlextor.cs
--- a/Hardware/HDD/SSDPlextor.cs	Sun Jan 01 17:12:34 2012 +0000
+++ b/Hardware/HDD/SSDPlextor.cs	Mon Jan 02 18:44:19 2012 +0000
@@ -43,8 +43,8 @@
 
     private static readonly IEnumerable<SmartAttribute> smartAttributes =
       new List<SmartAttribute> {
-      new SmartAttribute(0x09, SmartAttributeNames.PowerOnHours, RawToInt),
-      new SmartAttribute(0x0C, SmartAttributeNames.PowerCycleCount, RawToInt),
+      new SmartAttribute(0x09, SmartNames.PowerOnHours, RawToInt),
+      new SmartAttribute(0x0C, SmartNames.PowerCycleCount, RawToInt),
     };
 
     public SSDPlextor(ISmart smart, string name, string firmwareRevision, 
diff -r e837e1e4b282 -r f837f9f0973e Hardware/HDD/SSDSamsung.cs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Hardware/HDD/SSDSamsung.cs	Mon Jan 02 18:44:19 2012 +0000
@@ -0,0 +1,77 @@
+/*
+  
+  Version: MPL 1.1/GPL 2.0/LGPL 2.1
+
+  The contents of this file are subject to the Mozilla Public License Version
+  1.1 (the "License"); you may not use this file except in compliance with
+  the License. You may obtain a copy of the License at
+ 
+  http://www.mozilla.org/MPL/
+
+  Software distributed under the License is distributed on an "AS IS" basis,
+  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+  for the specific language governing rights and limitations under the License.
+
+  The Original Code is the Open Hardware Monitor code.
+
+  The Initial Developer of the Original Code is 
+  Michael Möller <m.moeller@gmx.ch>.
+  Portions created by the Initial Developer are Copyright (C) 2012
+  the Initial Developer. All Rights Reserved.
+
+  Contributor(s):
+
+  Alternatively, the contents of this file may be used under the terms of
+  either the GNU General Public License Version 2 or later (the "GPL"), or
+  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+  in which case the provisions of the GPL or the LGPL are applicable instead
+  of those above. If you wish to allow use of your version of this file only
+  under the terms of either the GPL or the LGPL, and not to allow others to
+  use your version of this file under the terms of the MPL, indicate your
+  decision by deleting the provisions above and replace them with the notice
+  and other provisions required by the GPL or the LGPL. If you do not delete
+  the provisions above, a recipient may use your version of this file under
+  the terms of any one of the MPL, the GPL or the LGPL.
+ 
+*/
+
+namespace OpenHardwareMonitor.Hardware.HDD {
+  using System.Collections.Generic;
+
+  [NamePrefix(""), RequireSmart(0xB0), RequireSmart(0xB1), RequireSmart(0xB2), 
+    RequireSmart(0xB3), RequireSmart(0xB4), RequireSmart(0xB5), 
+    RequireSmart(0xB6), RequireSmart(0xB7)]
+  internal class SSDSamsung : AbstractHarddrive {
+
+    private static readonly IEnumerable<SmartAttribute> smartAttributes =
+      new List<SmartAttribute> {
+      new SmartAttribute(0x09, SmartNames.PowerOnHours, RawToInt),
+      new SmartAttribute(0x0C, SmartNames.PowerCycleCount, RawToInt),
+      new SmartAttribute(0xAF, SmartNames.ProgramFailCountChip, RawToInt),
+      new SmartAttribute(0xB0, SmartNames.EraseFailCountChip, RawToInt),
+      new SmartAttribute(0xB1, SmartNames.WearLevelingCount, RawToInt),
+      new SmartAttribute(0xB2, SmartNames.UsedReservedBlockCountChip, RawToInt),
+      new SmartAttribute(0xB3, SmartNames.UsedReservedBlockCountTotal, RawToInt),
+
+      // Unused Reserved Block Count (Total)
+      new SmartAttribute(0xB4, SmartNames.RemainingLife,
+        null, SensorType.Level, 0),
+      
+      new SmartAttribute(0xB5, SmartNames.ProgramFailCountTotal, RawToInt),
+      new SmartAttribute(0xB6, SmartNames.EraseFailCountTotal, RawToInt),
+      new SmartAttribute(0xB7, SmartNames.RuntimeBadBlockTotal, RawToInt),
+      new SmartAttribute(0xBB, SmartNames.UncorrectableErrorCount, RawToInt),
+      new SmartAttribute(0xBE, SmartNames.TemperatureExceedCount, RawToInt),
+      new SmartAttribute(0xC2, SmartNames.AirflowTemperature),
+      new SmartAttribute(0xC3, SmartNames.ECCRate),
+      new SmartAttribute(0xC6, SmartNames.OffLineUncorrectableErrorCount, RawToInt),
+      new SmartAttribute(0xC7, SmartNames.CRCErrorCount, RawToInt),
+      new SmartAttribute(0xC9, SmartNames.SupercapStatus),
+      new SmartAttribute(0xCA, SmartNames.ExceptionModeStatus)
+    };
+
+    public SSDSamsung(ISmart smart, string name, string firmwareRevision,
+      int index, ISettings settings)
+      : base(smart, name, firmwareRevision, index, smartAttributes, settings) { }
+  }
+}
diff -r e837e1e4b282 -r f837f9f0973e Hardware/HDD/SSDSandforce.cs
--- a/Hardware/HDD/SSDSandforce.cs	Sun Jan 01 17:12:34 2012 +0000
+++ b/Hardware/HDD/SSDSandforce.cs	Mon Jan 02 18:44:19 2012 +0000
@@ -44,23 +44,23 @@
 
     private static readonly IEnumerable<SmartAttribute> smartAttributes =
       new List<SmartAttribute> {
-      new SmartAttribute(0x05, SmartAttributeNames.RetiredBlockCount),
-      new SmartAttribute(0x09, SmartAttributeNames.PowerOnHours, RawToInt),
-      new SmartAttribute(0x0C, SmartAttributeNames.PowerCycleCount, RawToInt),
-      new SmartAttribute(0xAB, SmartAttributeNames.ProgramFailCount),
-      new SmartAttribute(0xAC, SmartAttributeNames.EraseFailCount),
-      new SmartAttribute(0xAE, SmartAttributeNames.UnexpectedPowerLossCount),
-      new SmartAttribute(0xB1, SmartAttributeNames.WearRangeDelta),
-      new SmartAttribute(0xB5, SmartAttributeNames.AlternativeProgramFailCount),
-      new SmartAttribute(0xB6, SmartAttributeNames.AlternativeEraseFailCount),
-      new SmartAttribute(0xC3, SmartAttributeNames.UnrecoverableEcc), 
-      new SmartAttribute(0xC4, SmartAttributeNames.ReallocationEventCount),
-      new SmartAttribute(0xE7, SmartAttributeNames.RemainingLife, 
+      new SmartAttribute(0x05, SmartNames.RetiredBlockCount),
+      new SmartAttribute(0x09, SmartNames.PowerOnHours, RawToInt),
+      new SmartAttribute(0x0C, SmartNames.PowerCycleCount, RawToInt),
+      new SmartAttribute(0xAB, SmartNames.ProgramFailCount),
+      new SmartAttribute(0xAC, SmartNames.EraseFailCount),
+      new SmartAttribute(0xAE, SmartNames.UnexpectedPowerLossCount),
+      new SmartAttribute(0xB1, SmartNames.WearRangeDelta),
+      new SmartAttribute(0xB5, SmartNames.AlternativeProgramFailCount),
+      new SmartAttribute(0xB6, SmartNames.AlternativeEraseFailCount),
+      new SmartAttribute(0xC3, SmartNames.UnrecoverableEcc), 
+      new SmartAttribute(0xC4, SmartNames.ReallocationEventCount),
+      new SmartAttribute(0xE7, SmartNames.RemainingLife, 
         null, SensorType.Level, 0),
-      new SmartAttribute(0xF1, SmartAttributeNames.HostWrites, 
+      new SmartAttribute(0xF1, SmartNames.HostWrites, 
         (byte[] r, byte v) => { return RawToInt(r, v); }, 
         SensorType.Data, 0),
-      new SmartAttribute(0xF2, SmartAttributeNames.HostReads, 
+      new SmartAttribute(0xF2, SmartNames.HostReads, 
         (byte[] r, byte v) => { return RawToInt(r, v); }, 
         SensorType.Data, 1)
     };
diff -r e837e1e4b282 -r f837f9f0973e Hardware/HDD/SmartAttributeNames.cs
--- a/Hardware/HDD/SmartAttributeNames.cs	Sun Jan 01 17:12:34 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,449 +0,0 @@
-/*
-  
-  Version: MPL 1.1/GPL 2.0/LGPL 2.1
-
-  The contents of this file are subject to the Mozilla Public License Version
-  1.1 (the "License"); you may not use this file except in compliance with
-  the License. You may obtain a copy of the License at
- 
-  http://www.mozilla.org/MPL/
-
-  Software distributed under the License is distributed on an "AS IS" basis,
-  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-  for the specific language governing rights and limitations under the License.
-
-  The Original Code is the Open Hardware Monitor code.
-
-  The Initial Developer of the Original Code is 
-  Roland Reinl <roland-reinl@gmx.de>.
-  Portions created by the Initial Developer are Copyright (C) 2011
-  the Initial Developer. All Rights Reserved.
-
-  Contributor(s):
-    Michael Möller <m.moeller@gmx.ch>
- 
-  Alternatively, the contents of this file may be used under the terms of
-  either the GNU General Public License Version 2 or later (the "GPL"), or
-  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-  in which case the provisions of the GPL or the LGPL are applicable instead
-  of those above. If you wish to allow use of your version of this file only
-  under the terms of either the GPL or the LGPL, and not to allow others to
-  use your version of this file under the terms of the MPL, indicate your
-  decision by deleting the provisions above and replace them with the notice
-  and other provisions required by the GPL or the LGPL. If you do not delete
-  the provisions above, a recipient may use your version of this file under
-  the terms of any one of the MPL, the GPL or the LGPL.
- 
-*/
-
-namespace OpenHardwareMonitor.Hardware.HDD {
-  /// <summary>
-  /// Localization class for SMART attribute names.
-  /// </summary>
-  internal static class SmartAttributeNames {
-
-    public static string AirflowTemperature {
-      get { return "Airflow Temperature"; }
-    }
-
-    public static string Temperature {
-      get { return "Temperature"; }
-    }
-
-    public static string RetiredBlockCount {
-      get { return "Retired Block Count"; }
-    }
-
-    public static string ProgramFailCount {
-      get { return "Program Fail Count"; }
-    }
-
-    public static string EraseFailCount {
-      get { return "Erase Fail Count"; }
-    }
-
-    public static string UnexpectedPowerLossCount {
-      get { return "Unexpected Power Loss Count"; }
-    }
-
-    public static string WearRangeDelta {
-      get { return "Wear Range Delta"; }
-    }
-
-    public static string AlternativeProgramFailCount {
-      get { return "Alternative Program Fail Count"; }
-    }
-
-    public static string AlternativeEraseFailCount {
-      get { return "Alternative Erase Fail Count"; }
-    }
-
-    public static string UnrecoverableEcc {
-      get { return "Unrecoverable ECC"; }
-    }
-
-    public static string ReallocationEventCount {
-      get { return "Reallocation Event Count"; }
-    }
-
-    public static string RemainingLife {
-      get { return "Remaining Life"; }
-    }
-
-    public static string AvailableReservedSpace {
-      get { return "Available Reserved Space"; }
-    }
-
-    public static string CalibrationRetryCount {
-      get { return "Calibration Retry Count"; }
-    }
-
-    public static string CommandTimeout {
-      get { return "Command Timeout"; }
-    }
-
-    public static string CurrentPendingSectorCount {
-      get { return "Current Pending Sector Count"; }
-    }
-
-    public static string DataAddressMarkErrors {
-      get { return "Data Address Mark errors"; }
-    }
-
-    public static string DiskShift {
-      get { return "Disk Shift"; }
-    }
-
-    public static string DriveTemperature {
-      get { return "Drive Temperature"; }
-    }
-
-    public static string EmergencyRetractCycleCount {
-      get { return "Emergency Retract Cycle Count"; }
-    }
-
-    public static string EndToEndError {
-      get { return "End-to-End error"; }
-    }
-
-    public static string EnduranceRemaining {
-      get { return "Endurance Remaining"; }
-    }
-
-    public static string FlyingHeight {
-      get { return "Flying Height"; }
-    }
-
-    public static string FreeFallProtection {
-      get { return "Free Fall Protection"; }
-    }
-
-    public static string GmrHeadAmplitude {
-      get { return "GMR Head Amplitude"; }
-    }
-
-    public static string GSenseErrorRate {
-      get { return "G-sense Error Rate"; }
-    }
-
-    public static string HardwareEccRecovered {
-      get { return "Hardware ECC Recovered"; }
-    }
-
-    public static string HeadFlyingHours {
-      get { return "Head Flying Hours"; }
-    }
-
-    public static string HeadStability {
-      get { return "Head Stability"; }
-    }
-
-    public static string HighFlyWrites {
-      get { return "High Fly Writes"; }
-    }
-
-    public static string InducedOpVibrationDetection {
-      get { return "Induced Op-Vibration Detection"; }
-    }
-
-    public static string LoadedHours {
-      get { return "Loaded Hours"; }
-    }
-
-    public static string LoadFriction {
-      get { return "Load Friction"; }
-    }
-
-    public static string LoadInTime {
-      get { return "Load 'In'-time"; }
-    }
-
-    public static string LoadUnloadCycleCount {
-      get { return "Load/Unload Cycle Count"; }
-    }
-
-    public static string LoadUnloadCycleCountFujitsu {
-      get { return "Load/Unload Cycle Count (Fujitus)"; }
-    }
-
-    public static string LoadUnloadRetryCount {
-      get { return "Load/Unload Retry Count"; }
-    }
-
-    public static string MediaWearoutIndicator {
-      get { return "Media Wearout Indicator"; }
-    }
-
-    public static string MultiZoneErrorRate {
-      get { return "Multi-Zone Error Rate"; }
-    }
-
-    public static string OfflineSeekPerformance {
-      get { return "Offline Seek Performance"; }
-    }
-
-    public static string PowerCycleCount {
-      get { return "Power Cycle Count"; }
-    }
-
-    public static string PowerOffRetractCycle {
-      get { return "Power-Off Retract Cycle"; }
-    }
-
-    public static string PowerOnHours {
-      get { return "Power-On Hours (POH)"; }
-    }
-
-    public static string ReadChannelMargin {
-      get { return "Read Channel Margin"; }
-    }
-
-    public static string ReadErrorRate {
-      get { return "Read Error Rate"; }
-    }
-
-    public static string ReadErrorRetryRate {
-      get { return "Read Error Retry Rate"; }
-    }
-
-    public static string ReallocatedSectorsCount {
-      get { return "Reallocated Sectors Count"; }
-    }
-
-    public static string ReportedUncorrectableErrors {
-      get { return "Reported Uncorrectable Errors"; }
-    }
-
-    public static string RunOutCancel {
-      get { return "Run Out Cancel"; }
-    }
-
-    public static string SataDownshiftErrorCount {
-      get { return "SATA Downshift Error Count"; }
-    }
-
-    public static string SeekErrorRate {
-      get { return "Seek Error Rate"; }
-    }
-
-    public static string SeekTimePerformance {
-      get { return "Seek Time Performance"; }
-    }
-
-    public static string ShockDuringWrite {
-      get { return "Shock During Write"; }
-    }
-
-    public static string SoftEccCorrection {
-      get { return "Soft ECC Correction"; }
-    }
-
-    public static string SoftReadErrorRate {
-      get { return "Soft Read Error Rate"; }
-    }
-
-    public static string SpinBuzz {
-      get { return "Spin Buzz"; }
-    }
-
-    public static string SpinHighCurrent {
-      get { return "Spin High Current"; }
-    }
-
-    public static string SpinRetryCount {
-      get { return "Spin Retry Count"; }
-    }
-
-    public static string SpinUpTime {
-      get { return "Spin-Up Time"; }
-    }
-
-    public static string StartStopCount {
-      get { return "Start/Stop Count"; }
-    }
-
-    public static string TaCounterDetected {
-      get { return "TA Counter Detected"; }
-    }
-
-    public static string TemperatureDifferenceFrom100 {
-      get { return "Temperature Difference from 100"; }
-    }
-
-    public static string ThermalAsperityRate {
-      get { return "Thermal Asperity Rate (TAR)"; }
-    }
-
-    public static string ThroughputPerformance {
-      get { return "Throughput Performance"; }
-    }
-
-    public static string TorqueAmplificationCount {
-      get { return "Torque Amplification Count"; }
-    }
-
-    public static string TotalLbasRead {
-      get { return "Total LBAs Read"; }
-    }
-
-    public static string TotalLbasWritten {
-      get { return "Total LBAs Written"; }
-    }
-
-    public static string TransferErrorRate {
-      get { return "Transfer Error Rate"; }
-    }
-
-    public static string UltraDmaCrcErrorCount {
-      get { return "UltraDMA CRC Error Count"; }
-    }
-
-    public static string UncorrectableSectorCount {
-      get { return "Uncorrectable Sector Count"; }
-    }
-
-    public static string Unknown {
-      get { return "Unknown"; }
-    }
-
-    public static string VibrationDuringWrite {
-      get { return "Vibration During Write"; }
-    }
-
-    public static string WriteErrorRate {
-      get { return "Write Error Rate"; }
-    }
-
-    public static string RecalibrationRetries {
-      get { return "Recalibration Retries"; }
-    }
-
-    public static string LoadCycleCount {
-      get { return "Load Cycle Count"; }
-    }
-
-    public static string AlternativeGSenseErrorRate {
-      get { return "Alternative G-Sense Error Rate"; }
-    }
-
-    public static string InitialBadBlockCount {
-      get { return "Initial Bad Block Count"; }
-    }
-
-    public static string ProgramFailure {
-      get { return "Program Failure"; }
-    }
-
-    public static string EraseFailure {
-      get { return "Erase Failure"; }
-    }
-
-    public static string ReadFailure {
-      get { return "Read Failure"; }
-    }
-
-    public static string SectorsRead {
-      get { return "Sectors Read"; }
-    }
-
-    public static string SectorsWritten {
-      get { return "Sectors Written"; }
-    }
-
-    public static string ReadCommands {
-      get { return "Read Commands"; }
-    }
-
-    public static string WriteCommands {
-      get { return "Write Commands"; }
-    }
-
-    public static string BitErrors {
-      get { return "Bit Errors"; }
-    }
-
-    public static string CorrectedErrors {
-      get { return "Corrected Errors"; }
-    }
-
-    public static string BadBlockFullFlag {
-      get { return "Bad Block Full Flag"; }
-    }
-
-    public static string MaxCellCycles {
-      get { return "Max Cell Cycles"; }
-    }
-
-    public static string MinErase {
-      get { return "Min Erase"; }
-    }
-
-    public static string MaxErase {
-      get { return "Max Erase"; }
-    }
-
-    public static string AverageEraseCount {
-      get { return "Average Erase Count"; }
-    }
-
-    public static string UnknownUnique {
-      get { return "Unknown Unique"; }
-    }
-
-    public static string SataErrorCountCrc {
-      get { return "SATA Error Count CRC"; }
-    }
-
-    public static string SataErrorCountHandshake {
-      get { return "SATA Error Count Handshake"; }
-    }
-
-    public static string UnsafeShutdownCount {
-      get { return "Unsafe Shutdown Count"; }
-    }
-
-    public static string HostWrites {
-      get { return "Host Writes"; }
-    }
-
-    public static string UsedReservedBlockCountChip {
-      get { return "Used Reserved Block Count Chip"; }
-    }
-
-    public static string UsedReservedBlockCountTotal {
-      get { return "Used Reserved Block Count Total"; }
-    }
-
-    public static string RuntimeBadBlockTotal {
-      get { return "Runtime Bad Block Total"; }
-    }
-
-    public static string HostReads {
-      get { return "Host Reads"; }
-    }
-
-    public static string MediaWearOutIndicator {
-      get { return "Media Wear Out Indicator"; }
-    }    
-  }
-}
\ No newline at end of file
diff -r e837e1e4b282 -r f837f9f0973e Hardware/HDD/SmartNames.cs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Hardware/HDD/SmartNames.cs	Mon Jan 02 18:44:19 2012 +0000
@@ -0,0 +1,497 @@
+/*
+  
+  Version: MPL 1.1/GPL 2.0/LGPL 2.1
+
+  The contents of this file are subject to the Mozilla Public License Version
+  1.1 (the "License"); you may not use this file except in compliance with
+  the License. You may obtain a copy of the License at
+ 
+  http://www.mozilla.org/MPL/
+
+  Software distributed under the License is distributed on an "AS IS" basis,
+  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+  for the specific language governing rights and limitations under the License.
+
+  The Original Code is the Open Hardware Monitor code.
+
+  The Initial Developer of the Original Code is 
+  Roland Reinl <roland-reinl@gmx.de>.
+  Portions created by the Initial Developer are Copyright (C) 2011
+  the Initial Developer. All Rights Reserved.
+
+  Contributor(s):
+    Michael Möller <m.moeller@gmx.ch>
+ 
+  Alternatively, the contents of this file may be used under the terms of
+  either the GNU General Public License Version 2 or later (the "GPL"), or
+  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+  in which case the provisions of the GPL or the LGPL are applicable instead
+  of those above. If you wish to allow use of your version of this file only
+  under the terms of either the GPL or the LGPL, and not to allow others to
+  use your version of this file under the terms of the MPL, indicate your
+  decision by deleting the provisions above and replace them with the notice
+  and other provisions required by the GPL or the LGPL. If you do not delete
+  the provisions above, a recipient may use your version of this file under
+  the terms of any one of the MPL, the GPL or the LGPL.
+ 
+*/
+
+namespace OpenHardwareMonitor.Hardware.HDD {
+  /// <summary>
+  /// Localization class for SMART attribute names.
+  /// </summary>
+  internal static class SmartNames {
+
+    public static string AirflowTemperature {
+      get { return "Airflow Temperature"; }
+    }
+
+    public static string Temperature {
+      get { return "Temperature"; }
+    }
+
+    public static string RetiredBlockCount {
+      get { return "Retired Block Count"; }
+    }
+
+    public static string ProgramFailCount {
+      get { return "Program Fail Count"; }
+    }
+
+    public static string EraseFailCount {
+      get { return "Erase Fail Count"; }
+    }
+
+    public static string UnexpectedPowerLossCount {
+      get { return "Unexpected Power Loss Count"; }
+    }
+
+    public static string WearRangeDelta {
+      get { return "Wear Range Delta"; }
+    }
+
+    public static string AlternativeProgramFailCount {
+      get { return "Alternative Program Fail Count"; }
+    }
+
+    public static string AlternativeEraseFailCount {
+      get { return "Alternative Erase Fail Count"; }
+    }
+
+    public static string UnrecoverableEcc {
+      get { return "Unrecoverable ECC"; }
+    }
+
+    public static string ReallocationEventCount {
+      get { return "Reallocation Event Count"; }
+    }
+
+    public static string RemainingLife {
+      get { return "Remaining Life"; }
+    }
+
+    public static string AvailableReservedSpace {
+      get { return "Available Reserved Space"; }
+    }
+
+    public static string CalibrationRetryCount {
+      get { return "Calibration Retry Count"; }
+    }
+
+    public static string CommandTimeout {
+      get { return "Command Timeout"; }
+    }
+
+    public static string CurrentPendingSectorCount {
+      get { return "Current Pending Sector Count"; }
+    }
+
+    public static string DataAddressMarkErrors {
+      get { return "Data Address Mark errors"; }
+    }
+
+    public static string DiskShift {
+      get { return "Disk Shift"; }
+    }
+
+    public static string DriveTemperature {
+      get { return "Drive Temperature"; }
+    }
+
+    public static string EmergencyRetractCycleCount {
+      get { return "Emergency Retract Cycle Count"; }
+    }
+
+    public static string EndToEndError {
+      get { return "End-to-End error"; }
+    }
+
+    public static string EnduranceRemaining {
+      get { return "Endurance Remaining"; }
+    }
+
+    public static string FlyingHeight {
+      get { return "Flying Height"; }
+    }
+
+    public static string FreeFallProtection {
+      get { return "Free Fall Protection"; }
+    }
+
+    public static string GmrHeadAmplitude {
+      get { return "GMR Head Amplitude"; }
+    }
+
+    public static string GSenseErrorRate {
+      get { return "G-sense Error Rate"; }
+    }
+
+    public static string HardwareEccRecovered {
+      get { return "Hardware ECC Recovered"; }
+    }
+
+    public static string HeadFlyingHours {
+      get { return "Head Flying Hours"; }
+    }
+
+    public static string HeadStability {
+      get { return "Head Stability"; }
+    }
+
+    public static string HighFlyWrites {
+      get { return "High Fly Writes"; }
+    }
+
+    public static string InducedOpVibrationDetection {
+      get { return "Induced Op-Vibration Detection"; }
+    }
+
+    public static string LoadedHours {
+      get { return "Loaded Hours"; }
+    }
+
+    public static string LoadFriction {
+      get { return "Load Friction"; }
+    }
+
+    public static string LoadInTime {
+      get { return "Load 'In'-time"; }
+    }
+
+    public static string LoadUnloadCycleCount {
+      get { return "Load/Unload Cycle Count"; }
+    }
+
+    public static string LoadUnloadCycleCountFujitsu {
+      get { return "Load/Unload Cycle Count (Fujitus)"; }
+    }
+
+    public static string LoadUnloadRetryCount {
+      get { return "Load/Unload Retry Count"; }
+    }
+
+    public static string MediaWearoutIndicator {
+      get { return "Media Wearout Indicator"; }
+    }
+
+    public static string MultiZoneErrorRate {
+      get { return "Multi-Zone Error Rate"; }
+    }
+
+    public static string OfflineSeekPerformance {
+      get { return "Offline Seek Performance"; }
+    }
+
+    public static string PowerCycleCount {
+      get { return "Power Cycle Count"; }
+    }
+
+    public static string PowerOffRetractCycle {
+      get { return "Power-Off Retract Cycle"; }
+    }
+
+    public static string PowerOnHours {
+      get { return "Power-On Hours (POH)"; }
+    }
+
+    public static string ReadChannelMargin {
+      get { return "Read Channel Margin"; }
+    }
+
+    public static string ReadErrorRate {
+      get { return "Read Error Rate"; }
+    }
+
+    public static string ReadErrorRetryRate {
+      get { return "Read Error Retry Rate"; }
+    }
+
+    public static string ReallocatedSectorsCount {
+      get { return "Reallocated Sectors Count"; }
+    }
+
+    public static string ReportedUncorrectableErrors {
+      get { return "Reported Uncorrectable Errors"; }
+    }
+
+    public static string RunOutCancel {
+      get { return "Run Out Cancel"; }
+    }
+
+    public static string SataDownshiftErrorCount {
+      get { return "SATA Downshift Error Count"; }
+    }
+
+    public static string SeekErrorRate {
+      get { return "Seek Error Rate"; }
+    }
+
+    public static string SeekTimePerformance {
+      get { return "Seek Time Performance"; }
+    }
+
+    public static string ShockDuringWrite {
+      get { return "Shock During Write"; }
+    }
+
+    public static string SoftEccCorrection {
+      get { return "Soft ECC Correction"; }
+    }
+
+    public static string SoftReadErrorRate {
+      get { return "Soft Read Error Rate"; }
+    }
+
+    public static string SpinBuzz {
+      get { return "Spin Buzz"; }
+    }
+
+    public static string SpinHighCurrent {
+      get { return "Spin High Current"; }
+    }
+
+    public static string SpinRetryCount {
+      get { return "Spin Retry Count"; }
+    }
+
+    public static string SpinUpTime {
+      get { return "Spin-Up Time"; }
+    }
+
+    public static string StartStopCount {
+      get { return "Start/Stop Count"; }
+    }
+
+    public static string TaCounterDetected {
+      get { return "TA Counter Detected"; }
+    }
+
+    public static string TemperatureDifferenceFrom100 {
+      get { return "Temperature Difference from 100"; }
+    }
+
+    public static string ThermalAsperityRate {
+      get { return "Thermal Asperity Rate (TAR)"; }
+    }
+
+    public static string ThroughputPerformance {
+      get { return "Throughput Performance"; }
+    }
+
+    public static string TorqueAmplificationCount {
+      get { return "Torque Amplification Count"; }
+    }
+
+    public static string TotalLbasRead {
+      get { return "Total LBAs Read"; }
+    }
+
+    public static string TotalLbasWritten {
+      get { return "Total LBAs Written"; }
+    }
+
+    public static string TransferErrorRate {
+      get { return "Transfer Error Rate"; }
+    }
+
+    public static string UltraDmaCrcErrorCount {
+      get { return "UltraDMA CRC Error Count"; }
+    }
+
+    public static string UncorrectableSectorCount {
+      get { return "Uncorrectable Sector Count"; }
+    }
+
+    public static string Unknown {
+      get { return "Unknown"; }
+    }
+
+    public static string VibrationDuringWrite {
+      get { return "Vibration During Write"; }
+    }
+
+    public static string WriteErrorRate {
+      get { return "Write Error Rate"; }
+    }
+
+    public static string RecalibrationRetries {
+      get { return "Recalibration Retries"; }
+    }
+
+    public static string LoadCycleCount {
+      get { return "Load Cycle Count"; }
+    }
+
+    public static string AlternativeGSenseErrorRate {
+      get { return "Alternative G-Sense Error Rate"; }
+    }
+
+    public static string InitialBadBlockCount {
+      get { return "Initial Bad Block Count"; }
+    }
+
+    public static string ProgramFailure {
+      get { return "Program Failure"; }
+    }
+
+    public static string EraseFailure {
+      get { return "Erase Failure"; }
+    }
+
+    public static string ReadFailure {
+      get { return "Read Failure"; }
+    }
+
+    public static string SectorsRead {
+      get { return "Sectors Read"; }
+    }
+
+    public static string SectorsWritten {
+      get { return "Sectors Written"; }
+    }
+
+    public static string ReadCommands {
+      get { return "Read Commands"; }
+    }
+
+    public static string WriteCommands {
+      get { return "Write Commands"; }
+    }
+
+    public static string BitErrors {
+      get { return "Bit Errors"; }
+    }
+
+    public static string CorrectedErrors {
+      get { return "Corrected Errors"; }
+    }
+
+    public static string BadBlockFullFlag {
+      get { return "Bad Block Full Flag"; }
+    }
+
+    public static string MaxCellCycles {
+      get { return "Max Cell Cycles"; }
+    }
+
+    public static string MinErase {
+      get { return "Min Erase"; }
+    }
+
+    public static string MaxErase {
+      get { return "Max Erase"; }
+    }
+
+    public static string AverageEraseCount {
+      get { return "Average Erase Count"; }
+    }
+
+    public static string UnknownUnique {
+      get { return "Unknown Unique"; }
+    }
+
+    public static string SataErrorCountCrc {
+      get { return "SATA Error Count CRC"; }
+    }
+
+    public static string SataErrorCountHandshake {
+      get { return "SATA Error Count Handshake"; }
+    }
+
+    public static string UnsafeShutdownCount {
+      get { return "Unsafe Shutdown Count"; }
+    }
+
+    public static string HostWrites {
+      get { return "Host Writes"; }
+    }
+
+    public static string HostReads {
+      get { return "Host Reads"; }
+    }
+
+    public static string MediaWearOutIndicator {
+      get { return "Media Wear Out Indicator"; }
+    }    
+
+    public static string ProgramFailCountChip {
+      get { return "Program Fail Count (Chip)"; }
+    }
+
+    public static string EraseFailCountChip {
+      get { return "Erase Fail Count (Chip)"; }
+    }
+
+    public static string WearLevelingCount {
+      get { return "Wear Leveling Count"; }
+    }
+
+    public static string UsedReservedBlockCountChip {
+      get { return "Used Reserved Block Count (Chip)"; }
+    }
+
+    public static string UsedReservedBlockCountTotal {
+      get { return "Used Reserved Block Count (Total)"; }
+    }
+
+    public static string ProgramFailCountTotal {
+      get { return "Program Fail Count (Total)"; }
+    }
+
+    public static string EraseFailCountTotal {
+      get { return "Erase Fail Count (Total)"; }
+    }
+
+    public static string RuntimeBadBlockTotal {
+      get { return "Runtime Bad Block Total"; }
+    }
+
+    public static string UncorrectableErrorCount {
+      get { return "Uncorrectable Error Count"; }
+    }
+
+    public static string TemperatureExceedCount {
+      get { return "Temperature Exceed Count"; }
+    }
+
+    public static string ECCRate {
+      get { return "ECC Rate"; }
+    }
+
+    public static string OffLineUncorrectableErrorCount {
+      get { return "Off-Line Uncorrectable Error Count"; }
+    }
+
+    public static string CRCErrorCount {
+      get { return "CRC Error Count"; }
+    }
+
+    public static string SupercapStatus {
+      get { return "Supercap Status"; }
+    }
+
+    public static string ExceptionModeStatus {
+      get { return "Exception Mode Status"; }
+    }
+  }
+}
\ No newline at end of file
diff -r e837e1e4b282 -r f837f9f0973e OpenHardwareMonitorLib.csproj
--- a/OpenHardwareMonitorLib.csproj	Sun Jan 01 17:12:34 2012 +0000
+++ b/OpenHardwareMonitorLib.csproj	Mon Jan 02 18:44:19 2012 +0000
@@ -69,12 +69,13 @@
     <Compile Include="Hardware\HDD\HDDGeneric.cs" />
     <Compile Include="Hardware\HDD\ISmart.cs" />
     <Compile Include="Hardware\HDD\SmartAttribute.cs" />
-    <Compile Include="Hardware\HDD\SmartAttributeNames.cs" />
+    <Compile Include="Hardware\HDD\SmartNames.cs" />
     <Compile Include="Hardware\HDD\RequireSmartAttribute.cs" />
     <Compile Include="Hardware\HDD\NamePrefixAttribute.cs" />
     <Compile Include="Hardware\HDD\SSDIndilinx.cs" />
     <Compile Include="Hardware\HDD\SSDIntel.cs" />
     <Compile Include="Hardware\HDD\SSDPlextor.cs" />
+    <Compile Include="Hardware\HDD\SSDSamsung.cs" />
     <Compile Include="Hardware\HDD\SSDSandforce.cs" />
     <Compile Include="Hardware\IControl.cs" />
     <Compile Include="Hardware\IOControlCode.cs" />