C#读取硬盘序列号

来源:互联网 发布:防伪软件 编辑:程序博客网 时间:2024/05/01 22:06

使用上很简单:

HardDiskInfo hdd = AtapiDevice.GetHddInfo(0); // 第一个硬盘
Console.WriteLine("Module Number: {0}", hdd.ModuleNumber);
Console.WriteLine("Serial Number: {0}", hdd.SerialNumber);
Console.WriteLine("Firmware: {0}", hdd.Firmware);
Console.WriteLine("Capacity: {0} M", hdd.Capacity);
 

下面是全部代码:

using System;

using System.Runtime.InteropServices;

using System.Text;

namespace Sunmast.Hardware

{

         [Serializable]

         public struct HardDiskInfo

         {

                   /// <summary>

                   /// 型号

                   /// </summary>

                   public string ModuleNumber;

                   /// <summary>

                   /// 固件版本

                   /// </summary>

                   public string Firmware;

                   /// <summary>

                   /// 序列号

                   /// </summary>

                   public string SerialNumber;

                   /// <summary>

                   /// 容量,以M为单位

                   /// </summary>

                   public uint Capacity;

         }

 

         #region Internal Structs

 

         [StructLayout(LayoutKind.Sequential, Pack=1)]

         internal struct GetVersionOutParams

         {

                   public byte bVersion;

                   public byte bRevision;

                   public byte bReserved;

                   public byte bIDEDeviceMap;

                   public uint fCapabilities;

                   [MarshalAs(UnmanagedType.ByValArray, SizeConst=4)]

                   public uint[] dwReserved; // For future use.

         }

 

         [StructLayout(LayoutKind.Sequential, Pack=1)]

         internal struct IdeRegs

         {

                   public byte bFeaturesReg;

                   public byte bSectorCountReg;

                   public byte bSectorNumberReg;

                   public byte bCylLowReg;

                   public byte bCylHighReg;

                   public byte bDriveHeadReg;

                   public byte bCommandReg;

                   public byte bReserved;

         }

 

         [StructLayout(LayoutKind.Sequential, Pack=1)]

         internal struct SendCmdInParams

         {

                   public uint cBufferSize;

                   public IdeRegs irDriveRegs;

                   public byte bDriveNumber;

                   [MarshalAs(UnmanagedType.ByValArray, SizeConst=3)]

                   public byte[] bReserved;

                   [MarshalAs(UnmanagedType.ByValArray, SizeConst=4)]

                   public uint[] dwReserved;

                   public byte bBuffer;

         }

 

         [StructLayout(LayoutKind.Sequential, Pack=1)]

         internal struct DriverStatus

         {

                   public byte bDriverError;

                   public byte bIDEStatus;

                   [MarshalAs(UnmanagedType.ByValArray, SizeConst=2)]

                   public byte[] bReserved;

                   [MarshalAs(UnmanagedType.ByValArray, SizeConst=2)]

                   public uint[] dwReserved;

         }

 

         [StructLayout(LayoutKind.Sequential, Pack=1)]

         internal struct SendCmdOutParams

         {

                   public uint cBufferSize;

                   public DriverStatus DriverStatus;

                   public IdSector bBuffer;

         }

 

         [StructLayout(LayoutKind.Sequential, Pack=1, Size=512)]

         internal struct IdSector

         {

                   public ushort wGenConfig;

                   public ushort wNumCyls;

                   public ushort wReserved;

                   public ushort wNumHeads;

                   public ushort wBytesPerTrack;

                   public ushort wBytesPerSector;

                   public ushort wSectorsPerTrack;

                   [MarshalAs(UnmanagedType.ByValArray, SizeConst=3)]

                   public ushort[] wVendorUnique;

                   [MarshalAs(UnmanagedType.ByValArray, SizeConst=20)]

                   public byte[] sSerialNumber;

                   public ushort wBufferType;

                   public ushort wBufferSize;

                   public ushort wECCSize;

                   [MarshalAs(UnmanagedType.ByValArray, SizeConst=8)]

                   public byte[] sFirmwareRev;

                   [MarshalAs(UnmanagedType.ByValArray, SizeConst=40)]

                   public byte[] sModelNumber;

                   public ushort wMoreVendorUnique;

                   public ushort wDoubleWordIO;

                   public ushort wCapabilities;

                   public ushort wReserved1;

                   public ushort wPIOTiming;

                   public ushort wDMATiming;

