[C]获取硬盘序列号

news/2023/11/29 7:38:38
#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函数获取的,第一种方法测试过十几个硬盘都可以成功获取,但是第二种方法只有一两个硬盘测试成功。。。


http://www.ppmy.cn/news/635508.html

相关文章

crack常见技巧--序列号篇

一、Memory Echo (作者Cruehead) 这是发现序列号普通方法&#xff0c;在内存里会有一地方存放我们输入的序列号&#xff0c;还有一处是正确的序列号&#xff08;经常是用我们的姓名计算出来的&#xff09;。我们破解的很多程序都是这种保护方式&#xff0c;如果发现如下的代码…

PKCS8密钥格式

PKCS #8: Private-Key Information Syntax Standard 所以PKCS #8 跟公钥没啥关系&#xff0c;公钥格式定义可参考相关文档。 以下使用RSA 512 1.生成密钥对 openssl genrsa -out rsa_pem.key 512 2.DER 格式 openssl rsa -in rsa_pem.key -out rsa_der.key -outform DER …

【C/C++】获取计算机CPUID序列号

1、GetGPUId.h文件 #pragma once#include <windows.h> #include <stdio.h> #include <string>class CGetCPUId { public:CGetCPUId();virtual ~CGetCPUId();public:std::string GetId();}; 2、GetCPUId.cpp文件 #include "stdafx.h" #include …

Keytool或Keystore使用及证书转换

本文主旨在将keytool的使用还有keystore证书的转换 想了解证书的基础知识点击&#xff1a;证书的基础知识 想了解openssl的使用及证书转换点击&#xff1a;OpenSSl使用及证书转换 1.1证书生成 //创建新的密钥对到密钥库中&#xff0c;回车后需要创建密钥库密码&#xff0c;以…

一段 CryptAPI 取得 证书序列号 的代码

CryptAPI 取得 证书序列号 的操作 cheungmine 通过Win32 CryptAPI查找个人证书库&#xff08;MY&#xff09;中的指定的证书的序列号。显示之。证书的序列号经过处理&#xff0c;和IE中显示的一样&#xff08;只是人为地去掉了空格&#xff09;。 // 去除指定字符// 下面的代码…

cdkey和激活码的生成

在很多产品中都有cdkey或者激活码需求&#xff0c;这就牵扯到cdkey的生成。cdkey(或激活码&#xff0c;后面已cdkey代替)一般都是由固定长度的一串数字和字母组成&#xff0c;生成的方法有很多&#xff0c;好比最简单的一种就是在26个字母和10个数字中随机抽取一个&#xff0c;…

vs 序列号密钥

附上各种版本的序列号 2003序列号: D64GG&#xff0d;GXY6T&#xff0d;V6FTR&#xff0d;WCPBB&#xff0d;2YDYB T7KXG&#xff0d;78HXC&#xff0d;JYRF8&#xff0d;72VH2&#xff0d;6DM7M 2005序列号&#xff1a; KGR3T-F2C26-RRTGT-D6DQT-QBBB3 2008序列号&#xff1…

磁盘序列号,磁盘ID,卷序列号的区别

1. 磁盘序列号 这个东西可以硬盘标签上看到&#xff0c;可查找SN字样&#xff0c;为厂家确定&#xff0c;类似mac地址&#xff0c;属于唯一属性&#xff0c;与OS无关&#xff0c;即使格式化硬盘也不会改变。 windows查看命令&#xff1a;wmic diskdrive get serialnumber 2…

VS2008序列号CDKEY:PYHYP-WXB3B-B2CCM-V9DX9-VDY8T

VS2008正式版序列号CDKEY&#xff1a;PYHYP-WXB3B-B2CCM-V9DX9-VDY8T

C# 序列号

序号自动生成 //序号自动生成 /// <summary> /// 说明&#xff1a;序号自动生成。 /// </summary> private void gridView1_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e) {if (e.Info.IsRowIndic…

