Advertisement
Guest User

Calculate Hardware ID

a guest
Jan 3rd, 2011
4,375
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.48 KB | None | 0 0
  1. namespace ZetaUploader.WindowsClient.Code
  2. {
  3.     using System;
  4.     using System.Runtime.InteropServices;
  5.     using System.Security.Cryptography;
  6.     using System.Text;
  7.  
  8.     internal class HardwareHelper
  9.     {
  10.         public string GetHardwareID()
  11.         {
  12.             // ABCDEF GH
  13.             var vsn = getVolumeSerial(Environment.SystemDirectory.Substring(0, 1));
  14.             var result = getHash(vsn + getDiskSize().ToString()).Substring(2, 6);
  15.             result += getHash(result).Substring(5, 2);
  16.             result = separateText(result, 4, @"-");
  17.  
  18.             return result;
  19.         }
  20.  
  21.         private string getHash(string s)
  22.         {
  23.             return encodeText(getHashValue(s));
  24.         }
  25.  
  26.         private string encodeText(string s)
  27.         {
  28.             string buf = s.Replace(Convert.ToChar(10).ToString(),
  29.                                     string.Empty);
  30.             string bin = string.Empty;
  31.             for (int i = 0; i < buf.Length; i++)
  32.             {
  33.                 bin += intToBin(Convert.ToByte(buf[i]),
  34.                                  7);
  35.             }
  36.  
  37.             var result = string.Empty;
  38.             while (bin.Length > 0)
  39.             {
  40.                 string w5 = safeSubstring(bin,
  41.                                            0,
  42.                                            5);
  43.                 w5 = w5.PadRight(5,
  44.                                   '0');
  45.  
  46.                 result += bin5ToB36(w5);
  47.                 bin = safeSubstring(bin,
  48.                                      5,
  49.                                      0);
  50.             }
  51.  
  52.             return result;
  53.         }
  54.  
  55.         public HardwareHelper()
  56.         {
  57.             _alphabet = new char[36];
  58.  
  59.             for (int i = 0; i < 26; i++)
  60.                 _alphabet[i] = Convert.ToChar(i + Convert.ToInt16('A'));
  61.             for (int i = 0; i < 10; i++)
  62.                 _alphabet[i + 26] = Convert.ToChar(i + Convert.ToInt16('0'));
  63.         }
  64.  
  65.         private char bin5ToB36(string w5)
  66.         {
  67.             int d = Convert.ToInt16(w5, 2);
  68.             return _alphabet[d];
  69.         }
  70.  
  71.         private readonly char[] _alphabet;
  72.  
  73.         private static string intToBin(
  74.             int number,
  75.             int numBits)
  76.         {
  77.             var b = new char[numBits];
  78.             var pos = numBits - 1;
  79.  
  80.             var i = 0;
  81.             while (i < numBits)
  82.             {
  83.                 if ((number & (1 << i)) != 0)
  84.                 {
  85.                     b[pos] = '1';
  86.                 }
  87.                 else
  88.                 {
  89.                     b[pos] = '0';
  90.                 }
  91.                 pos--;
  92.                 i++;
  93.             }
  94.  
  95.             return new string(b);
  96.         }
  97.  
  98.         private static string safeSubstring(
  99.             string s,
  100.             int start,
  101.             int length)
  102.         {
  103.             if (length == 0)
  104.                 length = s.Length - start;
  105.             if (length < 0)
  106.                 length = 0;
  107.  
  108.             if (start > s.Length)
  109.                 return string.Empty;
  110.             if (start < 0)
  111.                 start = 0;
  112.  
  113.             if (start + length >
  114.                  s.Length)
  115.                 return s.Substring(start);
  116.  
  117.             return s.Substring(start, length);
  118.         }
  119.  
  120.         private static string separateText(
  121.             string s,
  122.             int numChars,
  123.             string separator)
  124.         {
  125.             var result = string.Empty;
  126.             var count = 0;
  127.             for (var i = 0; i < s.Length; i++)
  128.             {
  129.                 if ((count != 0) && (count % numChars == 0))
  130.                 {
  131.                     result += separator;
  132.                 }
  133.  
  134.                 result += s[i];
  135.                 count++;
  136.             }
  137.  
  138.             return result;
  139.         }
  140.  
  141.         private static string getHashValue(string s)
  142.         {
  143.             const string def = @"5CACAD0D1C88626D74B30C1ADC2951E8";
  144.  
  145.             if (string.IsNullOrEmpty(s))
  146.             {
  147.                 return def;
  148.             }
  149.             else
  150.             {
  151.                 MD5 md5 = new MD5CryptoServiceProvider();
  152.                 var textToHash = Encoding.Default.GetBytes(s);
  153.                 var h = md5.ComputeHash(textToHash);
  154.  
  155.                 var result = BitConverter.ToString(h);
  156.                 result = result.Replace(@"-", string.Empty);
  157.                 result = result.ToUpperInvariant();
  158.  
  159.                 return result;
  160.             }
  161.         }
  162.  
  163.         private static int getVolumeSerial(string drive)
  164.         {
  165.             var voln = new StringBuilder(300);
  166.             int vsn;
  167.             uint mcl, fsf;
  168.             var fsnb = new StringBuilder(300);
  169.             GetVolumeInformation(string.Format(@"{0}:\", drive),
  170.                                   voln,
  171.                                   voln.Capacity,
  172.                                   out vsn,
  173.                                   out mcl,
  174.                                   out fsf,
  175.                                   fsnb,
  176.                                   fsnb.Capacity);
  177.  
  178.             return vsn;
  179.         }
  180.  
  181.         private static ulong getDiskSize()
  182.         {
  183.             ulong freeBytesAvail;
  184.             ulong totalNumOfBytes;
  185.             ulong totalNumOfFreeBytes;
  186.  
  187.             GetDiskFreeSpaceEx(
  188.                 string.Format(
  189.                 @"{0}:\",
  190.                 Environment.SystemDirectory.Substring(0, 1)),
  191.                                 out freeBytesAvail,
  192.                                 out totalNumOfBytes,
  193.                                 out totalNumOfFreeBytes);
  194.  
  195.             return totalNumOfBytes;
  196.         }
  197.  
  198.         [DllImport(@"kernel32.dll")]
  199.         private static extern bool GetDiskFreeSpaceEx(
  200.             string lpDirectoryName,
  201.             out ulong lpFreeBytesAvailable,
  202.             out ulong lpTotalNumberOfBytes,
  203.             out ulong lpTotalNumberOfFreeBytes);
  204.  
  205.         [DllImport(@"Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  206.         private static extern bool GetVolumeInformation(
  207.             string rootPathName,
  208.             StringBuilder volumeNameBuffer,
  209.             int volumeNameSize,
  210.             out int volumeSerialNumber,
  211.             out uint maximumComponentLength,
  212.             out uint fileSystemFlags,
  213.             StringBuilder fileSystemNameBuffer,
  214.             int nFileSystemNameSize);
  215.  
  216.     }
  217. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement