完善DriveInfoEx源代码 获取计算机硬盘序列号
概述:
获取计算机硬盘序列号用途很多,在网上找到了一个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源代码 获取计算机硬盘序列号的更多相关文章
- MFC获取电脑硬盘序列号(附源代码)
在新建的project里面加入一个类 即:下面一个类 GetHDSerial.cpp <code class="hljs cs has-numbering" style= ...
- java通过jni方式获取硬盘序列号(windows,linux)
linux系统java通过jni方式获取硬盘序列号 http://blog.csdn.net/starter110/article/details/8186788 使用jni在windows下读取硬盘 ...
- C# 获取CPU序列号、网卡MAC地址、硬盘序列号封装类,用于软件绑定电脑
using System.Management; namespace GLaLa { /// <summary> /// hardware_mac 的摘要说明. /// </summ ...
- C# 获取计算机cpu,硬盘,内存相关的信息
using System;using System.Management; namespace MmPS.Common.Helper{ /// <summary> /// 获取计算机相关的 ...
- 获取Mac、CPUID、硬盘序列号、本地IP地址、外网IP地址OCX控件
提供获取Mac.CPUID.硬盘序列号.本地IP地址.外网IP地址OCX控件 开发语言:vc++ 可应用与WEB程序开发应用 <HTML><HEAD><TITLE> ...
- delphi 获取硬盘序列号、cpu号、bios号、网卡号
delphi 获取硬盘 序列号 function GetIdeNum: String; type TSrbIoControl = packed record HeaderLength : ULONG; ...
- 转: 通过WMI获取网卡MAC地址、硬盘序列号、主板序列号、CPU ID、BIOS序列号
最近由于项目的需要,需要在程序中获取机器的硬盘序列号和MAC地址等信息,在C#下,可以很容易的获得这些信息,但是在C++程序中感觉比较麻烦.经过百度,发现很多大虾都是通过WMI来获取这些硬件信息的,网 ...
- JAVA获取计算机CPU、硬盘、主板、网络等信息
通过使用第三方开源jar包sigar.jar我们可以获得本地的信息 1.下载sigar.jar sigar官方主页 sigar-1.6.4.zip 2.按照主页上的说明解压包后将相应的文件copy到j ...
- 获取硬盘序列号的Fortran程序
以前写了个获取硬盘序列号的fortran程序,但未经实证 program FortranDemo Use Kernel32 Implicit None Interface SUBROUTINE Get ...
随机推荐
- FireFox插件
Firebug和YSlow就不说了,太常用了,开发必备.
- POJ1037A decorative fence(动态规划+排序计数+好题)
http://poj.org/problem?id=1037 题意:输入木棒的个数n,其中每个木棒长度等于对应的编号,把木棒按照波浪形排序,然后输出第c个; 分析:总数为i跟木棒中第k短的木棒 就等于 ...
- spark-submit提示资源不足
ensure that workers are registered and have sufficient resources spark-cluster启动的配置里配置了每个worker的内存,如 ...
- hdu 2041 超级楼梯
斐波那契数列,看清题意,当前为第一阶,给出M(每次只能跨1阶或2阶) 从第一阶到M,若M=1,从1-1不用走,0种方法 若M=2 从1-2 一种方法 -> 1.走一次一阶 若M=3 从1-3 ...
- 宿主机为linux、windows分别实现VMware三种方式上网(转)
一.VMware三种方式工作原理1 Host-only连接方式 让虚机具有与宿主机不同的各自独立IP地址,但与宿主机位于不同网段,同时为宿主主机新增一个IP地址,且保证该IP地址与各虚机IP地址位于 ...
- WCF报 当前已禁用此服务的元数据发布的错误
这是 Windows© Communication Foundation 服务. 当前已禁用此服务的元数据发布. 如果具有该服务的访问权限,则可以通过完成下列步骤来修改 Web 或应用程序配置文件以便 ...
- motto5
No matter what others say,I won't forsake my priciples.
- JS设置cookie,删除cookie
js设置cookie有很多种方法. 第一种:(这个是w3c官网的代码) <script> //设置cookie function setCookie(cname, cvalue, exda ...
- CF440C
C. One-Based Arithmetic time limit per test 0.5 seconds memory limit per test 256 megabytes input st ...
- 设置dom元素可拖动,支持ie5+
摘要: 最近在项目中要做一个图片预览的功能,这时候会遇到用户上传很大的图片,已经超出视图界面.最终决定做一个在固定宽和高的位置,用户可以拖动图片查看.所以自己就写了一个支持ie5+,chrome,Fi ...