CryptAPI 取得 证书序列号 的操作

CryptAPI 取得 证书序列号 的操作 通过Win32 CryptAPI查找个人证书库&#xff08;MY&#xff09;中的指定的证书的序列号。显示之。证书的序列号经过处理&#xff0c;和IE中显示的一样&#xff08;只是人为地去掉了空格&#xff09;。 #include <comutil.h> #pragma comm…

SourceInsight3.5序列号

如题&#xff1a; SI3US-205035-36448SI3US-466908-65897 SI3US-368932-59383SI3US-065458-30661SI3US-759512-70207

Credly 数字证书

Credly 数字证书 Credly 简介 通过 Credly 颁发的徽章是对学习成果、经验或能力的数字表述。Credly 数字证书包括常见的组织徽章&#xff0c;如&#xff1a;AWS, Adobe, Autodesk, Certiport, Microsoft, CISCO, IBM 等等&#xff0c;以一种简单和安全的方式在线分享和验证&a…

C# 获取电脑序列号和主板序列号

项目中有需求要从软件中获取当前电脑的整机序列号和主板序列号&#xff0c;研究一番&#xff0c;C#的实现如下&#xff1a; using System.Management;//整机序列号 public static string getDeviceSN() {//获取整机列号string sn "";ManagementClass mc new Manag…

Vue内置指令学习

1. v-bind&#xff1a; 用于绑定数据到HTML元素的属性上。常见应用包括&#xff1a; 动态绑定图片的src属性&#xff1a; <img v-bind:src"imageSrc">动态绑定CSS类名&#xff1a; <div v-bind:class"{ active: isActive }"></div>动…

企业部署MES管理系统需要配置专业团队吗

随着数字化转型的推进&#xff0c;越来越多的企业开始考虑部署MES生产管理系统来提高生产效率和管理水平。在部署制造企业MES系统时&#xff0c;是否需要配置专业团队是一个关键问题。本文将探讨企业部署MES管理系统所需的专业团队的重要性&#xff0c;并提供一些建议。 全球制…

火遍全球家喻户晓的小游戏——开心消消乐

《开心消消乐》是由乐元素公司自主研发的一款消除类休闲游戏。 2013年8月上线PC版&#xff0c;登陆Q-zone及QQ游戏大厅。2014年初&#xff0c;《开心消消乐》iOS版及Android版分别上线&#xff0c;并多次被苹果Feature&#xff0c;成为风靡大街小巷的国民游戏。 《开心消消乐…

Java实战:仿QQ游戏大厅五子棋

本篇主要讲本科时学习Java时写的一个小游戏。五子棋对于锻炼Java初级编程很有帮助。 素材搜集与设计 棋盘 五子棋的游戏算法就不说了&#xff0c;当时写的比较一般。这里讲一讲游戏设计吧。首先是棋盘&#xff0c;我花了一早上用PPT画了个棋盘&#xff0c;主要是不会PS啊。效…

计算机组成原理(期末或考研备考)-计算机性能指标(字长,主存容量,吞吐量,主频和时钟周期)

字长&#xff1a;字长是指计算机进行一次整数运算所能处理的二进制数据的位数&#xff0c;通常与CPU寄存器大小相同&#xff0c;因为数据进入到CPU之前会放入寄存器中。 主存大小&#xff1a;通常使用字数字长&#xff0c;例如512K*16位就表示共有512K个存储单元&#xff0c;每…

OpenStack(T版)——网络(Neutron)服务介绍与安装

文章目录 OpenStack(T版)——网络(Neutron)服务介绍与安装安装和配置(controller)准备(1)创建数据库(2)加载admin user的环境变量(3)创建服务凭证 配置Neutron网络服务组件(1)安装软件(2)配置服务器组件(3)配置Layer 2 (ML2)plug-in模块(4)配置桥接代理(5)配置内核(6)配置DHCP代…
最新文章