概述:

获取计算机硬盘序列号用途很多,在网上找到了一个C++的源代码DriveInfoEx(点这里查看)。非常好的一个DLL,.NET项目可以直接引用,而且源代码里有示例。

但这个DLL在Win7非管理员权限下,无法获取硬盘序列号,所以我就完善了一下这个DLL,让其支持Win7 非管理员。

源代码:

https://github.com/Xiongpq/DriveInfoExFull

编译时请注意

源代码内的一些方法,在VC90里已经被系统直接支持,所以就不用再重复定义,不然编译不过,所以如果在VC90及大于VC90平台编译的话,需要加一个“VC90”的“预处理器定义”。

代码中我做了判断,如果预定义了“VC90”就不会定义一些方法。在VC80及小于VC80平台编译的话,不用做这个设置。

DriveInfoExFull/DriveInfoEx/bin 目录下有已经编译好的DLL,这两个DLL支持.NET Framework 2.0

代码分析:

原作者的代码已经能很好支持非管理员权限下的硬盘序列号获取,我就不再分析原来的代码,只是大概说下我修改的内容。

ReadPhysicalDriveInNTWithZeroRights这个方法被原作者注释掉了,不知道什么原因,这个方法就是在没有权限的情况下获取硬盘序列号。

用这个方法如果找到的硬盘编号满足要求就添加到m_serizalNoVec中,这是一个vector<char*>

然后在Load方法中判断如果常规方法找到的硬盘个数为0,则将m_serizalNoVec中的硬盘信息添加到结果中。这个只包括硬盘的序列号,不包括大小等信息。

下面就是这个方法:

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 buffer [10000]; memset ((void *) & query, 0, sizeof (query));
query.PropertyId = StorageDeviceProperty;
query.QueryType = PropertyStandardQuery; memset (buffer, 0, sizeof (buffer)); if ( DeviceIoControl (hPhysicalDriveIOCTL, IOCTL_STORAGE_QUERY_PROPERTY,
& query,
sizeof (query),
& buffer,
sizeof (buffer),
& cbBytesReturned, NULL) )
{
STORAGE_DEVICE_DESCRIPTOR * descrip = (STORAGE_DEVICE_DESCRIPTOR *) & buffer;
char* serialNumber = new char[1000];
strcpy (serialNumber,
flipAndCodeBytes ( & buffer [descrip -> SerialNumberOffset])); int isAlnumAndSpace = TRUE;
int isAllSpace = TRUE;
int length=strlen(serialNumber);
for(int i=0;i<length;i++){
if(!isalnum(serialNumber[i]) && serialNumber[i] != ' '){
isAlnumAndSpace=FALSE;
break;
} if(isAllSpace && serialNumber[i] != ' '){
isAllSpace=FALSE;
}
}
//硬盘编号为字母、数字和空格,但不是纯空格
if(isAlnumAndSpace && !isAllSpace){
m_serizalNoVec.push_back(serialNumber);
} done=TRUE;
} CloseHandle (hPhysicalDriveIOCTL);
}
}
return done;
}
INT Load()
{
DiskInfo& di = DiskInfo::GetDiskInfo();
UINT cnt = di.LoadDiskInfo();
for(UINT i=0; i < cnt; i++)
this->Add(gcnew DriveInfoEx(i)); //判断如果常规方法找到的硬盘为0,则将m_serizalNoVec中的硬盘信息添加到结果中。
//这个只包括硬盘的序列号,不包括大小等信息。
if(cnt == 0){
UINT zeroRightCount = di.m_serizalNoVec.size();
for(UINT i=0; i < zeroRightCount; i++){
this->Add(gcnew DriveInfoEx(di.m_serizalNoVec[i]));
}
} return this->Count;
};

还有一些其他的修改就不再详细介绍,想了解的可以看看源代码。

不想了解的,下载DLL直接使用吧,哈哈~

