VC 之获取硬盘序列号
1,第一步:创建设备对象,得到设备句柄,设备为硬盘。
{
CString sFilePath;
sFilePath.Format("\\\\.\\PHYSICALDRIVE%d", driver);
HANDLE hFile=::CreateFile(sFilePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
0, NULL);
DWORD dwBytesReturned;
GETVERSIONINPARAMS gvopVersionParams;
DeviceIoControl(hFile, //向设备对象发送SMART_GET_VERSION设备请求,获取硬盘属性
SMART_GET_VERSION,
NULL,
0,
&gvopVersionParams,
sizeof(gvopVersionParams),
&dwBytesReturned, NULL);
if(gvopVersionParams.bIDEDeviceMap <= 0) return -2;
2。第二步,发送SMART_RCV_DRIVE_DATA设备请求,获取硬盘详细信息。
// IDE or ATAPI IDENTIFY cmd
int btIDCmd = 0;
SENDCMDINPARAMS InParams;
int nDrive =0;
btIDCmd = (gvopVersionParams.bIDEDeviceMap >> nDrive & 0x10) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
// 输出参数
BYTE btIDOutCmd[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];
if(DoIdentify(hFile,
&InParams,
(PSENDCMDOUTPARAMS)btIDOutCmd,
(BYTE)btIDCmd,
(BYTE)nDrive, &dwBytesReturned) == FALSE) return -3;
::CloseHandle(hFile);
DWORD dwDiskData[256];
USHORT *pIDSector; // 对应结构IDSECTOR,见头文件
pIDSector = (USHORT*)((SENDCMDOUTPARAMS*)btIDOutCmd)->bBuffer;
for(int i=0; i < 256; i++) dwDiskData[i] = pIDSector[i];
// 取系列号
ZeroMemory(szSerialNumber, sizeof(szSerialNumber));
strcpy(szSerialNumber, ConvertToString(dwDiskData, 10, 19));
// 取模型号
ZeroMemory(szModelNumber, sizeof(szModelNumber));
strcpy(szModelNumber, ConvertToString(dwDiskData, 27, 46));
return 0;
}
BOOL __fastcall DoIdentify( HANDLE hPhysicalDriveIOCTL,
PSENDCMDINPARAMS pSCIP,
PSENDCMDOUTPARAMS pSCOP,
BYTE btIDCmd,
BYTE btDriveNum,
PDWORD pdwBytesReturned)
{
pSCIP->cBufferSize = IDENTIFY_BUFFER_SIZE;
pSCIP->irDriveRegs.bFeaturesReg = 0;
pSCIP->irDriveRegs.bSectorCountReg = 1;
pSCIP->irDriveRegs.bSectorNumberReg = 1;
pSCIP->irDriveRegs.bCylLowReg = 0;
pSCIP->irDriveRegs.bCylHighReg = 0;
pSCIP->irDriveRegs.bDriveHeadReg = (btDriveNum & 1) ? 0xB0 : 0xA0;
pSCIP->irDriveRegs.bCommandReg = btIDCmd;
pSCIP->bDriveNumber = btDriveNum;
pSCIP->cBufferSize = IDENTIFY_BUFFER_SIZE;
return DeviceIoControl( hPhysicalDriveIOCTL,
SMART_RCV_DRIVE_DATA,
(LPVOID)pSCIP,
sizeof(SENDCMDINPARAMS) - 1,
(LPVOID)pSCOP,
sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1,
pdwBytesReturned, NULL);
}
char *__fastcall ConvertToString(DWORD dwDiskData[256], int nFirstIndex, int nLastIndex)
{
static char szResBuf[1024];
char ss[256];
int nIndex = 0;
int nPosition = 0;
for(nIndex = nFirstIndex; nIndex <= nLastIndex; nIndex++)
{
ss[nPosition] = (char)(dwDiskData[nIndex] / 256);
nPosition++;
// Get low BYTE for 2nd character
ss[nPosition] = (char)(dwDiskData[nIndex] % 256);
nPosition++;
}
// End the string
ss[nPosition] = '\0';
int i, index=0;
for(i=0; i<nPosition; i++)
{
if(ss[i]==0 || ss[i]==32) continue;
szResBuf[index]=ss[i];
index++;
}
szResBuf[index]=0;
return szResBuf;
}
详细信息请搜索msdn。
上述代码在WinXP sp2平台测试通过。
VC 之获取硬盘序列号相关推荐
- 用C#获取硬盘序列号,CPU序列号,网卡MAC地址
这个问题首先得考虑的就是你的硬盘是不是SCSI硬盘 如果是,那么根本不存在"物理序列号",只可能取得卷标的序列号 如果是卷标序列号,要注意的是每次格式化硬盘的时候这个序列号都会变 ...
- VC6获取硬盘序列号、型号、修订版本号
因为要做个读取硬盘参数信息的控件,所以在网上找了不少代码,但是自己作为一个初学者在使用别人代码时,总会发现有各种各样的问题: 1. 需要的头文件未写明 2. 有些定义未给出 3. 代码的开发环境未明, ...
- 使用java获取硬盘序列号
使用java获取硬盘序列号 使用java获取硬盘的序列号呢,涉及了跨平台的问题,不同的操作系统的查看命令不一样,可以使用oshi获取. oshi(Native Operating System and ...
- MFC 获取硬盘序列号、IP地址、MAC地址
1)获取本地硬盘序列号 调出cmd 输入wmic diskdrive get serialnumber 或 wmic diskdrive get Name, Manufacturer, Model, ...
- 转另一个获取硬盘序列号的方法
原谅转自:http://blog.sina.com.cn/s/blog_57dff12f0100d5so.html #define DFP_GET_VERSION ...
- java获取硬盘序列号_Win7 64+Python3.7获取计算机硬盘信息初探
一.需求 由于最近负责电脑资产清查的工作,有100多台分散的电脑需要获得用户名.MAC地址.硬盘序列号.硬盘品牌 一般方法: (1)查看系统用户名 (2) 获取MAC地址 windos命令行使用ipc ...
- 获取硬盘序列号的真正方法!!
最近要获取磁盘的序列号,在网上找了很久发现大部分都是通过diskpart来查询 这种查询方法只是查询的磁盘的id 真正查询磁盘序列号应该使用下面方法:wmic diskdrive get serial ...
- .NET获取硬盘序列号的几个方法
最近作软件注册,收集了很多.NET相关的获取硬盘物理序列号的方法,主要分为使用WMI方式和API方式.但这些方法均可能有问题. 1,使用WMI方式,有的机器根本取不到硬盘序列号,有的方式在Vista下 ...
- 获取硬盘序列号、CPU序列号
public class SerialUtils {private static Properties props = System.getProperties();private static St ...
最新文章
- matlab数学实验课件4,数学实验4_数学实验_doc_大学课件预览_高等教育资讯网
- 【R】语言第二课----- 变量的使用方法
- mysql 的 distinct 去掉重复的数据
- 20190905:(leetcode习题)爬楼梯
- 【Hive】Hive的三种交互方式
- python征程3.1(列表,迭代,函数,dic,set,的简单应用)
- 智慧书-永恒的处世经典格言:121-160
- pcnn关系抽取论文阅读总结:尽量细节表现出来
- 杂谈(20210405)
- 孙德顺敛财10亿,看图挖掘计算如何穿透与识别多层嵌套影子公司!
- 马王堆汉墓帛书‧老子——甲本释文(德经)
- 【前端领域高频笔试面试】—— HTML+CSS相关
- 用计算机知道函数值求度数,怎么计算出余弦的度数
- 计算机无法启用媒体流,win10电脑媒体流启动不了怎么办_win10电脑媒体流无法启动解决方法-win7之家...
- asp html表单没有csrf保护,ASP.NET MVC 和网页中的 XSRF/CSRF 防护
- 2021年茶艺师(中级)考试试卷及茶艺师(中级)模拟考试题库
- 这项AR技术将你活生生地“解剖”给别人看
- 曰期计算器java,日期计算器
- 如何搭建一个Vue项目和配置环境
- 2022.5.29 第八次周报
热门文章
- 如何通过HBuilderX开发调试微信小程序
- 关于hadoop的环境配置出错问题org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
- 师兄教你和面试官扯淡
- 【VMware虚拟机 U盘启动】
- 性能工具之调试工具 GDB(你以为性能分析中用不到吗?)
- 函数指针和函数指针类型
- Win8 Beta试用小结
- 【Servlet】这一文详细的讲述了Servlet的知识,呕心沥血,终于文成。
- WSL2配置图形界面-MATE
- 2.别像〝弱智〞一样提问!