如何得到硬盘序列号[C#]

如何得到硬盘序列号[C#],第1张

如何得到硬盘序列号[C#],第2张

硬盘序列号不等于卷名。后者虽然容易获得,但是分区格式化后会重写,不可靠。可惜很多朋友往往分不清这个。

要获取硬盘的物理序列号,可以使用WMI,是Win32 _ physical media . serial number,可惜Windows 98/ME的WMI不支持这个类,访问时会有异常。

受林露例子的启发,我们也可以通过S.M.A.R.T接口直接从RING3调用API DeviceIoControl()来获取硬盘信息,无需编写VXD或驱动程序。这样,这个问题就解决了。我对它进行了封装,并广泛使用了P/Invoke技术,一个完整的库。支持Windows 98-2003。

使用起来非常简单:

HardDiskInfo hdd = AtapiDevice。GetHddInfo(0);//第一块硬盘
console.writeline("模块号:{0} ",HDD . module number);
控制台。WriteLine("序列号:{0} ",hdd。序列号);
控制台。WriteLine("固件:{0} ",hdd。固件);
控制台。WriteLine("容量:{0} M ",hdd。容量);

以下是所有代码:

使用系统;
使用系统。Runtime . InteropServices
使用系统。文本;

命名空间Sunmaster。hardware
{
[Serializable]
Public Struct Hard Diskinfo
{
///model
////br
//
//固件版本
/
Public string firmware;
//
//序列号
//
公共字符串序列号;
//
//以m为单位的容量
//
公共单元容量;
}

#区域内部结构

[StructLayout(LayoutKind。Sequential,Pack=1)]
内部结构getversionoputparams
{
公共字节bVersion
公共字节缩写;
public byte bReserved;
public byte bidevicemap;
公共单位职能。
[MarshalAs(UnmanagedType。ByValArray,size const = 4)]
public uint[]dw reserved;//供将来使用。
}

[StructLayout(LayoutKind。Sequential,Pack=1)]
内部结构IdeRegs
{
公共字节bFeaturesReg
公共字节bSectorCountReg
公共字节bSectorNumberReg
公共字节bCylLowReg
公共字节bCylHighReg
公共字节bDriveHeadReg
公共字节bCommandReg
public byte bReserved;
}

[StructLayout(LayoutKind。Sequential,Pack=1)]
内部结构SendCmdInParams
{
public uint cBufferSize;
public IdeRegs irDriveRegs;
公共字节bDriveNumber
[MarshalAs(UnmanagedType。ByValArray,size const = 3)]
public byte[]bReserved;
[MarshalAs(UnmanagedType。ByValArray,size const = 4)]
public uint[]dw reserved;
公共字节bBuffer
}

[StructLayout(LayoutKind。Sequential,Pack=1)]
内部结构驱动程序状态
{
公共字节bDriverError
公共字节bIDEStatus
[MarshalAs(UnmanagedType。ByValArray,size const = 2)]
public byte[]bReserved;
[MarshalAs(UnmanagedType。ByValArray,size const = 2)]
public uint[]dw reserved;
}

[StructLayout(LayoutKind。Sequential,Pack=1)]
内部结构SendCmdOutParams
{
public uint cBufferSize;
public DriverStatus DriverStatus;
公共id部门bBuffer。
}

[StructLayout(LayoutKind。Sequential,Pack=1,Size=512)]
内部结构id sector
{
public ushort wGenConfig;
public ushort wNumCyls;
public ushort被保留;
public ushort wNumHeads;
public ushort wBytesPerTrack;
public ushort wBytesPerSector;
public ushort wSectorsPerTrack;
[MarshalAs(UnmanagedType。ByValArray,size const = 3)]
public ushort[]wvendor unique;
[MarshalAs(UnmanagedType。ByValArray,size const = 20)]
public byte[]sSerialNumber;
public ushort wBufferType;
public ushort wBufferSize;
public ushort wecc size;
[MarshalAs(UnmanagedType。ByValArray,size const = 8)]
public byte[]sFirmwareRev;
[MarshalAs(UnmanagedType。ByValArray,size const = 40)]
public byte[]sModelNumber;
public ushort wMoreVendorUnique;
public ushort wDoubleWordIO;
公共服务能力。
public ushort被保留1;
public ushort wpio timing;
public ushort wd mating;
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 wmultiwodma;
[MarshalAs(UnmanagedType。ByValArray,size const = 128)]
public byte[]b served;
}

#结束区域

////
//与atapi驱动程序相关的
/
公共类atapi设备
{

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 如何得到硬盘序列号[C#]

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情