C# 读取IDE硬盘序列号

转载 2006年06月04日 11:24:00

public class IDE
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    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.ByValTStr, SizeConst = 20)]
        public string sSerialNumber;
        public ushort wBufferType;
        public ushort wBufferSize;
        public ushort wECCSize;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
        public string sFirmwareRev;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)]
        public string 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;
    }

    [StructLayout(LayoutKind.Sequential)]
    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)]
    internal struct SENDCMDOUTPARAMS
    {
        public uint cBufferSize;
        public DRIVERSTATUS DriverStatus;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 513)]
        public byte[] bBuffer;
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    internal struct SRB_IO_CONTROL
    {
        public uint HeaderLength;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
        public string Signature;
        public uint Timeout;
        public uint ControlCode;
        public uint ReturnCode;
        public uint Length;
    }

    [StructLayout(LayoutKind.Sequential)]
    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)]
    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)]
    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.

        [DllImport("kernel32.dll")]
        private static extern int CloseHandle(uint hObject);

        [DllImport("kernel32.dll")]
        private static extern int DeviceIoControl(uint hDevice,
        uint dwIoControlCode,
        ref SENDCMDINPARAMS lpInBuffer,
        int nInBufferSize,
        ref SENDCMDOUTPARAMS lpOutBuffer,
        int nOutBufferSize,
        ref uint lpbytesReturned,
        int lpOverlapped);
        [DllImport("kernel32.dll")]
        private static extern int DeviceIoControl(uint hDevice,
        uint dwIoControlCode,
        int lpInBuffer,
        int nInBufferSize,
        ref GETVERSIONOUTPARAMS lpOutBuffer,
        int nOutBufferSize,
        ref uint lpbytesReturned,
        int lpOverlapped);

        [DllImport("kernel32.dll")]
        private static extern uint CreateFile(string lpFileName,
        uint dwDesiredAccess,
        uint dwShareMode,
        int lpSecurityAttributes,
        uint dwCreationDisposition,
        uint dwFlagsAndAttributes,
        int hTemplateFile);

        private const uint GENERIC_READ = 0x80000000;
        private const uint GENERIC_WRITE = 0x40000000;
        private const uint FILE_SHARE_READ = 0x00000001;
        private const uint FILE_SHARE_WRITE = 0x00000002;
        private const uint OPEN_EXISTING = 3;
        private const uint INVALID_HANDLE_VALUE = 0xffffffff;
        private const uint DFP_GET_VERSION = 0x00074080;
        private const int IDE_ATAPI_IDENTIFY = 0xA1; // Returns ID sector for ATAPI.
        private const int IDE_ATA_IDENTIFY = 0xEC; // Returns ID sector for ATA.
        private const int IDENTIFY_BUFFER_SIZE = 512;
        private const uint DFP_RECEIVE_DRIVE_DATA = 0x0007c088;

        public static string Read(byte drive)
        {
            OperatingSystem os = Environment.OSVersion;
            if (os.Platform != PlatformID.Win32NT) throw new NotSupportedException("仅支持2000/XP");
            if (os.Version.Major < 5) throw new NotSupportedException("仅支持2000/XP");

            string driveName = "////.//PhysicalDrive" + drive.ToString();
            uint device = CreateFile(driveName,
            GENERIC_READ | GENERIC_WRITE,
            FILE_SHARE_READ | FILE_SHARE_WRITE,
            0, OPEN_EXISTING, 0, 0);
            if (device == INVALID_HANDLE_VALUE) return "";
            GETVERSIONOUTPARAMS verPara = new GETVERSIONOUTPARAMS();
            uint bytRv = 0;

            if (0 != DeviceIoControl(device, DFP_GET_VERSION,
            0, 0, ref verPara, Marshal.SizeOf(verPara),
            ref bytRv, 0))
            {
                if (verPara.bIDEDeviceMap > 0)
                {
                    byte bIDCmd = (byte)(((verPara.bIDEDeviceMap >> drive & 0x10) != 0) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY);

                    SENDCMDINPARAMS scip = new SENDCMDINPARAMS();
                    SENDCMDOUTPARAMS scop = new SENDCMDOUTPARAMS();

                    scip.cBufferSize = IDENTIFY_BUFFER_SIZE;
                    scip.irDriveRegs.bFeaturesReg = 0;
                    scip.irDriveRegs.bSectorCountReg = 1;
                    scip.irDriveRegs.bCylLowReg = 0;
                    scip.irDriveRegs.bCylHighReg = 0;
                    scip.irDriveRegs.bDriveHeadReg = (byte)(0xA0 | ((drive & 1) << 4));
                    scip.irDriveRegs.bCommandReg = bIDCmd;
                    scip.bDriveNumber = drive;

                    if (0 != DeviceIoControl(device, DFP_RECEIVE_DRIVE_DATA,
                    ref scip, Marshal.SizeOf(scip), ref scop,
                    Marshal.SizeOf(scop), ref bytRv, 0))
                    {
                        StringBuilder s = new StringBuilder();
                        for (int i = 20; i < 40; i += 2)
                        {
                            s.Append((char)(scop.bBuffer[i + 1]));
                            s.Append((char)scop.bBuffer[i]);
                        }
                        CloseHandle(device);
                        return s.ToString().Trim();
                    }
                }
            }
            CloseHandle(device);
            return "";
        }
    }
}

