#include "stdafx.h"
#include <WinIOCtl.h>#ifdef _DEBUG
#define new DEBUG_NEW
#endif// 唯一的应用程序对象CWinApp theApp;using namespace std;#define PHYSICAL_DRIVE_NUMBER 0#define  DFP_GET_VERSION          0x00074080
#define  DFP_RECEIVE_DRIVE_DATA   0x0007c088//  Valid values for the bCommandReg member of IDEREGS.
#define  IDE_ATAPI_IDENTIFY  0xA1  //  Returns ID sector for ATAPI.
#define  IDE_ATA_IDENTIFY    0xEC  //  Returns ID sector for ATA.typedef struct _GETVERSIONOUTPARAMS
{BYTE bVersion;      // Binary driver version.BYTE bRevision;     // Binary driver revision.BYTE bReserved;     // Not used.BYTE bIDEDeviceMap; // Bit map of IDE devices.DWORD fCapabilities; // Bit mask of driver capabilities.DWORD dwReserved[4]; // For future use.
} GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS;int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{int nRetCode = 0;// 初始化 MFC 并在失败时显示错误if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)){// TODO: 更改错误代码以符合您的需要_tprintf(_T("错误: MFC 初始化失败\n"));nRetCode = 1;}else{// TODO: 在此处为应用程序的行为编写代码。//  GETVERSIONOUTPARAMS contains the data returned from the //  Get Driver Version function.CString csPhysical;csPhysical.Format(_T("\\\\.\\PhysicalDrive%d"), PHYSICAL_DRIVE_NUMBER);HANDLE hPhysical = ::CreateFile(csPhysical,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING, 0, NULL);if (hPhysical != INVALID_HANDLE_VALUE){//第一种方法GETVERSIONOUTPARAMS VersionParams;DWORD dwRet = sizeof(VersionParams);if (::DeviceIoControl(hPhysical,DFP_GET_VERSION,NULL, 0,&VersionParams, sizeof(VersionParams),&dwRet, NULL)){if (VersionParams.bIDEDeviceMap > 0){BYTE bIDCmd = 0; // IDE or ATAPI IDENTIFY cmdSENDCMDINPARAMS scip;BYTE IdOutCmd[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];// Now, get the ID sector for all IDE devices in the system.// If the device is ATAPI use the IDE_ATAPI_IDENTIFY command,// otherwise use the IDE_ATA_IDENTIFY commandbIDCmd = (VersionParams.bIDEDeviceMap >> PHYSICAL_DRIVE_NUMBER & 0x10) ? \IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;memset(IdOutCmd, 0, sizeof(IdOutCmd));memset(&scip, 0, sizeof(scip));scip.cBufferSize = IDENTIFY_BUFFER_SIZE;scip.irDriveRegs.bFeaturesReg = 0;scip.irDriveRegs.bSectorCountReg = 1;scip.irDriveRegs.bSectorNumberReg = 1;scip.irDriveRegs.bCylLowReg = 0;scip.irDriveRegs.bCylHighReg = 0;// Compute the drive number.scip.irDriveRegs.bDriveHeadReg = 0xA0 | ((PHYSICAL_DRIVE_NUMBER & 1) << 4);// The command can either be IDE identify or ATAPI identify.scip.irDriveRegs.bCommandReg = bIDCmd;scip.bDriveNumber = PHYSICAL_DRIVE_NUMBER;scip.cBufferSize = IDENTIFY_BUFFER_SIZE;if (DeviceIoControl(hPhysical,DFP_RECEIVE_DRIVE_DATA,&scip,sizeof(SENDCMDINPARAMS) - 1,IdOutCmd,sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1,&dwRet, NULL)){printf("Serial Number = ");for (DWORD i = 0; i < 20; i += 2){putchar(((PSENDCMDOUTPARAMS)IdOutCmd)->bBuffer[i + 10 * sizeof(TCHAR) + 1]);putchar(((PSENDCMDOUTPARAMS)IdOutCmd)->bBuffer[i + 10 * sizeof(TCHAR)]);}putchar('\n');}else{printf("DeviceIoControl DFP_RECEIVE_DRIVE_DATA Fail, Error Code: %d\n", ::GetLastError());}}}else{printf("DeviceIoControl DFP_GET_VERSION Fail, Error Code: %d\n", ::GetLastError());}//第二种方法BYTE pBuffer[8192] = { 0 };STORAGE_PROPERTY_QUERY spq;memset(&spq, 0, sizeof(STORAGE_PROPERTY_QUERY));spq.PropertyId = StorageDeviceProperty;spq.QueryType = PropertyStandardQuery;if (::DeviceIoControl(hPhysical,IOCTL_STORAGE_QUERY_PROPERTY,&spq, sizeof(STORAGE_PROPERTY_QUERY),pBuffer, sizeof(pBuffer),&dwRet, NULL)){DWORD dwStart = ((PSTORAGE_DEVICE_DESCRIPTOR)pBuffer)->SerialNumberOffset;printf("Serial Number = ");while (TRUE){CHAR cSN = (CHAR)pBuffer[dwStart++];if (cSN == '\0') break;putchar(cSN);}putchar('\n');}else{printf("DeviceIoControl IOCTL_STORAGE_QUERY_PROPERTY Fail, Error Code: %d\n", ::GetLastError());}::CloseHandle(hPhysical);}system("pause");}return nRetCode;
}

