为什么我的c 获取硬盘序列号号的代码,在有些电脑

09:29 提问
关于linux获取硬盘序列号的一段代码?不太懂,求大神指教一下
static bool get_disk_name(std::string & disk_name)
disk_name.c_str();
std::ifstream ifs("/etc/mtab", std::ios::binary);
if (!ifs.is_open())
return(false);
char line[4096] = { 0 };
while (!ifs.eof())
ifs.getline(line, sizeof(line));
if (!ifs.good())
const char * disk =
while (isspace(disk[0]))
const char * space = strchr(disk, ' ');
if (NULL == space)
const char * mount = space + 1;
while (isspace(mount[0]))
if ('/' != mount[0] || ' ' != mount[1])
while (space & disk && isdigit(space[-1]))
if (space & disk)
std::string(disk, space).swap(disk_name);
ifs.close();
return(!disk_name.empty());
static void trim_serial(const void * serial, size_t serial_len, std::string & serial_no)
const char * serial_s = static_cast(serial);
const char * serial_e = serial_s + serial_
while (serial_s & serial_e)
if (isspace(serial_s[0]))
++serial_s;
else if ('\0' == serial_e[-1] || isspace(serial_e[-1]))
--serial_e;
if (serial_s & serial_e)
std::string(serial_s, serial_e).swap(serial_no);
static bool get_disk_serial_by_way_1(const std::string & disk_name, std::string & serial_no)
serial_no.clear();
int fd = open(disk_name.c_str(), O_RDONLY);
if (-1 == fd)
return(false);
struct hd_driveid drive = { 0 };
if (0 == ioctl(fd, HDIO_GET_IDENTITY, &drive))
trim_serial(drive.serial_no, sizeof(drive.serial_no), serial_no);
close(fd);
return(!serial_no.empty());
static bool scsi_io(
int fd, unsigned char * cdb,
unsigned char cdb_size, int xfer_dir,
unsigned char * data, unsigned int data_size,
unsigned char * sense, unsigned int sense_len
sg_io_hdr_t io_hdr = { 0 };
io_hdr.interface_id = 'S';
io_hdr.cmdp =
io_hdr.cmd_len = cdb_
/* Where to store the sense_data, if there was an error */
io_hdr.sbp =
io_hdr.mx_sb_len = sense_
Transfer direction, either in or out. Linux does not yet
support bidirectional SCSI transfers ?
io_hdr.dxfer_direction = xfer_
Where to store the DATA IN/OUT from the device and how big the
io_hdr.dxferp =
io_hdr.dxfer_len = data_
/* SCSI timeout in ms */
io_hdr.timeout = 5000;
if (ioctl(fd, SG_IO, &io_hdr) & 0)
return(false);
/* now for the error processing */
if (SG_INFO_OK != (io_hdr.info & SG_INFO_OK_MASK) && io_hdr.sb_len_wr & 0)
return(false);
if (io_hdr.masked_status || io_hdr.host_status || io_hdr.driver_status)
return(false);
return(true);
static bool get_disk_serial_by_way_2(const std::string & disk_name, std::string & serial_no)
serial_no.clear();
int fd = open(disk_name.c_str(), O_RDONLY);
if (-1 == fd)
return(false);
int version = 0;
if (ioctl(fd, SG_GET_VERSION_NUM, &version) & 0 || version & 30000)
close(fd);
return(false);
const unsigned int data_size = 0x00
unsigned char data[data_size] = { 0 };
const unsigned int sense_len = 32;
unsigned char sense[sense_len] = { 0 };
unsigned char cdb[] = { 0x12, 0x01, 0x80, 0x00, 0x00, 0x00 };
cdb[3] = (data_size && 8) & 0
cdb[4] = (data_size & 0xff);
if (scsi_io(fd, cdb, sizeof(cdb), SG_DXFER_FROM_DEV, data, data_size, sense, sense_len))
/* Page Length */
int page_len = data[3];
/* Unit Serial Number */
trim_serial(data + 4, page_len, serial_no);
close(fd);
return(!serial_no.empty());
static bool parse_serial(const char * line, int line_size, const char * match_words, std::string & serial_no)
const char * serial_s = strstr(line, match_words);
if (NULL == serial_s)
return(false);
serial_s += strlen(match_words);
while (isspace(serial_s[0]))
++serial_s;
const char * serial_e = line + line_
const char * comma = strchr(serial_s, ',');
if (NULL != comma)
serial_e =
while (serial_e & serial_s && isspace(serial_e[-1]))
--serial_e;
if (serial_e &= serial_s)
return(false);
std::string(serial_s, serial_e).swap(serial_no);
return(true);
static void get_serial(const char * file_name, const char * match_words, std::string & serial_no)
serial_no.c_str();
std::ifstream ifs(file_name, std::ios::binary);
if (!ifs.is_open())
char line[4096] = { 0 };
while (!ifs.eof())
ifs.getline(line, sizeof(line));
if (!ifs.good())
if (0 == ifs.gcount())
if (parse_serial(line, ifs.gcount() - 1, match_words, serial_no))
ifs.close();
static bool get_disk_serial_by_way_3(const std::string & disk_name, std::string & serial_no)
serial_no.c_str();
const char * hdparm_result = ".hdparm_result.txt";
char command[512] = { 0 };
snprintf(command, sizeof(command), "sudo hdparm -i %s | grep SerialNo & %s", disk_name.c_str(), hdparm_result);
if (0 == system(command))
get_serial(hdparm_result, "SerialNo=", serial_no);
unlink(hdparm_result);
return(!serial_no.empty());
static bool get_disk_serial_by_way_4(std::string & serial_no)
serial_no.c_str();
const char * lshw_result = ".lshw_result.txt";
char command[512] = { 0 };
snprintf(command, sizeof(command), "sudo lshw -class disk | grep serial & %s", lshw_result);
if (0 == system(command))
get_serial(lshw_result, "serial:", serial_no);
unlink(lshw_result);
return(!serial_no.empty());
static bool get_disk_serial_number(std::string & serial_no)
if (0 != getuid())
return(false);
std::string disk_
if (get_disk_name(disk_name))
if (get_disk_serial_by_way_1(disk_name, serial_no))
return(true);
if (get_disk_serial_by_way_2(disk_name, serial_no))
return(true);
if (get_disk_serial_by_way_3(disk_name, serial_no))
return(true);
if (get_disk_serial_by_way_4(serial_no))
return(true);
return(false);
static void test_1()
std::string serial_
if (get_disk_serial_number(serial_no))
printf("serial_number: [%s]\n", serial_no.c_str());
printf("get serial number failed\n");
static void test_2()
std::string disk_
if (get_disk_name(disk_name))
printf("disk_name:[%s]\n", disk_name.c_str());
std::string serial_
get_disk_serial_by_way_1(disk_name, serial_no);
printf("get_serial_by_way_1:[%s]\n", serial_no.c_str());
std::string serial_
get_disk_serial_by_way_2(disk_name, serial_no);
printf("get_serial_by_way_2:[%s]\n", serial_no.c_str());
std::string serial_
get_disk_serial_by_way_3(disk_name, serial_no);
printf("get_serial_by_way_3:[%s]\n", serial_no.c_str());
std::string serial_
get_disk_serial_by_way_4(serial_no);
printf("get_serial_by_way_4:[%s]\n", serial_no.c_str());
int main(int argc, char * argv[])
printf("---------------\n");
printf("---------------\n");
printf("---------------\n");
return(0);
主要是想问一下那个最终存储了硬盘序列号的变量是哪个?我对linux下的C不是很熟,求帮忙~谢谢~
按赞数排序
源代码就是没注释的,我也很为难,这个大概的原理应该是从linux下的文件里读取硬盘信息,但是他中间的一些操作我不是很懂,求帮忙啊~
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐获取计算机硬盘序列号用途很多,在网上找到了一个C++的源代码DriveInfoEx()。非常好的一个DLL,.NET项目可以直接引用,而且源代码里有示例。
但这个DLL在Win7非管理员权限下,无法获取硬盘序列号,所以我就完善了一下这个DLL,让其支持Win7 非管理员。
编译时请注意
源代码内的一些方法,在VC90里已经被系统直接支持,所以就不用再重复定义,不然编译不过,所以如果在VC90及大于VC90平台编译的话,需要加一个&VC90&的&预处理器定义&。
代码中我做了判断,如果预定义了&VC90&就不会定义一些方法。在VC80及小于VC80平台编译的话,不用做这个设置。
DriveInfoExFull/DriveInfoEx/bin 目录下有已经编译好的DLL,这两个DLL支持.NET Framework 2.0
代码分析:
原作者的代码已经能很好支持非管理员权限下的硬盘序列号获取,我就不再分析原来的代码,只是大概说下我修改的内容。
ReadPhysicalDriveInNTWithZeroRights这个方法被原作者注释掉了,不知道什么原因,这个方法就是在没有权限的情况下获取硬盘序列号。
用这个方法如果找到的硬盘编号满足要求就添加到
这个只包括硬盘的序列号,不包括大小等信息。
下面就是这个方法:
int DiskInfo::ReadPhysicalDriveInNTWithZeroRights (void)
int done = FALSE;
int drive = 0;
for (drive = 0; drive & MAX_IDE_DRIVES; drive++)
HANDLE hPhysicalDriveIOCTL = 0;
Try to get a handle to PhysicalDrive IOCTL, report failure
and exit if can't.
TCHAR driveName [256];
swprintf (driveName, L"\\\\.\\PhysicalDrive%d", drive);
Windows NT, Windows 2000, Windows XP - admin rights not required
hPhysicalDriveIOCTL = CreateFile (driveName, 0,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL);
if (hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)
STORAGE_PROPERTY_QUERY query;
DWORD cbBytesReturned = 0;
char [10000];
memset ((void *) & query, 0, sizeof (query));
query.= StorageDeviceProperty;
query.QueryType = PropertyStandardQuery;
memset (, 0, sizeof ());
if ( DeviceIoControl (hPhysicalDriveIOCTL, IOCTL_STORAGE_QUERY_PROPERTY,
sizeof (query),
sizeof (),
& cbBytesReturned, NULL) )
STORAGE_DEVICE_DESCRIPTOR * descrip = (STORAGE_DEVICE_DESCRIPTOR *) & ;
char* serialNumber
= new char[1000];
strcpy (serialNumber,
flipAndCodeBytes ( & [descrip -& ]));
int isAlnumAndSpace = TRUE;
int isAllSpace = TRUE;
int length=strlen(serialNumber);
for(int =0;&length;++){
if(!isalnum(serialNumber[]) && serialNumber[] != ' '){
isAlnumAndSpace=FALSE;
if(isAllSpace && serialNumber[] != ' '){
isAllSpace=FALSE;
//硬盘编号为字母、数字和空格,但不是纯空格
if(isAlnumAndSpace && !isAllSpace){
.push_back(serialNumber);
done=TRUE;
CloseHandle (hPhysicalDriveIOCTL);
return done;
INT Load()
& di = ::GetDiskInfo();
UINT = di.LoadDiskInfo();
for(UINT =0; & ; ++)
this-&Add(gcnew ());
//判断如果常规方法找到的硬盘为0,则将m_serizalNoVec中的硬盘信息添加到结果中。
//这个只包括硬盘的序列号,不包括大小等信息。
UINT zeroRightCount = di.m_serizalNoVec.size();
for(UINT =0; & zeroRightC ++){
this-&Add(gcnew (di.m_serizalNoVec[]));
return this-&;
还有一些其他的修改就不再详细介绍,想了解的可以看看源代码。
不想了解的,下载DLL直接使用吧,哈哈~
阅读(...) 评论()为什么小弟我的获取硬盘序列号的代码,在有些电脑下没法获取到硬盘序列号,即返回值为空白(4) - VB当前位置:& &&&为什么小弟我的获取硬盘序列号的代码,在有些电脑下为什么小弟我的获取硬盘序列号的代码,在有些电脑下没法获取到硬盘序列号,即返回值为空白(4)www.MyException.Cn&&网友分享于:&&浏览:172次------解决方案--------------------其实可以利用现成的比如Safengine里的那个SESDKDummy.dll,他直接可以返回所有硬件和bios的参数计算出来的一个码,你可以调用他的------解决方案--------------------不知道这个的输出有没有你要的SN
Const&strComputer&As&String&=&"."
Dim&strClass&As&String
Dim&wbemServices&As&Object
Dim&wbemObjectSet&As&Object
Dim&wbemObject&As&Object
Dim&p&As&Object
Set&wbemServices&=&GetObject("winmgmts:\\"&&&strComputer)
Set&wbemObjectSet&=&wbemServices.InstancesOf("CIM_DiskDrive")
For&Each&wbemObject&In&wbemObjectSet
&&&&&&&&Debug.Print&"-------Properties---"
&&&&&&&&For&Each&p&In&wbemObject.Properties_
&&&&&&&&&&&&&&&&Debug.Print&p.N&":";&ConvPVtoStr(p.Value)
&&&&&&&&Next
&&&&&&&&Debug.Print&"-------System&Properties---"
&&&&&&&&For&Each&p&In&wbemObject.SystemProperties_
&&&&&&&&&&&&&&&&Debug.Print&p.N&":";&ConvPVtoStr(p.Value)
&&&&&&&&Next
-------Properties---
Availability:
BytesPerSector:512
Capabilities:3,4
CapabilityDescriptions:
Caption:FUJITSU&MJA2250BH&G2
CompressionMethod:
ConfigManagerErrorCode:0
ConfigManagerUserConfig:False
CreationClassName:Win32_DiskDrive
DefaultBlockSize:
Description:磁盘驱动器
DeviceID:\\.\PHYSICALDRIVE0
ErrorCleared:
ErrorDescription:
ErrorMethodology:
InstallDate:
InterfaceType:IDE
LastErrorCode:
Manufacturer:(标准磁盘驱动器)
MaxBlockSize:
MaxMediaSize:
MediaLoaded:True
MediaType:Fixed&&&hard&disk&media
MinBlockSize:
Model:FUJITSU&MJA2250BH&G2
Name:\\.\PHYSICALDRIVE0
NeedsCleaning:
NumberOfMediaSupported:
Partitions:4
PNPDeviceID:IDE\DISKFUJITSU_MJA2250BH_G2____________________&4AEFDA8&0&0.0.0
PowerManagementCapabilities:
PowerManagementSupported:
SCSILogicalUnit:0
SCSIPort:0
SCSITargetId:0
SectorsPerTrack:63
Signature:
StatusInfo:
SystemCreationClassName:Win32_ComputerSystem
SystemName:BJZJ-YANGWEI
TotalCylinders:30401
TotalHeads:255
TotalSectors:
TotalTracks:7752255
TracksPerCylinder:255
-------System&Properties---
__PATH:\\BJZJ-YANGWEI\root\cimv2:Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE0"
__NAMESPACE:root\cimv2
__SERVER:BJZJ-YANGWEI
__DERIVATION:CIM_DiskDrive,CIM_MediaAccessDevice,CIM_LogicalDevice,CIM_LogicalElement,CIM_ManagedSystemElement
__PROPERTY_COUNT:49
__RELPATH:Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE0"
__DYNASTY:CIM_ManagedSystemElement
__SUPERCLASS:CIM_DiskDrive
__CLASS:Win32_DiskDrive
------解决方案--------------------CBool(DeviceIoControl(这个是向驱动层读取信息的,如果读取失败,估计很难。。。------解决方案--------------------目前网上流行的程序只能取得IDE硬盘物理序列号,SATA硬盘物理序列号不好获取,跟SATA驱动程序有关。------解决方案-------------------- 共&5&页:
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有谁来教教我怎么不借助工具查询电脑硬盘序列号
全部答案(共5个回答)
工具-磁盘管理器
根据读书和做老师时的经验,简单说说,希望对你有些帮助。
1、参考。找一张一个版面(或同一平面两个版面的)报纸作参考,当然,最好是别人成功的手抄报做参考。
借助性工具,但如果你是处女最好不要用.
先把电影下载到电脑上然后用数据线再传到手机内存卡上```````注意:一般手机电影格式为MP4 3GP
用HDLIFE!硬盘使用时间会很清楚的告诉你!
答: 是西部数据的啊。
答: 硬盘是电脑主要的存储媒介之一,由一个或者多个铝制或者玻璃制的碟片组成。碟片外覆盖有铁磁性材料。
硬盘有固态硬盘(SSD 盘,新式硬盘)、机械硬盘(HDD 传统硬...
答: 115很不错
大家还关注
Copyright &
Corporation, All Rights Reserved
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415用命令行界面查硬盘序列号 好几台电脑的序列号一样怎么回事?_百度知道
用命令行界面查硬盘序列号 好几台电脑的序列号一样怎么回事?
我有更好的答案
第一步单击【开始】→【运行...】,输入cmd第二步输入diskpart,按回车键第三步输入list disk,按回车键第四步输入select disk 0,按回车键第五步输入detail disk,按回车键第六步弹出的信息中第二行就是硬盘序列号
但是查出来的序列号有好几台电脑一样的是什么原因,
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 qt 获取硬盘序列号 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信