【Delphi】获取IDE/SATA硬盘序列号

网上有这种代码了,只是因为写的较早,有些地方写的不那么言简意赅,而且在XE后的版本中有问题(因为Unicode字符的关系) 下面是精简修改过的代码,只取第一块硬盘的序列号,Win7 + XE 测试通过...
  • aqtata
  • aqtata
  • 2013年01月19日 11:16
  • 2588

C#读取硬盘序列号源程序

  • 2009年08月20日 09:49
  • 1KB
  • 下载

c#获取电脑cpu,硬盘序列号,网卡地址类

/// /// 获取电脑cpu,硬盘序列号,网卡地址类 /// class HardwareInfo { /// /// 取机器名 /// /// public string GethostName(...
  • djl310
  • djl310
  • 2012年02月17日 09:50
  • 470

C#获取硬盘、CPU、主板、网卡的序列号…… ManagementObjectSearcher

在很多情况下,你可能都需要得到微机的硬件信息。比如:你想给你的软件加锁,不让别人随便访问。 首先,你必须知道这个应用程序的功能是使用System.Management这个类得到的。因此,你需要加...

C#获取CPU序列号,MAC地址,硬盘ID,本机IP地址,计算机名,物理内存,PC类型

//1.cpu序列号2.mac序列号3.硬盘id //在给软件加序列号时这三个应该是最有用的,可以实现序列号和机器绑定,对保护软件很有好处. using System; using Syste...

使用c#获得cpu,硬盘的序列号(源码)

using System;using System.Runtime.InteropServices;using  System.Management;namespace Hardware{ ///  ...
  • freellf
  • freellf
  • 2011年03月31日 21:49
  • 280

.net C# 获取硬盘号 CPU序列号 IP地址 Mac地址

获取HardDisk的序列号(两种方法):public static string GetHardDiskID() { //Get the first Ha...

C#获取硬盘、CPU、主板、网卡的序列号

转自:http://blog.sina.com.cn/s/blog_557d25460101hq9t.html 在很多情况下,你可能都需要得到微机的硬件信息。比如:你想给你的软件加锁...

c#中如何获取本机MAC地址、IP地址、硬盘ID、CPU序列号等系统信息

我们在利用C#开发桌面程序(Winform)程序的时候,经常需要获取一些跟系统相关的信息,例如用户名、MAC地址、IP地址、硬盘ID、CPU序列号、系统名称、物理内存等。 首先需要引入命名空间: u...

C#读硬盘序列号的原代码

public class IDE { [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 读取IDE硬盘序列号
举报原因:
原因补充:

(最多只允许输入30个字)