C++代码获取硬盘编号失败

使用DeviceIoControl 获取硬盘编号的时候,对有的硬盘不可行,返回空。搜集了网上大部分都是使用这个方法来获取硬盘属性。是不是还有其他方法可以获取啊

c++

1个回答

if (0 == GetLogicalDriveStrings(MAX_PATH, Drive))//获得本地所有盘符存在Drive数组中  
{
    return TR_FAIL_LOGICAL_DRIVE_DETECTION;
}

CString myDrive;
int i = 0;
char freeSpace[16] = { 0 };
while (Drive[i - 1] != '\0' || Drive[i] != '\0')//搜索数组尝试得到盘符信息,如果两者皆否,则数组搜索到尽头  
{
//todo 你要做的事情
}

仅供参考,欢迎提问
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C#获取CPU序列号代码、硬盘ID、网卡硬件地址等类文件
using System; using System.Management; namespace GetIDs { /// /// 计算机信息类 /// internal class Computer { public string CpuID; public string MacAddress
C++读取硬盘序列号
有时在将程序或者打包库提供给第三方时,为了防止传播泛滥,或者有一定的版权问题,需要绑定特定的计算机设备。此时就需要读取计算机的一些硬件资源(硬盘、CPU、BIOS等),来计算一个验证码,达到一机一码的目的。 软件查看硬盘序列号借助DiskGenius查看硬盘序列号,选中硬盘,即可看到在下方有序列号。不过貌似SSD和机械硬盘的序列号格式是不一样的 SSD: 12位序列号 机械硬盘: 8位序
获取硬盘序列号、获取CPU编号、获取BIOS编号的原始代码
获取硬盘序列号、获取CPU编号、获取BIOS编号的原始代码
C#获取硬盘、CPU、主板、网卡的序列号
转自:http://blog.sina.com.cn/s/blog_557d25460101hq9t.html 在很多情况下,你可能都需要得到微机的硬件信息。比如:你想给你的软件加锁,不让别人随便访问。 首先,你必须知道这个应用程序的功能是使用System.Management这个类得到的。因此,你需要加上下面的这句话: using System.Management
获取硬盘相应序列号
using System;using Microsoft.Win32;using System.Globalization;using System.Runtime;using System.Runtime.InteropServices;using System.Text;using System.IO;  namespace HKH.Common{ ///  /// Summary descr
MFC获取电脑硬盘序列号(附源码)
在新建的工程里面添加一个类 即:以下一个类 GetHDSerial.cpp// GetHDSerial.cpp: implementation of the CGetHDSerial class. // Download by http://www.newxing.com/ /////////////////////////////////////////////////////////////
linux c 获取硬盘序列号
#include <stdio.h> #include <sys ioctl.h=""> #include <linux hdreg.h=""> #include <sys stat.h=""> #include <fcntl.h> static int getdiskid (char *hardc) { int fd; struct hd_driveid hid; fd =
C# 获取硬盘编号CPU编号网卡MAC
C# 获取硬盘编号 CPU编号 网卡地址MAC C# 获取硬盘编号 CPU编号 网卡地址MAC
C++获取CPU序列号和C盘卷标号
主要用到两个类win32_Processor、win32_logicaldisk在MSDN中可以查看到用法和示例,这里是根据示例修改的。 #define _WIN32_DCOM #include using namespace std; #include #include # pragma comment(lib, "wbemuuid.lib") int main(int ar
Windows c 获取cpu ,网卡,硬盘序列号,win10可用
已经封装成动态库形式,方便使用! //标准C DLL导出格式 #ifndef _GETHARDINFO_H_ #define _GETHARDINFO_H_ #ifdef MYAPI_EXPORTS #define WIN32DLL_API __declspec(dllexport) #else #define WIN32DLL_API __declspec(dllimport)
C#获取机器码
C#代码教你如何获取硬件机器码,如硬盘编号、网卡编号==
qt5.5 获取硬盘编号
qt5.5 获取硬盘编号。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
hardware工具获取硬件信息
获取主板编号,cpu编号,mac地址,硬盘编号
linux c 获取硬盘的序列号
获取硬盘序列号的方法 找到指定硬盘的设备文件(如果是根目录的话,可以通过读取 /etc/mtab 文件获取),打开对应的设备文件。然后使用系统调用ioctl。 在这里 ioctl 的第二个参数为 HDIO_GET_IDENTITY (获得指定文件描述符的标志号) 第三个参数为 struct hd_driveid ,在 linux/hdreg.h 中。 struct hd_driveid 结构
获取linux下CPU、网卡、硬盘ID
获取linux下CPU、网卡、硬盘ID#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <sys/types.h> #include <fcntl.h> #include <sys/socket.h> #include <ar
编程方式读取硬盘信息 - MBR以及各个分区信息
MBR结构,在数据库恢复中,若要手工填写分区表的话,只注意四个重要的地方,其它的可随便填。 MBR结构,在数据库恢复中,若要手工填写分区表的话,只注意四个重要的地方,其它的可随便填。
C++读取硬盘的序列号
#include #include #include #define DFP_GET_VERSION 0x00074080#define DFP_SEND_DRIVE_COMMAND 0x0007c084#define DFP_RECEIVE_DRIVE_DATA 0x0007c088#pragma pack(1) void ChangeByteOrder(PCHAR szString,
C#获取硬件标志.cs
使用C#代码取得 取机器名 取CPU编号 获取硬盘序列号 获取MAC和ID
如何得到唯一的硬盘序号
不正确的序列号 利用GetVolumelnformation获取的计算机硬盘卷序列号,不是正确的唯一序列号: 01.void CWJGISApp::Register() 02.{ 03.    DWORD VolumeSerialNumber; 04.    GetVolumeInformation("c:\\",NULL,NULL,&VolumeSeriaIN
java获取硬盘ID以及MAC地址
为了达到软件注册,或者说软件和电脑绑定的目的,需要将电脑上的固定编号进行一系列的算法计算,并生成唯一和软件匹配的号码。   那么使用java如何达到这个目的呢?   通常做法都是通过java的Runtime来完成,通过 process的输入流,进行获取相关的信息。
VC写的获取硬盘物理序列号
用VC 写的MFC程序 读出硬盘物理序列号并写入到生成txt文件
C++读取CPU序列号
C++读取CPU序列号
WD西部数据内置硬盘编号说明书
西数官方文档库:http://www.wdc.com/en/library/ 内部硬盘 主要参考西部数据文档            2579-001028      (Model Number Format for WD Internal Drive Products)。 命名规则如下: WD 0000 A B C D - 00 EE FF 1 2 3 4 5 6
读取USB HDD(USB移动硬盘信息)序列号的代码
读取USB HDD(USB移动硬盘)序列号的代码,型号及分位。 使用Visual Studio 2010编译成功。 代码使用了CrystalDiskInfo中的代码smartata.c中相关代码: 如下的连接解释了为何使用scsi的相关代码,需要USB IC的数据转换。 http://blog.csdn.net/waityoualife/article/details/5656589
C#获取硬盘编号、CPU编号及类型、内存大小及使用情况
C#获取硬盘编号、CPU编号及类型、内存大小及使用情况
c语言获取 CPU序列号(CPUID) 硬盘序列号 (vs2010工程)支持64位编译
获取CPU序列号 硬盘序列号 vs2010工程 支持64位
linux下怎样查看硬盘型号和硬盘序列号
首先 sudo fdisk -l 查看自己的硬盘有哪些,之后sduo hdparm -i /dev/sda(我的硬盘是sda) 就可以看到参数了
Diskhook(模拟硬盘序列号)
Diskhook(模拟硬盘序列号)
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
VC++6.0实现读取硬盘唯一序列号源码和可执行程序
VC++6.0实现读取硬盘唯一序列号源码和可执行程序,可用于软件加密,产生序列号和注册码,保护您的产品安全!
获得硬盘型号以及序列号
VC编写的DLL,可以获得硬盘的型号、序列号以及计算机 ID, 带Delphi的源程序,在Win2K下通过,但是没有在Win9X下试过, 感兴趣的朋友可以在Win9X 下试一下,或者编写一个VB的范例。 函数以及定义: function ReadPhysicalDrive(driveID:integer;buffer:Pointer;bufLen:integer):integer; stdcall; external DiskID.dll name ReadPhysicalDriveInNT ; 获得WinNT下的硬盘型号以及序列号。参数driveID为硬盘的位置, IDE1上的主盘为0,类推到IDE2上的从盘的driveID为3。 function ReadPhysicalDrive9X (driveID:integer;buffer:Pointer;bufLen:integer):integer; stdcall; external DiskID.dll name ReadDrivePortsInWin9X ; 获得Win9X下的硬盘型号以及序列号。参数同上 function getHardDriveComputerID:int64; stdcall; external DiskID.dll name getHardDriveComputerID ; 获得计算机的ID
Qt 获取 MacBook 设备序列号
前言用 Qt 获取 Mac 电脑序列号有两种方式,一种是在 Qt 中调用 Mac 原生接口 object-c 代码去获取,一种是在 Qt 中使用QProcess执行终端命令获取,然后读取终端返回的数据,这种方式最简单,只需要几行代码即可,这里主要介绍这种简单的方式.正文来看代码QString getMacDeviceSeries() { QString ret = ""; QProc
delphi获取硬盘物理号,CUP序列号
可以获取硬盘的物理地址编号,CPU序列号
asp.net中获取本机的相关信息!(CPU、内存、硬盘序列号等)
// 注意:首先要在项目bin目录中添加引用 System.Management using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Management; /// ///Computer 的摘要说明 /// public
获取硬盘序列号,搞了半天,看来不行了
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 } }
linux下c语言获取硬盘序列号及mac
可以用它标识机器唯一信息。本想用机器主板序列号,可惜不会啊。
javascript提取硬盘序列号+其它硬件信息
给政府做的,完全要求高,居然用硬盘序列号,MAC地址,CPU地址三项来绑定指定的人来操作。看了看别的资料有提取CPU,MAC的现成代码却没有硬盘序列号,找了好久才找到提取硬盘序列号的参数。于是自己给补上了。提取硬盘序列号function disk() {//硬盘序列号 信息   var locator = new ActiveXObject ("WbemScripting.SWbemL
获取电脑主板和硬盘物理序列号VC代码
获取电脑主板和硬盘物理序列号VC代码,调用其中get.dll取得
VB6.0获取硬盘序列号的代码
VB获取硬盘序列号的代码VB获取硬盘序列号的代码VB获取硬盘序列号的代码VB获取硬盘序列号的代码
Python 获取磁盘信息的脚本及常用文件操作等
#!/usr/bin/env python import subprocess#Command 1 def uname_func(): uname="uname" uname_arg="-a" print "Gathering system information with %s command:\n" % uname subprocess.call([uname,u
C#取硬盘、CPU、主板、网卡的序号
首先,你必须知道这个应用程序的功能是使用System.Management这个类得到的。因此,你需要加上下面的这句话: using System.Management; 之后在项目里添加引用System.Managemen 读取硬盘 List deviceIDs = new List(); ManagementObjectSearcher query = ne
获取硬盘物理序列号、型号等参数
该软件主要为一动态链结库文件: DiskSerial.DLL,它能获取物理硬盘的型号(Model Number)、物理序列号(Serial Number)、修订号(Revision Number)、缓存容量(Buffer Size)、柱面数(Cylinders)、磁头数(Heads)、每磁道的扇区数(Sectors per track)。&lt;;br&gt;; 在WINDOWS NT 4.0和WINDOWS 2000操作环境下能获取IDE硬盘和SCSI硬盘的以上参数;在WINDOWS 9X和WINDOWS ME操作环境下能获取IDE硬盘的以上参数。&lt;;br&gt;; 本库文件供VC、BCB、VB、VFP、PB和DEPHI开发人员使用,其它开发环境下未经测试,欢迎大家测试。在以上开发环境下分别提供以下文件:&lt;;br&gt;; DiskSerial.H,DiskSerial.Lib 两个文件提供给C/C++ 程序员调用;&lt;;br&gt;; DiskSerial.pas 文件提供给Dephi程序员调用;&lt;;br&gt;; DiskSerial.bas 文件提供给VB程序员调用。&lt;;br&gt;; 调用格式请进入以下链接获取例子程序(http://vip.6to23.com/songdai/)。若在使用过程中发现任何问题或有新的想法请及时与我联系。&lt;;br&gt;; 以上参数都是硬盘生产厂商所提供,不会随硬盘的分区、格式化而变化。&lt;;br&gt;; 注册用户将获得免费升级及更新 E-MAIL 通知。&lt;;br&gt;; E-Mail:songdai@163.net
labview读取硬盘序列号,不是分区号
labview读取硬盘序列号,做软件加密很有用哦。
C++ 硬件信息 获取CPU序列号
获取计算机CPU序列号的方法很多,这里采用的是命令行的形式获取,可以获取CPU的序列号,很简单,直接上代码。 【1】头文件 #if !defined(AFX_14BEC153_17B9_47BE_845F_71A27BF26B59__INCLUDED_) #define AFX_14BEC153_17B9_47BE_845F_71A27BF26B59__INCLUDED
WNDOWS编程获取系统磁盘序号及硬件ID
编程中经常需要排除系统磁盘,如何实现?以下是一些基本概念。 1. 磁盘序号:在磁盘管理页面显示的磁盘0/1/2等,0、1、2即磁盘序号。 2. 磁盘硬件ID:设备管理器页面某设备右键->详细信息->硬件ID。 获取步骤: 1. 通过GetSystemDirectory)获取系统路径。         2. 通过DeviceIOControl获取磁盘序号。 3. 查看注册表HKEY_
读取电脑CPU序列号、主板BIOS、硬盘的序列号
  CSDN - 专家门诊 - 主  题: 如何读取电脑CPU序列号、主板BIOS、硬盘的序列号 作  者: thb (thb) 信 誉 值: 93 所属论坛: VC/MFC 硬件/系统 问题点数: 100 回复次数: 8 发表时间: 2004-2-16 16:57:43 如题 回复人: limj(阿满
java 获取CPU 和 硬盘序列号的方法
各种获取CPU序列号 和 硬盘序列号的方法
编程方式获取计算机主板序列号等的实验
代码获取计算机硬件信息,代码如下 using System; using System.Collections.Generic; using System.Linq; using System.Text; using   System.Management;  usi
LabVIEW获取硬盘网卡CPU等序列号.
LabVIEW中获得CPU序列号、硬盘序列号、BIOS版本号、网卡物理地址
如何读取电脑CPU序列号、主板BIOS、硬盘的序列号
如何读取电脑CPU序列号、主板BIOS、硬盘的序列号 (2010-09-11 09:01:41) 转载▼ 标签: 序列号 硬盘控制器 c语言 读取 进行 it 分类:IT 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=2740166 关注 -------------
相关热词 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数 c#日期精确到分钟 c#自定义异常必须继承 c#查表并返回值 c# 动态 表达式树 c# 监控方法耗时 c# listbox c#chart显示滚动条
立即提问