CSDN论坛 > Delphi > VCL组件开发及应用

谁有读硬盘序列号的函数了 [问题点数:50分,结帖人feiboy]

Bbs1
本版专家分:56
结帖率 100%
CSDN今日推荐
Bbs3
本版专家分:667
Bbs9
本版专家分:83418
Blank
进士 2007年 总版技术专家分年内排行榜第九
Blank
铜牌 2007年7月 总版技术专家分月排行榜第三
Blank
红花 2007年9月 Oracle大版内专家分月排行榜第一
2007年7月 Oracle大版内专家分月排行榜第一
2007年6月 Oracle大版内专家分月排行榜第一
2008年7月 Delphi大版内专家分月排行榜第一
2008年3月 Delphi大版内专家分月排行榜第一
2008年2月 Delphi大版内专家分月排行榜第一
2007年12月 Delphi大版内专家分月排行榜第一
2007年11月 Delphi大版内专家分月排行榜第一
2007年10月 Delphi大版内专家分月排行榜第一
2007年9月 Delphi大版内专家分月排行榜第一
2007年7月 Delphi大版内专家分月排行榜第一
2007年6月 Delphi大版内专家分月排行榜第一
2007年4月 Delphi大版内专家分月排行榜第一
2007年1月 Delphi大版内专家分月排行榜第一
Blank
黄花 2009年5月 Delphi大版内专家分月排行榜第二
2007年8月 Oracle大版内专家分月排行榜第二
2007年4月 Oracle大版内专家分月排行榜第二
2008年1月 Delphi大版内专家分月排行榜第二
2007年8月 Delphi大版内专家分月排行榜第二
2007年5月 Delphi大版内专家分月排行榜第二
2007年3月 Delphi大版内专家分月排行榜第二
2007年2月 Delphi大版内专家分月排行榜第二
Bbs2
本版专家分:138
Bbs2
本版专家分:108
匿名用户不能发表回复!
其他相关推荐
获取硬盘物理序列号及型号
可获取由硬盘物理序列号与型号组成的一串20位字符串,如不足20位,则自动以给定的字符串中提取不足部分进行补充
Qt获取本机硬盘序列号,不受IDE硬盘与SCSI硬盘类型影响
以下是在Qt下可以直接使用的代码,如果想在其他平台使用请修改一些内容: #pragma argsused #define DFP_GET_VERSION 0x00074080 #define DFP_SEND_DRIVE_COMMAND 0x0007c084 #define DFP_RECEIVE_DRIVE_DATA 0x0007c088 #define SEND
读硬盘序列号和加密RSA算法.rar
读硬盘序列号和加密RSA算法.rar 读硬盘序列号和加密RSA算法.rar
VC++ 获取硬盘序列号源码(XP适用)
// GetHDSerial.cpp: implementation of the CGetHDSerial class. // Download by http://www.newxing.com/ ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #inc
获取硬盘序列号,搞了半天,看来不行了
using System; using System.Drawing; using System.IO; using System.Runtime.InteropServices; using System.Security; using System.Text; //using Sanxing.Share.Properties; //Download by http://www.codefans.net namespace YPH { /// <summary> /// 执行需要调用 <b>Win32</b> API 的操作辅助类。 /// </summary> [SuppressUnmanagedCodeSecurity()] public static partial class Win32 { #region 方法 /// <summary> /// 执行获取当前运行的操作系统版本。 /// </summary> /// <returns><see cref="Platform"/> 的值之一,他表示当前运行的操作系统版本。</returns> private static Platform GetCurrentPlatform() { OperatingSystem os = Environment.OSVersion; Platform pt; switch (os.Platform) { case (PlatformID.Win32Windows): // Win95, Win98 or Me switch (os.Version.Minor) { case (0): // 95 pt = Platform.Windows95; break; case (10): // 98 if (os.Version.Revision.ToString() == "2222A") pt = Platform.Windows982ndEdition; else pt = Platform.Windows98; break; case (90): // winme pt = Platform.WindowsME; break; default: // Unknown pt = Platform.UnKnown; break; } break; case (PlatformID.Win32NT): //Win2k or Xp or 2003 switch (os.Version.Major) { case (3): pt = Platform.WindowsNT351; break; case (4): pt = Platform.WindowsNT40; break; case (5): if (os.Version.Minor == 0) pt = Platform.Windows2000; else if (os.Version.Minor == 1) pt = Platform.WindowsXP; else if (os.Version.Minor == 2) pt = Platform.Windows2003; else pt = Platform.UnKnown; break; default: pt = Platform.UnKnown; break; } break; case (PlatformID.WinCE): // WinCE pt = Platform.WindowsCE; break; case (PlatformID.Win32S): case (PlatformID.Unix): default: pt = Platform.UnKnown; break; } return pt; } /// <summary> /// 表示操作系统平台。 /// </summary> private enum Platform : byte { /// <summary> /// Windows 95 操作系统. /// </summary> Windows95, /// <summary> /// Windows 98 操作系统. /// </summary> Windows98, /// <summary> /// Windows 98 第二版操作系统. /// </summary> Windows982ndEdition, /// <summary> /// Windows ME 操作系统. /// </summary> WindowsME, /// <summary> /// Windows NT 3.51 操作系统. /// </summary> WindowsNT351, /// <summary> /// Windows NT 4.0 操作系统. /// </summary> WindowsNT40, /// <summary> /// Windows 2000 操作系统. /// </summary> Windows2000, /// <summary> /// Windows XP 操作系统. /// </summary> WindowsXP, /// <summary> /// Windows 2003 操作系统. /// </summary> Windows2003, /// <summary> /// Windows CE 操作系统. /// </summary> WindowsCE, /// <summary> /// 操作系统版本未知。 /// </summary> UnKnown } /// <summary> /// 表示IDE设备错误状态代码的常量与数值的对应。 /// </summary> /// <remarks>其数值与常量定义在 <b>WinIoCtl.h</b> 文件中。</remarks> private enum DriverError : byte { /// <summary> /// 设备无错误。 /// </summary> SMART_NO_ERROR = 0, // No error /// <summary> /// 设备IDE控制器错误。 /// </summary> SMART_IDE_ERROR = 1, // Error from IDE controller /// <summary> /// 无效的命令标记。 /// </summary> SMART_INVALID_FLAG = 2, // Invalid command flag /// <summary> /// 无效的命令数据。 /// </summary> SMART_INVALID_COMMAND = 3, // Invalid command byte /// <summary> /// 缓冲区无效(如缓冲区为空或地址错误)。 /// </summary> SMART_INVALID_BUFFER = 4, // Bad buffer (null, invalid addr..) /// <summary> /// 设备编号错误。 /// </summary> SMART_INVALID_DRIVE = 5, // Drive number not valid /// <summary> /// IOCTL错误。 /// </summary> SMART_INVALID_IOCTL = 6, // Invalid IOCTL /// <summary> /// 无法锁定用户的缓冲区。 /// </summary> SMART_ERROR_NO_MEM = 7, // Could not lock user's buffer /// <summary> /// 无效的IDE注册命令。 /// </summary> SMART_INVALID_REGISTER = 8, // Some IDE Register not valid /// <summary> /// 无效的命令设置。 /// </summary> SMART_NOT_SUPPORTED = 9, // Invalid cmd flag set /// <summary> /// 指定要查找的设别索引号无效。 /// </summary> SMART_NO_IDE_DEVICE = 10 } public 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; } } /// <summary> /// 根据指定的设备信息生成设备的详细信息。 /// </summary> /// <param name="phdinfo">一个 <see cref="IdSector"/></param> /// <returns></returns> private static HDiskInfo GetHardDiskInfo(IdSector phdinfo) { HDiskInfo hdd = new HDiskInfo(); hdd.ModuleNumber = Encoding.ASCII.GetString(phdinfo.sModelNumber).Trim(); hdd.Firmware = Encoding.ASCII.GetString(phdinfo.sFirmwareRev).Trim(); hdd.SerialNumber = Encoding.ASCII.GetString(phdinfo.sSerialNumber).Trim(); hdd.Capacity = phdinfo.ulTotalAddressableSectors / 2 / 1024; hdd.BufferSize = phdinfo.wBufferSize / 1024; return hdd; } /// <summary> /// 获取在NT平台下指定序列号的硬盘信息。 /// </summary> /// <param name="driveIndex">物理磁盘的数量。</param> /// <returns></returns> public static HDiskInfo GetHddInfoNT(byte driveIndex) { GetVersionOutParams vers = new GetVersionOutParams(); SendCmdInParams inParam = new SendCmdInParams(); SendCmdOutParams outParam = new SendCmdOutParams(); uint bytesReturned = 0; // 使用 Win2000 或 Xp下的方法获取硬件信息 // 获取设备的句柄。 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 UnauthorizedAccessException("执行 Win32 API 函数 CreateFile 失败。"); if (0 == DeviceIoControl(hDevice, SMART_GET_VERSION, IntPtr.Zero, 0, ref vers, (uint)Marshal.SizeOf(vers), ref bytesReturned, IntPtr.Zero)) { CloseHandle(hDevice); //throw new IOException(string.Format(Resources.Win32_DeviceIoControlErr, "SMART_GET_VERSION")); } // 检测IDE控制命令是否支持 if (0 == (vers.fCapabilities & 1)) { CloseHandle(hDevice); //throw new IOException(Resources.Win32_DeviceIoControlNotSupport); } // 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 IOException(Resources.Win32_DeviceIoControlNotSupport); } else inParam.irDriveRegs.bCommandReg = 0xec; inParam.bDriveNumber = driveIndex; inParam.irDriveRegs.bSectorCountReg = 1; inParam.irDriveRegs.bSectorNumberReg = 1; inParam.cBufferSize = 512; if (0 == DeviceIoControl( hDevice, SMART_RCV_DRIVE_DATA, ref inParam, (uint)Marshal.SizeOf(inParam), ref outParam, (uint)Marshal.SizeOf(outParam), ref bytesReturned, IntPtr.Zero)) { CloseHandle(hDevice); //throw new IOException( // string.Format(Resources.Win32_DeviceIoControlErr, "SMART_RCV_DRIVE_DATA")); } CloseHandle(hDevice); ChangeByteOrder(outParam.bBuffer.sModelNumber); ChangeByteOrder(outParam.bBuffer.sSerialNumber); ChangeByteOrder(outParam.bBuffer.sFirmwareRev); return GetHardDiskInfo(outParam.bBuffer); } #endregion #region Win32 /// <summary> /// 取得指定窗口的系统菜单的句柄。 /// </summary> /// <param name="hwnd">指向要获取系统菜单窗口的 <see cref="IntPtr"/> 句柄。</param> /// <param name="bRevert">获取系统菜单的方式。设置为 <b>true</b>,表示接收原始的系统菜单,否则设置为 <b>false</b> 。</param> /// <returns>指向要获取的系统菜单的 <see cref="IntPtr"/> 句柄。</returns> [DllImport("user32.dll", SetLastError = true)] private static extern IntPtr GetSystemMenu(IntPtr hwnd, bool bRevert); /// <summary> /// 获取指定的菜单中条目(菜单项)的数量。 /// </summary> /// <param name="hMenu">指向要获取菜单项数量的系统菜单的 <see cref="IntPtr"/> 句柄。</param> /// <returns>菜单中的条目数量</returns> [DllImport("user32.dll", SetLastError = true)] private static extern int GetMenuItemCount(IntPtr hMenu); /// <summary> /// 删除指定的菜单条目。 /// </summary> /// <param name="hMenu">指向要移除的菜单的 <see cref="IntPtr"/> 。</param> /// <param name="uPosition">欲改变的菜单条目的标识符。</param> /// <param name="uFlags"></param> /// <returns>非零表示成功,零表示失败。</returns> /// <remarks> /// 如果在 <paramref name="uFlags"/> 中使用了<see cref="MF_BYPOSITION"/> ,则在 <paramref name="uPosition"/> 参数表示菜单项的索引; /// 如果在 <paramref name="uFlags"/> 中使用了 <b>MF_BYCOMMAND</b>,则在 <paramref name="uPosition"/> 中使用菜单项的ID。 /// </remarks> [DllImport("user32.dll", SetLastError = true)] private static extern int RemoveMenu(IntPtr hMenu, int uPosition, int uFlags); /// <summary> /// 关闭一个指定的指针对象指向的设备。。 /// </summary> /// <param name="hObject">要关闭的句柄 <see cref="IntPtr"/> 对象。</param> /// <returns>成功返回 <b>0</b> ,不成功返回非零值。</returns> [DllImport("kernel32.dll", SetLastError = true)] private static extern int CloseHandle(IntPtr hObject); /// <summary> /// 执行打开/建立资源的功能。 /// </summary> /// <param name="lpFileName">指定要打开的设备或文件的名称。</param> /// <param name="dwDesiredAccess"> /// <para>Win32 常量,用于控制对设备的读访问、写访问或读/写访问的常数。内容如下表: /// <p><list type="table"> /// <listheader> /// <term>名称</term> /// <description>说明</description> /// </listheader> /// <item> /// <term>GENERIC_READ</term><description>指定对设备进行读取访问。</description> /// </item> /// <item> /// <term>GENERIC_WRITE</term><description>指定对设备进行写访问。</description> /// </item> /// <item><term><b>0</b></term><description>如果值为零,则表示只允许获取与一个设备有关的信息。</description></item> /// </list></p> /// </para> /// </param> /// <param name="dwShareMode">指定打开设备时的文件共享模式</param> /// <param name="lpSecurityAttributes"></param> /// <param name="dwCreationDisposition">Win32 常量,指定操作系统打开文件的方式。内容如下表: /// <para><p> /// <list type="table"> /// <listheader><term>名称</term><description>说明</description></listheader> /// <item> /// <term>CREATE_NEW</term> /// <description>指定操作系统应创建新文件。如果文件存在,则抛出 <see cref="IOException"/> 异常。</description> /// </item> /// <item><term>CREATE_ALWAYS</term><description>指定操作系统应创建新文件。如果文件已存在,它将被改写。</description></item> /// </list> /// </p></para> /// </param> /// <param name="dwFlagsAndAttributes"></param> /// <param name="hTemplateFile"></param> /// <returns>使用函数打开的设备的句柄。</returns> /// <remarks> /// 本函数可以执行打开或建立文件、文件流、目录/文件夹、物理磁盘、卷、系统控制的缓冲区、磁带设备、 /// 通信资源、邮件系统和命名管道。 /// </remarks> [DllImport("kernel32.dll", SetLastError = true)] private static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile); /// <summary> /// 对设备执行指定的操作。 /// </summary> /// <param name="hDevice">要执行操作的设备句柄。</param> /// <param name="dwIoControlCode">Win32 API 常数,输入的是以 <b>FSCTL_</b> 为前缀的常数,定义在 /// <b>WinIoCtl.h</b> 文件内,执行此重载方法必须输入 <b>SMART_GET_VERSION</b> 。</param> /// <param name="lpInBuffer">当参数为指针时,默认的输入值是 <b>0</b> 。</param> /// <param name="nInBufferSize">输入缓冲区的字节数量。</param> /// <param name="lpOutBuffer">一个 <b>GetVersionOutParams</b> ,表示执行函数后输出的设备检查。</param> /// <param name="nOutBufferSize">输出缓冲区的字节数量。</param> /// <param name="lpBytesReturned">实际装载到输出缓冲区的字节数量。</param> /// <param name="lpOverlapped">同步操作控制,一般不使用,默认值为 <b>0</b> 。</param> /// <returns>非零表示成功,零表示失败。</returns> [DllImport("kernel32.dll", SetLastError = true)] private static extern int DeviceIoControl(IntPtr hDevice, uint dwIoControlCode, IntPtr lpInBuffer, uint nInBufferSize, ref GetVersionOutParams lpOutBuffer, uint nOutBufferSize, ref uint lpBytesReturned, [Out] IntPtr lpOverlapped); /// <summary> /// 对设备执行指定的操作。 /// </summary> /// <param name="hDevice">要执行操作的设备句柄。</param> /// <param name="dwIoControlCode">Win32 API 常数,输入的是以 <b>FSCTL_</b> 为前缀的常数,定义在 /// <b>WinIoCtl.h</b> 文件内,执行此重载方法必须输入 <b>SMART_SEND_DRIVE_COMMAND</b> 或 <b>SMART_RCV_DRIVE_DATA</b> 。</param> /// <param name="lpInBuffer">一个 <b>SendCmdInParams</b> 结构,它保存向系统发送的查询要求具体命令的数据结构。</param> /// <param name="nInBufferSize">输入缓冲区的字节数量。</param> /// <param name="lpOutBuffer">一个 <b>SendCmdOutParams</b> 结构,它保存系统根据命令返回的设备相信信息二进制数据。</param> /// <param name="nOutBufferSize">输出缓冲区的字节数量。</param> /// <param name="lpBytesReturned">实际装载到输出缓冲区的字节数量。</param> /// <param name="lpOverlapped">同步操作控制,一般不使用,默认值为 <b>0</b> 。</param> /// <returns>非零表示成功,零表示失败。</returns> [DllImport("kernel32.dll", SetLastError = true)] private static extern int DeviceIoControl(IntPtr hDevice, uint dwIoControlCode, ref SendCmdInParams lpInBuffer, uint nInBufferSize, ref SendCmdOutParams lpOutBuffer, uint nOutBufferSize, ref uint lpBytesReturned, [Out] IntPtr lpOverlapped); #endregion #region 结构 /// <summary> /// 保存当前计算机 IDE 设备(硬盘)的硬件信息的结构。 /// </summary> [Serializable] public struct HDiskInfo { /// <summary> /// 硬盘型号。 /// </summary> public string ModuleNumber; /// <summary> /// 硬盘的固件版本。 /// </summary> public string Firmware; /// <summary> /// 硬盘序列号。 /// </summary> public string SerialNumber; /// <summary> /// 硬盘容量,以M为单位。 /// </summary> public uint Capacity; /// <summary> /// 设备缓存大小(以M为单位)。 /// </summary> public int BufferSize; } /// <summary> /// 表示使用 <b>DeviceIoControl</b> 函数时保存返回的驱动器硬件信息的结构 /// </summary> /// <remarks>>此数据结构定义在 <b>WinIoCtl.h</b> 文件名为 <b>_GETVERSIONINPARAMS</b> 结构中。</remarks> [StructLayout(LayoutKind.Sequential, Pack = 1)] private struct GetVersionOutParams { /// <summary> /// IDE设备的二进制硬件版本。 /// </summary> public byte bVersion; /// <summary> /// IDE设备的二进制修订版本。 /// </summary> public byte bRevision; /// <summary> /// 此值操作系统没有使用,使用此数据结构时被设置为 <b>0</b> 。 /// </summary> public byte bReserved; /// <summary> /// IDE设备的二进制映射。 /// </summary> public byte bIDEDeviceMap; /// <summary> /// IDE设备的二进制容量数据。 /// </summary> public uint fCapabilities; /// <summary> /// 保留内容,不使用。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public uint[] dwReserved; // For future use. } /// <summary> /// 一个数据结构,表示使用 <b>DeviceIoControl</b> 函数时发送到操作系统中的命令数据结构 <b>SendCmdInParams</b> 的成员结构。 /// 它表示要获取磁盘设备性能参数的具体定义规则。 /// </summary> /// <seealso cref="SendCmdInParams"/> /// <remarks>此数据结构定义在 <b>WinIoCtl.h</b> 文件名为 <b>_IDEREGS</b> 中。</remarks> [StructLayout(LayoutKind.Sequential, Pack = 1)] private struct IdeRegs { /// <summary> /// 发送到操作系统的注册命令,此为系统的 <b>SMART Command</b> 。 /// </summary> public byte bFeaturesReg; /// <summary> /// 获取IDE设备扇区数。 /// </summary> public byte bSectorCountReg; /// <summary> /// 获取IDE设备编号。 /// </summary> public byte bSectorNumberReg; /// <summary> /// 获取IDE设备低端柱面值。 /// </summary> public byte bCylLowReg; /// <summary> /// 获取IDE设备高端柱面值。 /// </summary> public byte bCylHighReg; /// <summary> /// 获取IDE设备的头信息。 /// </summary> public byte bDriveHeadReg; /// <summary> /// 获取IDE设备的真正命令。 /// </summary> public byte bCommandReg; /// <summary> /// 保留内容,此值应设置为 <b>0</b> 。 /// </summary> public byte bReserved; } /// <summary> /// 保存执行 <b>DeviceIoControl</b> 函数时向系统提交的执行操作命令。 /// </summary> /// <seealso cref="SendCmdInParams"/> /// <remarks>此数据结构定义在 <b>WinIoCtl.h</b> 文件名为 <b>_SENDCMDINPARAMS</b> 中。</remarks> [StructLayout(LayoutKind.Sequential, Pack = 1)] private struct SendCmdInParams { /// <summary> /// 输出的数据缓冲大小。 /// </summary> public uint cBufferSize; /// <summary> /// 保存向系统发送的磁盘设备命令的数据结构。 /// </summary> public IdeRegs irDriveRegs; /// <summary> /// 希望系统控制的物理磁盘的编号。 /// </summary> public byte bDriveNumber; /// <summary> /// 保留的数据,不使用。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] bReserved; /// <summary> /// 保留的数据,不使用。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public uint[] dwReserved; /// <summary> /// 保存当前 <b>SendCmdInParams</b> 结构填充数据后的大小。 /// </summary> public byte bBuffer; } /// <summary> /// 当执行 <b>DeviceIoControl</b> 函数后系统返回的 <b>SendCmdOutParams</b> 结构中 /// 保存磁盘设备当前错误信息的数据结构。 /// </summary> /// <seealso cref="SendCmdInParams"/> /// <remarks> /// 此数据结构定义在 <b>WinIoCtl.h</b> 文件名为 <b>_DRIVERSTATUS</b> 中。 /// <para> /// 错误代码如下表:<br /> /// <list type="table"> /// <listheader> /// <term>名称</term> /// <description>说明</description> /// <item><term>SMART_NO_ERROR = 0</term> /// <description>没有错误。</description></item> /// <item><term>SMART_IDE_ERROR = 1</term> /// <description>IDE控制器错误</description>。</item> /// <item><term>SMART_INVALID_FLAG = 2</term> /// <description>发送的命令标记无效。</description></item> /// <item><term>SMART_INVALID_COMMAND = 3</term> /// <description>发送的二进制命令无效。</description></item> /// <item><term>SMART_INVALID_BUFFER = 4</term> /// <description>二进制缓存无效(缓存为空或者无效地址)。</description></item> /// <item><term>SMART_INVALID_DRIVE = 5</term> /// <description>物理驱动器编号无效。</description></item> /// <item><term>SMART_INVALID_IOCTL = 6</term> /// <description>无效的IOCTL。</description></item> /// <item><term>SMART_ERROR_NO_MEM = 7</term> /// <description>使用的缓冲区无法锁定。</description></item> /// <item><term>SMART_INVALID_REGISTER = 8</term> /// <description>IDE注册命令无效。</description></item> /// <item><term>SMART_NOT_SUPPORTED = 9</term> /// <description>命令标记设置无效。</description></item> /// <item><term>SMART_NO_IDE_DEVICE = 10</term> /// <description>发送的物理驱动器索引超过限制。</description></item> /// </list> /// </para> /// </remarks> [StructLayout(LayoutKind.Sequential, Pack = 1)] private struct DriverStatus { /// <summary> /// 如果检查的IDE设备发生错误,保存的错误代码,<b>0</b> 表示没有错误。 /// </summary> public byte bDriverError; /// <summary> /// IDE设备被注册的错误内容。 /// </summary> public byte bIDEStatus; /// <summary> /// 保留的数据,不使用。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] bReserved; /// <summary> /// 保留的数据,不使用。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public uint[] dwReserved; } /// <summary> /// 表示当执行 <b>DeviceIoControl</b> 函数后保存系统根据查询命令返回的磁盘设备信息的数据结构。 /// </summary> [StructLayout(LayoutKind.Sequential, Pack = 1)] private struct SendCmdOutParams { /// <summary> /// 表示所有二进制信息的缓存大小。 /// </summary> public uint cBufferSize; /// <summary> /// 表示查询到设备的错误信息状态。 /// </summary> public DriverStatus DriverStatus; /// <summary> /// 表示系统返回的设备硬件信息的二进制数据结构。 /// </summary> public IdSector bBuffer; } /// <summary> /// 当执行 <b>DeviceIoControl</b> 函数后系统返回的 <b>SendCmdOutParams</b> 结构中 /// 保存磁盘设备的硬件信息的数据结构。 /// </summary> /// <seealso cref="SendCmdInParams"/> [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 512)] private struct IdSector { /// <summary> /// 设备通用配置信息。 /// </summary> public ushort wGenConfig; /// <summary> /// 设备的柱面数。 /// </summary> public ushort wNumCyls; /// <summary> /// 保留内容,不使用。 /// </summary> public ushort wReserved; /// <summary> /// 设备的磁头数目。 /// </summary> public ushort wNumHeads; /// <summary> /// 设备的磁道数目。 /// </summary> public ushort wBytesPerTrack; /// <summary> /// 设备的扇区数目。 /// </summary> public ushort wBytesPerSector; /// <summary> /// 设备厂商设定的扇区磁道数目。 /// </summary> public ushort wSectorsPerTrack; /// <summary> /// 设备的出品厂商名称。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public ushort[] wVendorUnique; /// <summary> /// 设备出品厂商的全球唯一编码。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public byte[] sSerialNumber; /// <summary> /// 设备的缓存类型。 /// </summary> public ushort wBufferType; /// <summary> /// 设备缓存容量(单位是byte)。 /// </summary> public ushort wBufferSize; /// <summary> /// 设备的错误检查和纠正(ECC)数据的大小。 /// </summary> public ushort wECCSize; /// <summary> /// 设备的固件版本。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] sFirmwareRev; /// <summary> /// 设备的型号。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)] public byte[] sModelNumber; /// <summary> /// 设备厂商名称的扩展内容(如果有)。 /// </summary> public ushort wMoreVendorUnique; /// <summary> /// 设备双指令输入输出模式。 /// </summary> public ushort wDoubleWordIO; /// <summary> /// 设备的容量大小(单位Byte)。 /// </summary> public ushort wCapabilities; /// <summary> /// 第一个保留的内容,不使用。 /// </summary> public ushort wReserved1; /// <summary> /// 设备的PIO模式巡道时间。 /// </summary> public ushort wPIOTiming; /// <summary> /// 设备DMA 模式巡道时间。 /// </summary> public ushort wDMATiming; /// <summary> /// 设备的总线类型,如SCSI,IDE等。 /// </summary> public ushort wBS; /// <summary> /// 设备的当前柱面数量。 /// </summary> public ushort wNumCurrentCyls; /// <summary> /// 设备当前磁头数量。 /// </summary> public ushort wNumCurrentHeads; /// <summary> /// 设备的当前扇区的磁道数量。 /// </summary> public ushort wNumCurrentSectorsPerTrack; /// <summary> /// 设备的当前扇区容量(单位byte)。 /// </summary> public uint ulCurrentSectorCapacity; /// <summary> /// 多扇区读写模式支持。 /// </summary> public ushort wMultSectorStuff; /// <summary> /// 用户是否可自定义扇区地址(LBA模式)支持。 /// </summary> public uint ulTotalAddressableSectors; /// <summary> /// 单指令DMA模式。 /// </summary> public ushort wSingleWordDMA; /// <summary> /// 多指令DMA模式。 /// </summary> public ushort wMultiWordDMA; /// <summary> /// 保留内容,不使用。 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] bReserved; } /// <summary> /// /// </summary> [StructLayout(LayoutKind.Sequential)] public struct RECT { /// <summary> /// /// </summary> /// <param name="left"></param> /// <param name="top"></param> /// <param name="right"></param> /// <param name="bottom"></param> public RECT(int left, int top, int right, int bottom) { this.left = left; this.top = top; this.right = right; this.bottom = bottom; } /// <summary> /// /// </summary> /// <param name="r"></param> public RECT(Rectangle r) { left = r.Left; top = r.Top; right = r.Right; bottom = r.Bottom; } /// <summary> /// /// </summary> public int left; /// <summary> /// /// </summary> public int top; /// <summary> /// /// </summary> public int right; /// <summary> /// /// </summary> public int bottom; /// <summary> /// /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="width"></param> /// <param name="height"></param> /// <returns></returns> public static RECT FromXYWH(int x, int y, int width, int height) { return new RECT(x, y, x + width, y + height); } /// <summary> /// /// </summary> public Size Size { get { return new Size(right - left, bottom - top); } } } /// <summary> /// /// </summary> [StructLayout(LayoutKind.Sequential)] public sealed class SCROLLINFO { public SCROLLINFO() { this.cbSize = Marshal.SizeOf(typeof(SCROLLINFO)); } public SCROLLINFO(int mask, int min, int max, int page, int pos) { this.cbSize = Marshal.SizeOf(typeof(SCROLLINFO)); this.fMask = mask; this.nMin = min; this.nMax = max; this.nPage = page; this.nPos = pos; } public int cbSize; public int fMask; public int nMin; public int nMax; public int nPage; public int nPos; public int nTrackPos; } #endregion #region 常量 /// <summary> /// Win32 API 常数,指示在使用 <see cref="RemoveMenu"/> 函数时指定使用索引数而不是使用ID。 /// </summary> private const int MF_BYPOSITION = 0x00000400; private const uint FILE_SHARE_READ = 0x00000001; private const uint FILE_SHARE_WRITE = 0x00000002; private const uint FILE_SHARE_DELETE = 0x00000004; private const uint SMART_GET_VERSION = 0x00074080; // SMART_GET_VERSION private const uint SMART_SEND_DRIVE_COMMAND = 0x0007c084; // SMART_SEND_DRIVE_COMMAND private const uint SMART_RCV_DRIVE_DATA = 0x0007c088; // SMART_RCV_DRIVE_DATA private const uint GENERIC_READ = 0x80000000; private const uint GENERIC_WRITE = 0x40000000; private const uint CREATE_NEW = 1; private const uint OPEN_EXISTING = 3; private const uint BUFFER_SIZE = 512; private static readonly Platform currentOs; #endregion } }
64位系统硬盘序列号获取软件
靖源磁盘管理单元测试(电脑硬盘序列号读取工具)是一款非常实用的硬盘序列号获取软件。比较强大,帮助我们轻松获取电脑中的硬盘序列号,以满足你的各种使用要求,欢迎有需要的朋友前来下载。 软件说明理论上讲,硬盘出厂序列号在全球都是唯一的,jyDisk.DLL 是一个标准的Windows动态链接库,它能够让您在你的程序中简单地获取硬盘出厂序列号。 jyDisk.DLL可以应用于各种流行的开发语言,比如delphi, C++Builder, C#, Visual C++, Visual Basic, Visual Basic.NET, PowerBuilder等,示例为delphi7调用代码. 靖源磁盘管理单元测试(电脑硬盘序列号读取工具) 相关特性1.支持windows2000,xp及以上系统,支持64位操作系统,支持U盘/移动硬盘,不支持win98及以下操作系统。 2.仅需1个dll文件。 3.在win7/win8/win10等系统下,无需管理员权限(移动硬盘要获取真正的硬盘号,需要管理员权限)。 4.支持根据盘符获取硬盘的物理序号,支持获取磁盘类型。 5.支持smart信息获
命令行查看硬盘序列号
1.按Win+R打开运行,输入cmd,回车:     2.在命令提示符中输入diskpart,点击回车来启动diskpart程序,通过这个程序来查看硬盘序列号:     3.接着输入并执行list disk, 也就是把电脑上的所有硬盘都罗列出来,图中只有一个硬盘,只显示磁盘0:    4.输入并执行select disk 0, 选择磁盘:    5.选好要查看的硬盘后,输入
VB6读取硬盘物理序列号/逻辑序列号/CPU序列号/主板序列号
VB6编写的,读取硬盘物理序列号/逻辑序列号/CPU序列号/主板序列号 一个界面,集成了上述序列号的读取,源代码均来自于网上,我集成在一起,调试通过.
如何读取电脑CPU序列号、主板BIOS、硬盘的序列号
如何读取电脑CPU序列号、主板BIOS、硬盘的序列号 (2010-09-11 09:01:41) 转载▼ 标签: 序列号 硬盘控制器 c语言 读取 进行 it 分类:IT 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=2740166 关注 -------------
用JAVA获取硬盘序列号的方法
希捷(Seagate)迈拓(Maxtor)西部数据(Western Digital)三星(SAMSUNG) 日立(HITACHI)等硬盘都有自己规定方式编号的硬盘序列号,所谓序列号就是硬盘编号。硬盘序列号是硬盘格式化时系统分配给硬盘的一组十六进制字符串,除分对硬盘重新进行格式化,硬盘序列号是不会改变的。所以,很多软件都会以硬盘序列号判断用户是否合法用户。  C#,C++等语言获取硬盘序列号方
关闭