这个是用DeviceIoControl函数获取的,第一种方法测试过十几个硬盘都可以成功获取,但是第二种方法只有一两个硬盘测试成功。。。

[C]获取硬盘序列号相关推荐

  1. 用C#获取硬盘序列号,CPU序列号,网卡MAC地址

    这个问题首先得考虑的就是你的硬盘是不是SCSI硬盘 如果是,那么根本不存在"物理序列号",只可能取得卷标的序列号 如果是卷标序列号,要注意的是每次格式化硬盘的时候这个序列号都会变 ...

  2. VC6获取硬盘序列号、型号、修订版本号

    因为要做个读取硬盘参数信息的控件,所以在网上找了不少代码,但是自己作为一个初学者在使用别人代码时,总会发现有各种各样的问题: 1. 需要的头文件未写明 2. 有些定义未给出 3. 代码的开发环境未明, ...

  3. 使用java获取硬盘序列号

    使用java获取硬盘序列号 使用java获取硬盘的序列号呢,涉及了跨平台的问题,不同的操作系统的查看命令不一样,可以使用oshi获取. oshi(Native Operating System and ...

  4. MFC 获取硬盘序列号、IP地址、MAC地址

    1)获取本地硬盘序列号 调出cmd 输入wmic diskdrive get serialnumber 或 wmic diskdrive get Name, Manufacturer, Model, ...

  5. 转另一个获取硬盘序列号的方法

    原谅转自:http://blog.sina.com.cn/s/blog_57dff12f0100d5so.html #define  DFP_GET_VERSION                   ...

  6. java获取硬盘序列号_Win7 64+Python3.7获取计算机硬盘信息初探

    一.需求 由于最近负责电脑资产清查的工作,有100多台分散的电脑需要获得用户名.MAC地址.硬盘序列号.硬盘品牌 一般方法: (1)查看系统用户名 (2) 获取MAC地址 windos命令行使用ipc ...

  7. 获取硬盘序列号的真正方法!!

    最近要获取磁盘的序列号,在网上找了很久发现大部分都是通过diskpart来查询 这种查询方法只是查询的磁盘的id 真正查询磁盘序列号应该使用下面方法:wmic diskdrive get serial ...

  8. .NET获取硬盘序列号的几个方法

    最近作软件注册,收集了很多.NET相关的获取硬盘物理序列号的方法,主要分为使用WMI方式和API方式.但这些方法均可能有问题. 1,使用WMI方式,有的机器根本取不到硬盘序列号,有的方式在Vista下 ...

  9. 获取硬盘序列号、CPU序列号

    public class SerialUtils {private static Properties props = System.getProperties();private static St ...

  10. 驱动下如何获取硬盘序列号

    最近公司有个项目,需要在驱动模式及用户模式下,获取硬盘的序列号,在网上找了半天,大多是用户模式的代码,而且许多已经过时,于是参照了一下,改写成内核模式下的代码,本人是驱动的菜鸟,希望此代码能对那些和我 ...

最新文章

  1. pcb 理论阻值、 过孔_超实用!PCB设计中过孔常用的6种处理方式
  2. jzoj100029. 【NOIP2017提高A组模拟7.8】陪审团(贪心,排序)
  3. redis设置键的生存时间或过期时间
  4. 1005:I Think I Need a Houseboat-poj
  5. Linux 内核设备属性
  6. Android开发笔记(九十七)图片的特效处理
  7. Multimedia Studio 系统要求
  8. IOS开发之第三方登陆——友盟
  9. Matlab imnoise函数的说明
  10. OSG 读取OSGB倾斜数据
  11. led屏背后线路安装图解_弱电工程LED屏安装工程施工方案
  12. STRING网站分析蛋白质相互作用
  13. Yate架构分析概要
  14. Chrome有些网站打不开,但是其他浏览器可以打开,Chrome无痕模式有事也可以打开。解决思路。
  15. 学学习笔记:利用TCGA Assembler工具下载及处理数据
  16. CVE-2021-44228 Log4j 远程代码执行漏洞——原理
  17. canvas 的绘图模式 retained-mode(保存模式) 和 immediate-mode (立即模式)
  18. bryntum Kanban Task Board 5.1.0 JS 看板
  19. 数据分析师 2020-8-09笔试题目 有感
  20. 达沃时代的VNAS为NAS使用提供一种新可能

热门文章

  1. Django模型信号——django.db.models.signals
  2. 报告:健康老龄化是中国应对人口老龄化的必由之路
  3. HDFS FoldedTreeSet的引入以及FBR优化处理
  4. 12_Go语言 反射详解
  5. 计算机键盘和鼠标的品牌与价格,完美:不同品牌和型号的无线键盘和鼠标配对_计算机硬件和网络_IT /计算机_数据...
  6. Opencv 寻找图像最大轮廓
  7. 浙大远程教育计算机作业2,2016浙大远程教育计算机应用基础作业-2.docx
  8. 主站外置的终端服务器,故障分析与处理方法
  9. SuperMap iClient for Leaflet对EPSG:4509图加载滑动查询
  10. 保护linux 文件系统,技术|使用 Tripwire 保护 Linux 文件系统