完善DriveInfoEx源代码 获取计算机硬盘序列号的更多相关文章

  1. MFC获取电脑硬盘序列号(附源代码)

    在新建的project里面加入一个类  即:下面一个类  GetHDSerial.cpp <code class="hljs cs has-numbering" style= ...

  2. java通过jni方式获取硬盘序列号(windows,linux)

    linux系统java通过jni方式获取硬盘序列号 http://blog.csdn.net/starter110/article/details/8186788 使用jni在windows下读取硬盘 ...

  3. C# 获取CPU序列号、网卡MAC地址、硬盘序列号封装类,用于软件绑定电脑

    using System.Management; namespace GLaLa { /// <summary> /// hardware_mac 的摘要说明. /// </summ ...

  4. C# 获取计算机cpu,硬盘,内存相关的信息

    using System;using System.Management; namespace MmPS.Common.Helper{ /// <summary> /// 获取计算机相关的 ...

  5. 获取Mac、CPUID、硬盘序列号、本地IP地址、外网IP地址OCX控件

    提供获取Mac.CPUID.硬盘序列号.本地IP地址.外网IP地址OCX控件 开发语言:vc++ 可应用与WEB程序开发应用 <HTML><HEAD><TITLE> ...

  6. delphi 获取硬盘序列号、cpu号、bios号、网卡号

    delphi 获取硬盘 序列号 function GetIdeNum: String; type TSrbIoControl = packed record HeaderLength : ULONG; ...

  7. 转: 通过WMI获取网卡MAC地址、硬盘序列号、主板序列号、CPU ID、BIOS序列号

    最近由于项目的需要,需要在程序中获取机器的硬盘序列号和MAC地址等信息,在C#下,可以很容易的获得这些信息,但是在C++程序中感觉比较麻烦.经过百度,发现很多大虾都是通过WMI来获取这些硬件信息的,网 ...

  8. JAVA获取计算机CPU、硬盘、主板、网络等信息

    通过使用第三方开源jar包sigar.jar我们可以获得本地的信息 1.下载sigar.jar sigar官方主页 sigar-1.6.4.zip 2.按照主页上的说明解压包后将相应的文件copy到j ...

  9. 获取硬盘序列号的Fortran程序

    以前写了个获取硬盘序列号的fortran程序,但未经实证 program FortranDemo Use Kernel32 Implicit None Interface SUBROUTINE Get ...

随机推荐

  1. firefox与chrome中对select下拉框中的option支持问题

    firefox可以直接修改option的字体样式,但是chrome中option的字体样式是继承select的,这个是在项目中遇到的,具体的可以看一下 http://www.cnblogs.com/r ...

  2. C++ STL初学笔记

    C++  STL初学笔记 更系统的版本见徐本柱的PPT set 在这儿:http://www.cnblogs.com/pdev/p/4035020.html #include <vector&g ...

  3. 最新版本的DBCP数据源配置

    弄了我一下午,把该加的包都加进去了还是没用,后来把DBCP的包打开来看看才发现路径不对.配置如下: <!-- 使用dbcp配置数据源 --> <bean id="dataS ...

  4. POJ3267 The Cow Lexicon(DP+删词)

    The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9041   Accepted: 4293 D ...

  5. ECSHOP用户协议字体颜色更改

    ECSHOP用户协议字体颜色更改 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2013-11-12   ECSHOP用户协议模板文件article_pro.dwt 这 ...

  6. textView中判断文本长度,自定义表情长度为1,emoj表情长度为1,输入限制

      static const int MAX_LIMIT_NUMS = 100; /**< 输入个数限制 */ // self.inputNumberTipsLabel 控制器的view上一个用 ...

  7. Unity Shaders Vertex & Fragment Shader入门

    http://blog.csdn.net/candycat1992/article/details/40212735 三个月以前,在一篇讲卡通风格的Shader的最后,我们说到在Surface Sha ...

  8. struts2使用注解--ACTION中的应用

    1.在类中指定包:@ParentPackage("system").其中system是在struts.xml中定义的包名.2.配置文件--->注解2.1配置文件方式(返回js ...

  9. inno setup介绍及官方网站地址

    使 用 笔 记 1.Inno Setup 是什么?Inno Setup 是一个免费的 Windows 安装程序制作软件.第一次发表是在 1997 年,Inno Setup 今天在功能设置和稳定性上的竞 ...

  10. 马化腾:办公用QQ休闲用微信[Dream Catchers论坛]

    近日,香港大学举办以创新创业为主题的Dream Catchers论坛.其中腾讯董事局主席马化腾在下午两点四十五分在李兆基会议中心做了专题演讲,分享了自己的创业经历并回答了媒体人张力奋有关产品.整整对手 ...