回 帖 发 新 帖 刷新版面

主题:这是读取硬盘序列号的代码,谁帮个忙,完整一下

这是读取硬盘序列号的代码,我想做一个软件保护程序,我也不是学计算机的,更没学过编程。谁帮个忙,完整一下
要把这个读到的序列号N*2005+3-2,再输出来,各位大虾,帮个忙,小弟在此谢过了,加分了。
啊,还有在线等待

注:这代码是复制来的,我只是不懂得C#的编程规则,还请大家完整地写出来。谢谢。
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("仅支持WindowsNT/2000/XP"); 
//我没有NT4,请哪位大大测试一下NT4下能不能用 
//if (os.Version.Major < 5) throw new NotSupportedException("仅支持WindowsNT/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 ""; 



回复列表 (共6个回复)

沙发

这个东西不好弄!

板凳

我手里有一个:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace 获取硬盘序列号
{
    [Serializable]
    public struct HardDiskInfo
    {
        public string ModuleNumber;//型号          
        public string Firmware;//固件版本            
        public string SerialNumber;// 序列号            
        public uint Capacity;// 容量,以M为单位
    }

    //#region只是块标记没别的作用,便于阅读
    #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 //块结束标记

3 楼

/// <summary>
    /// ATAPI驱动器相关
    /// </summary>
    class Program
    {
        #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.");
            }
        }

4 楼

//块也可以嵌套
        #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

5 楼

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

        static void Main(string[] args)
        {
            HardDiskInfo hdd = GetHddInfo(0);//原书的这个错了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);
            Console.ReadLine();
        }
    }
}
-----------------------------------------------------------------------------
运行结果:
Module Number: WDC WD1600JS-00NCB1
Serial Number: WD-WCANMJ780986
Firmware: 10.02E02
Capacity: 131071 M

6 楼

不好意思,本来想全给30分的,可论坛不让给超过50分

我来回复

您尚未登录,请登录后再回复。点此登录或注册