e股脑电脑教程网
  • 首 页
  • 操作系统
  • 应用软件
  • 下载工具
  • 影音视频
  • 办公软件
  • 媒体制作
  • 网站建设
  • 平面设计
  • 数据库
  • 程序开发
  • 视频教程
编辑推荐: | 文章搜索:
您现在的位置: e股脑 >> 程序开发 >> C教程 >> 如何得到硬盘序列号 >> 教程正文
 
教程搜索
 
 
相关教程
  • 深入剖析C#继承机制
  • C#如何获得 WINDOWS 版本
  • C# 编码规范和编程好习惯
  • 获得汉字字符串拼音首字母 C#版
  • 利用C#实现标准的 Dispose模式
  • 在C#中应用哈希表(Hashtable)
  • 利用Delphi 2005 编写C#应用程序
  • 对C#泛型中的new()约束的一点思考
  • 身份证15To18 的算法(C#)
  • .Net下WebMethod属性
  • C#实现的18位身份证格式验证算法
  • C#中用API实现MP3等音频文件的播放类
  • 用C#把文件转换为XML
  • 如何得到硬盘序列号
  • Raw Socket编程实现网络封包监视
  • C#2.0 对AD的简单操作
 
 

图文教程


  • 将其他Email邮件转移到Gmail邮箱中

  • Vista破解TCP/IP后进不了系统咋办

  • Vista下用DriveSpacio查看磁盘空间

  • Windows抢了谁的饭碗 非主流操作系统To

  • 地球还是火星 平常心看“非主流”
 
 
赞 助 商
 
 
如何得到硬盘序列号
  • 来源:e股脑
  • 点击次数:
  • 更新时间:2007-8-9

硬盘序列号(Serial Number)不等于卷标号(Volume Name),后者虽然很容易得到,但是格式化分区后就会重写,不可靠。遗憾的是很多朋友往往分不清这一点。

要得到硬盘的物理序列号,可以通过WMI,也就是Win32_PhysicalMedia.SerialNumber。可惜的是Windows 98/ME的WMI并不支持这个类,访问时会出现异常。

受陆麟的例子的启发,我们还可以通过S.M.A.R.T.接口,直接从RING3调用API DeviceIoControl()来获取硬盘信息,而不需要写VXD或者DRIVER。这样这个问题就解决了,我对它进行了封装,大量使用了P/Invoke技术,一个完整的Library。支持Windows 98-2003。

使用上很简单:

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 w

1 2 3 4 下一页
  • 上一篇教程: Raw Socket编程实现网络封包监视
  • 下一篇教程: 用C#把文件转换为XML
  •  

    关于本站 | 广告联系 | 版权声明 | 使用帮助

    Copyright © 2004-2008 www.egunao.com All rights reserved.