                   public ushort wBS;

                   public ushort wNumCurrentCyls;

                   public ushort wNumCurrentHeads;

                   public ushort wNumCurrentSectorsPerTrack;

                   public uint ulCurrentSectorCapacity;

                   public ushort wMultSectorStuff;

                   public uint ulTotalAddressableSectors;

                   public ushort wSingleWordDMA;

                   public ushort wMultiWordDMA;

                   [MarshalAs(UnmanagedType.ByValArray, SizeConst=128)]

                   public byte[] bReserved;

         }

 

         #endregion

 

         /// <summary>

         /// ATAPI驱动器相关

         /// </summary>

         public class AtapiDevice

         {

 

                   #region DllImport

 

                   [DllImport("kernel32.dll", SetLastError=true)]

                   static extern int CloseHandle(IntPtr hObject);

 

                   [DllImport("kernel32.dll", SetLastError=true)]

                   static extern IntPtr CreateFile(

                            string lpFileName,

                            uint dwDesiredAccess,

                            uint dwShareMode,

                            IntPtr lpSecurityAttributes,

                            uint dwCreationDisposition,

                            uint dwFlagsAndAttributes,

                            IntPtr hTemplateFile);

 

                   [DllImport("kernel32.dll")]

                   static extern int DeviceIoControl(

                            IntPtr hDevice,

                            uint dwIoControlCode,

                            IntPtr lpInBuffer,

                            uint nInBufferSize,

                            ref GetVersionOutParams lpOutBuffer,

                            uint nOutBufferSize,

                            ref uint lpBytesReturned,

                            [Out] IntPtr lpOverlapped);

 

                   [DllImport("kernel32.dll")]

                   static extern int DeviceIoControl(

                            IntPtr hDevice,

                            uint dwIoControlCode,

                            ref SendCmdInParams lpInBuffer,

                            uint nInBufferSize,

                            ref SendCmdOutParams lpOutBuffer,

                            uint nOutBufferSize,

                            ref uint lpBytesReturned,

                            [Out] IntPtr lpOverlapped);

 

                   const uint DFP_GET_VERSION = 0x00074080;

                   const uint DFP_SEND_DRIVE_COMMAND = 0x0007c084;

                   const uint DFP_RECEIVE_DRIVE_DATA = 0x0007c088;

 

                   const uint GENERIC_READ = 0x80000000;

                   const uint GENERIC_WRITE = 0x40000000;

                   const uint FILE_SHARE_READ = 0x00000001;

                   const uint FILE_SHARE_WRITE = 0x00000002;

                   const uint CREATE_NEW = 1;

                   const uint OPEN_EXISTING = 3;

 

                   #endregion

 

                   #region GetHddInfo

 

                   /// <summary>

                   /// 获得硬盘信息

                   /// </summary>

                   /// <param name="driveIndex">硬盘序号</param>

                   /// <returns>硬盘信息</returns>

                   /// <remarks>

                   /// 参考lu0的文章:http://lu0s1.3322.org/App/2k1103.html

                   /// by sunmast for everyone

                   /// thanks lu0 for his great works

                   /// Windows 98/ME中,S.M.A.R.T并不缺省安装,请将SMARTVSD.VXD拷贝到%SYSTEM%/IOSUBSYS目录下。

                   /// Windows 2000/2003下,需要Administrators组的权限。

                   /// </remarks>

                   /// <example>

                   /// AtapiDevice.GetHddInfo()

                   /// </example>

                   public static HardDiskInfo GetHddInfo(byte driveIndex)

                   {

                            switch(Environment.OSVersion.Platform)

                            {

                                     case PlatformID.Win32Windows:

                                               return GetHddInfo9x(driveIndex);

                                     case PlatformID.Win32NT:

                                               return GetHddInfoNT(driveIndex);

                                     case PlatformID.Win32S:

                                               throw new NotSupportedException("Win32s is not supported.");

                                     case PlatformID.WinCE:

                                               throw new NotSupportedException("WinCE is not supported.");

                                     default:

                                               throw new NotSupportedException("Unknown Platform.");

                            }

                   }

 

                   #region GetHddInfo9x

 

                   private static HardDiskInfo GetHddInfo9x(byte driveIndex)

                   {

                            GetVersionOutParams vers = new GetVersionOutParams();

                            SendCmdInParams inParam = new SendCmdInParams();

                            SendCmdOutParams outParam = new SendCmdOutParams();

                            uint bytesReturned = 0;

 

                            IntPtr hDevice = CreateFile(

                                     @"//./Smartvsd",

                                     0,

                                     0,

                                     IntPtr.Zero,

                                     CREATE_NEW,

                                     0,

                                     IntPtr.Zero);

                            if (hDevice == IntPtr.Zero)

                            {

                                     throw new Exception("Open smartvsd.vxd failed.");

                            }

                            if (0 == DeviceIoControl(

                                     hDevice,

                                     DFP_GET_VERSION,

                                     IntPtr.Zero,

                                     0,

                                     ref vers,

                                     (uint)Marshal.SizeOf(vers),

                                     ref bytesReturned,

                                     IntPtr.Zero))

                            {

                                     CloseHandle(hDevice);

                                     throw new Exception("DeviceIoControl failed:DFP_GET_VERSION");

                            }

                            // If IDE identify command not supported, fails

                            if (0 == (vers.fCapabilities & 1))

                            {

                                     CloseHandle(hDevice);

                                     throw new Exception("Error: IDE identify command not supported.");

                            }

                            if (0 != (driveIndex & 1))

                            {

                                     inParam.irDriveRegs.bDriveHeadReg = 0xb0;

                            }

                            else

                            {

                                     inParam.irDriveRegs.bDriveHeadReg = 0xa0;

                            }

                            if (0 != (vers.fCapabilities & (16 >> driveIndex)))

                            {

                                     // We don't detect a ATAPI device.

                                     CloseHandle(hDevice);

                                     throw new Exception(string.Format("Drive {0} is a ATAPI device, we don't detect it",driveIndex + 1));

                            }

                            else

                            {

                                     inParam.irDriveRegs.bCommandReg = 0xec;

                            }

                            inParam.bDriveNumber = driveIndex;

                            inParam.irDriveRegs.bSectorCountReg = 1;

                            inParam.irDriveRegs.bSectorNumberReg = 1;

                            inParam.cBufferSize = 512;

                            if (0 == DeviceIoControl(

                                     hDevice,

                                     DFP_RECEIVE_DRIVE_DATA,

                                     ref inParam,

                                     (uint)Marshal.SizeOf(inParam),

                                     ref outParam,

                                     (uint)Marshal.SizeOf(outParam),

                                     ref bytesReturned,

                                     IntPtr.Zero))

                            {

                                     CloseHandle(hDevice);

                                     throw new Exception("DeviceIoControl failed: DFP_RECEIVE_DRIVE_DATA");

                            }

                            CloseHandle(hDevice);

 

                            return GetHardDiskInfo(outParam.bBuffer);

                   }

 

                   #endregion

 

                   #region GetHddInfoNT

 

                   private static HardDiskInfo GetHddInfoNT(byte driveIndex)

                   {

                            GetVersionOutParams vers = new GetVersionOutParams();

                            SendCmdInParams inParam = new SendCmdInParams();

                            SendCmdOutParams outParam = new SendCmdOutParams();

                            uint bytesReturned = 0;

 

                            // We start in NT/Win2000

                            IntPtr hDevice = CreateFile(

                                     string.Format(@"//./PhysicalDrive{0}",driveIndex),

                                     GENERIC_READ | GENERIC_WRITE,

                                     FILE_SHARE_READ | FILE_SHARE_WRITE,

                                     IntPtr.Zero,

                                     OPEN_EXISTING,

                                     0,

                                     IntPtr.Zero);

                            if (hDevice == IntPtr.Zero)

                            {

                                     throw new Exception("CreateFile faild.");

                            }

                            if (0 == DeviceIoControl(

                                     hDevice,

                                     DFP_GET_VERSION,

                                     IntPtr.Zero,

                                     0,

                                     ref vers,

                                     (uint)Marshal.SizeOf(vers),

                                     ref bytesReturned,

                                     IntPtr.Zero))

                            {

                                     CloseHandle(hDevice);

                                     throw new Exception(string.Format("Drive {0} may not exists.",driveIndex + 1));

                            }

                            // If IDE identify command not supported, fails

                            if (0 == (vers.fCapabilities & 1))

                            {

                                     CloseHandle(hDevice);

                                     throw new Exception("Error: IDE identify command not supported.");

                            }

                            // Identify the IDE drives

                            if (0 != (driveIndex & 1))

                            {

                                     inParam.irDriveRegs.bDriveHeadReg = 0xb0;

                            }

                            else

                            {

                                     inParam.irDriveRegs.bDriveHeadReg=0xa0;

                            }

                            if (0 != (vers.fCapabilities & (16 >> driveIndex)))

                            {

                                     // We don't detect a ATAPI device.

                                     CloseHandle(hDevice);

                                     throw new Exception(string.Format("Drive {0} is a ATAPI device, we don't detect it.",driveIndex + 1));

                            }

                            else

                            {

                                     inParam.irDriveRegs.bCommandReg = 0xec;

                            }

                            inParam.bDriveNumber = driveIndex;

                            inParam.irDriveRegs.bSectorCountReg = 1;

                            inParam.irDriveRegs.bSectorNumberReg = 1;

                            inParam.cBufferSize = 512;

 

                            if (0 == DeviceIoControl(

                                     hDevice,

                                     DFP_RECEIVE_DRIVE_DATA,

                                     ref inParam,

                                     (uint)Marshal.SizeOf(inParam),

                                     ref outParam,

                                     (uint)Marshal.SizeOf(outParam),

                                     ref bytesReturned,

                                     IntPtr.Zero))

                            {

                                     CloseHandle(hDevice);

                                     throw new Exception("DeviceIoControl failed: DFP_RECEIVE_DRIVE_DATA");

                            }

                            CloseHandle(hDevice);

 

                            return GetHardDiskInfo(outParam.bBuffer);

                   }

 

                   #endregion

 

                   private static HardDiskInfo GetHardDiskInfo(IdSector phdinfo)

                   {

                            HardDiskInfo hddInfo = new HardDiskInfo();

 

                            ChangeByteOrder(phdinfo.sModelNumber);

                            hddInfo.ModuleNumber = Encoding.ASCII.GetString(phdinfo.sModelNumber).Trim();

 

                            ChangeByteOrder(phdinfo.sFirmwareRev);

                            hddInfo.Firmware = Encoding.ASCII.GetString(phdinfo.sFirmwareRev).Trim();

 

                            ChangeByteOrder(phdinfo.sSerialNumber);

                            hddInfo.SerialNumber = Encoding.ASCII.GetString(phdinfo.sSerialNumber).Trim();

 

                            hddInfo.Capacity = phdinfo.ulTotalAddressableSectors / 2 / 1024;

 

                            return hddInfo;

                   }

 

                   private static void ChangeByteOrder(byte[] charArray)

                   {

                            byte temp;

                            for(int i = 0; i < charArray.Length; i += 2)

                            {

                                     temp = charArray[i];

                                     charArray[i] = charArray[i+1];

                                     charArray[i+1] = temp;

                            }

                   }

 

                   #endregion

         }

}

 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 家长说你教的不好怎么办 小升初分班考试考砸了怎么办 老公不给老婆看病怎么办 孕妈妈涨奶严重怎么办 90岁老头尿不下尿怎么办 妻子要离婚丈夫不离怎么办 弟媳妇天天在家吵架怎么办 弟媳妇不和我说话怎么办 我想和弟媳妇做一次怎么办 老公对弟媳妇有非分之想怎么办 跟弟媳妇有矛盾怎么办 学生考试前不认真怎么办 有人雇凶要杀我怎么办 高考理综数学英语都没考好怎么办 母亲判刑孩子未成年无人监管怎么办 高三了数学30分怎么办 母猪发烧耳朵放血止不住了怎么办? 青春期孩子动手打父母该怎么办 20岁睡觉不老实怎么办 孕妇梦见钱掉了怎么办 小孩晚上睡觉鼻子塞怎么办 宝宝晚上睡觉鼻子塞怎么办 按摩后吹冷气发冷怎么办 碰到特别细心敏感的下属怎么办 睡觉压的肩膀疼怎么办 睡觉感觉被压住动弹不得怎么办 越想睡觉越睡不着怎么办 腿被裤子染黑了怎么办 肚子上的松皮怎么办 在公司天天背锅怎么办 职场老实背锅怎么办 三星a8充不了电怎么办 果6软件连不上网怎么办 孩子在幼儿园磕伤了怎么办 小孩在幼儿园摔骨折了怎么办 孩子在幼儿园摔骨折了怎么办 大腿被撞了很痛怎么办 马面褶子坏了怎么办 纱料衣服有褶怎么办 裙子如果后背那里小了怎么办 湖州耳朵鸣很严重怎么办