VC:基于WDK和WMI获取机器指纹

同系列文章:
功能描述:
  1. 实现基于WDK获取网卡原生Mac地址、硬盘序列号、CPU ID
  2. 实现基于WMI获取网卡原生Mac地址、硬盘序列号、CPU ID
  3. 实现基于WDK获取系统所有设备的VID和PID
源代码出售:
sell
价格:壹仟元人民币
QQ:36748897
动态库及测试程序下载:
HWiNFO VC 2014-04-07.zip
动态库接口文件:
/* ----------------------------------------------------------
文件名称:HWiNFO.h

作者:秦建辉

QQ:36748897

开发环境:
 Visual Studio V2013

版本历史:
 V1.6 2014年03月31日
   在WDK中增加获取CPU ID

 V1.5 2014年03月28日
   增加在DLL中的调用支持

 V1.4 2011年09月10日
   实现结合设备安装类GUID和设备接口类GUID获取VID-PID  

 V1.3 2010年05月22日
   增加获取硬盘序列号(WDK查询需要系统管理员权限)

 V1.2 2010年05月20日
   增加获取网卡原生MAC地址

 V1.0 2010年04月15日
   实现获取人机交互设备的VID-PID

功能说明:
 1.获取网卡原生MAC地址
 2.获取硬盘序列号
 3.获取CPU ID
 4.获取系统所有设备的VIDPID
------------------------------------------------------------ */
#pragma once

#include <windows.h>

#define PROPERTY_MAX_LEN  128 // 属性字段最大长度
typedef struct _T_DEVICE_PROPERTY
{
 TCHAR Property[PROPERTY_MAX_LEN];
} T_DEVICE_PROPERTY;

typedef struct _T_VIDPID
{
 USHORT VendorID; // 设备商标识
 USHORT ProductID; // 产品标识
} T_VIDPID;

#ifdef __cplusplus
extern "C"
{
#endif

 /*
 功能:通过WDK获取网卡原生MAC地址和当前MAC地址
 入口参数:
  DevicePropertyCollection:存储网卡MAC地址,可以为NULL
  iSize:可查询的最大网卡数目
  isIncludeUSB:是否包含USB网卡,默认不包含USB网卡
 返回值:
  <0:HRESULT错误类型
  >=0:实际获取到的网卡数
 */
 HRESULT WINAPI WDK_QueryMacAddress(T_DEVICE_PROPERTY *DevicePropertyCollection, INT iSize, BOOL isIncludeUSB = FALSE);

 /*
 功能:基于WDK获取硬盘序列号(需要系统管理员权限)
 参数说明:
  DevicePropertyCollection:存储硬盘序列号,可以为NULL
  iSize:可查询的最大硬盘数
 返回值:
  <0:HRESULT错误类型
  >=0:实际获取到的硬盘数
 */
 HRESULT WINAPI WDK_QueryDiskDrive(T_DEVICE_PROPERTY *DevicePropertyCollection, INT iSize);

 /*
 功能:获取CPU ID
 参数说明:
  DevicePropertyCollection:存储CPU ID
  iSize:可查询的最大CPU数目
 返回值:
  <0:HRESULT错误类型
  >=0:实际获取到的CPU数目
 说明:只适合Intel CPU
 */
 HRESULT WINAPI WDK_QueryCPUID(T_DEVICE_PROPERTY *DevicePropertyCollection, INT iSize);

 /*
 功能:获取系统所有设备的VIDPID
 入口参数:
  VidPidCollection:存储返回的VIDPID,会自动过滤掉重复的VIDPID
  iSize:可查询的设备数,建议为32
  SetupClassGuid:设备安装类GUID,默认为NULL
  InterfaceClassGuid:设备接口类GUID,默认为NULL
 返回值:
  <0:HRESULT错误类型
  >=0:实际获取到的VID和PID数目
 优点:
  直接通过设备实例ID提取VIDPID,从而无需获取设备路径来读写IO。
 */
 HRESULT WINAPI WDK_QueryVidPid(T_VIDPID* VidPidCollection, INT iSize, const GUID* SetupClassGuid = NULL, const GUID* InterfaceClassGuid = NULL);

 /*
 功能:验证设备的VIDPID
 入口参数:
  VendorID:设备VID
  ProductID:设备PID
  SetupClassGuid:设备安装类GUID,默认为NULL
  InterfaceClassGuid:设备接口类GUID,默认为NULL
 返回值:
  E_ACCESSDENIED:验证未通过
  S_OK:验证通过
  其它HRESULT错误类型
 */
 HRESULT WINAPI WDK_VIDPIDMatch(USHORT VendorID, USHORT ProductID, const GUID* SetupClassGuid = NULL, const GUID* InterfaceClassGuid = NULL);
 
 /*
 功能:查看系统中是否存在指定标识的硬件设备
 参数说明:
  CPUID:处理器标识,可以为NULL
  HardDiskSerialNumber:硬盘序列号,可以为NULL
  MacAddress:网卡MAC地址(已剔除虚拟网卡和USB网卡),可以为NULL
 返回值:
  E_ACCESSDENIED:验证未通过
  S_OK:验证通过
  其它HRESULT错误类型
 说明:
  对设备标识不区分大小写
  为NULL的项不做判断,不为NULL的项必须全部满足
  比WMI_DeviceMatch速度更快,但只能识别一颗CPU
 */
 HRESULT WINAPI WDK_DeviceMatch(const TCHAR* CPUID, const TCHAR* HardDiskSerialNumber, const TCHAR *MacAddress);

 /*
 功能:输出VIDPID信息到指定INI文件
 返回值:
  S_OK:成功
  其它HRESULT错误类型
 */
 HRESULT WINAPI WDK_VIDPIDPrint(const TCHAR* iniFileName);

 /*
 功能:输出硬件信息到指定INI文件
 返回值:
  S_OK:成功
  其它HRESULT错误类型
 说明:
  比WMI_DeviceInfoPrint速度更快,但只能识别一颗CPU
 */
 HRESULT WINAPI WDK_DeviceInfoPrint(const TCHAR* iniFileName);

 /*
 功能:通过WMI获取设备属性
 参数说明:
  iQueryIndex:需要查询的设备属性
   0:网卡原生MAC地址(剔除虚拟网卡)
   1:网卡原生MAC地址(剔除虚拟网卡和USB网卡)
   2:硬盘序列号
   3:主板序列号
   4:CPU ID
   5:BIOS序列号
   6:主板型号
   7:网卡当前MAC地址(剔除虚拟网卡)
   8:网卡当前MAC地址(剔除虚拟网卡和USB网卡)
  DevicePropertyCollection:存储设备属性值
  iSize:可存储的最大设备个数
 返回值:
  <0:HRESULT错误类型
  >=0:实际获取到的设备个数
 */
 HRESULT WINAPI WMI_DeviceQuery(INT iQueryIndex, T_DEVICE_PROPERTY *DevicePropertyCollection, INT iSize);

 /*
 功能:查看系统中是否存在指定标识的硬件设备
 参数说明:
  CPUID:处理器标识,可以为NULL
  HardDiskSerialNumber:硬盘序列号,可以为NULL
  MacAddress:网卡MAC地址(已剔除虚拟网卡和USB网卡),可以为NULL
 返回值:
  E_ACCESSDENIED:验证未通过
  S_OK:验证通过
  其它HRESULT错误类型
 说明:
  对设备标识不区分大小写
  为NULL的项不做判断,不为NULL的项必须全部满足
 */
 HRESULT WINAPI WMI_DeviceMatch(const TCHAR* CPUID, const TCHAR* HardDiskSerialNumber, const TCHAR *MacAddress);

 /*
 功能:输出硬件信息到指定INI文件
 返回值:
  S_OK:成功
  其它HRESULT错误类型
 */
 HRESULT WINAPI WMI_DeviceInfoPrint(const TCHAR* iniFileName);

 /*
 功能:获取版权信息
 */
 TCHAR* WINAPI GetHWiNFOCopyright();

#ifdef __cplusplus
}
#endif

测试软件界面:

HWiNFO-1HWiNFO-2

花了10块钱买的,希望对大家有帮助。/*############################################################################# * 文件名:file.c * 功能: 实现了指纹相关文件的操作 * modified by PRTsinghua@hotmail.com #############################################################################*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "file.h" /* 对象的这些接口实现是私有的,不必为用户所知 */ typedef struct iFvsFile_t { FILE *pf; /* 文件指针 */ } iFvsFile_t; /****************************************************************************** * 功能:创建一个新的文件对象,只有在创建之后,文件对象才能为其它函数所用。 * 参数:无 * 返回:若创建失败,返回NULL;否则返回新的对象句柄。 ******************************************************************************/ FvsFile_t FileCreate() { iFvsFile_t* p = NULL; p = (iFvsFile_t*)malloc(sizeof(iFvsFile_t)); if (p!=NULL) p->pf = NULL; return (FvsFile_t)p; } /****************************************************************************** * 功能:破坏一个已经存在的文件对象,在毁坏之后,文件对象不能再为其它函数所用。 * 参数:file 即将删除的文件对象指针 * 返回:无返回值 ******************************************************************************/ void FileDestroy(FvsFile_t file) { iFvsFile_t* p = NULL; if (file==NULL) return; /* 关闭文件,如果它还打开着 */ (void)FileClose(file); p = file; free(p); } /****************************************************************************** * 功能:打开一个新的文件。一个文件可以读打开,写打开,或者被创建。 * 参数:file 文件对象 * name 待打开文件的名字 * flags 打开标志 * 返回:错误编号 ******************************************************************************/ FvsError_t FileOpen(FvsFile_t file, const FvsString_t name, const FvsFileOptions_t flags) { iFvsFile_t* p = (iFvsFile_t*)file; char strFlags[10]; int nflags = (int)flags; /* 关闭文件,如果已经打开 */ (void)FileClose(p); strcpy(strFlags, ""); if ( (nflags & FvsFileRead)!=0 && (nflags & FvsFileWrite)!=0 ) strcat(strFlags, "rw"); else { if ((nflags & FvsFileRead)!=0) strcat(strFlags, "r"); if ((nflags & FvsFileWrite)!=0) strcat(strFlags, "w"); } strcat(strFlags, "b"); if ((nflags & FvsFileCreate)!=0) strcat(strFlags, "+"); p->pf = fopen(name, strFlags); if (FileIsOpen(file)==FvsTrue) return FvsOK; return FvsFailure; } /****************************************************************************** * 功能:关闭一个文件对象,文件关闭之后,文件不再可用。 * 参数:file 文件对象 * 返回:错误编号 ******************************************************************************/ FvsError_t FileClose(FvsFile_t file) { iFvsFile_t* p = (iFvsFile_t*)file; int nerr = -1; if (p->pf!=NULL) { nerr = fclose(p->pf); p->pf = NULL; } if (nerr==0) return FvsOK; return FvsFailure; } /****************************************************************************** * 功能:测试一个文件是否打开 * 参数:file 文件对象 * 返回:文件打开,则返回true;否则返回false ******************************************************************************/ FvsBool_t FileIsOpen(const FvsFile_t file) { iFvsFile_t* p = (iFvsFile_t*)file; return (p->pf!=NULL)?FvsTrue:FvsFalse; } /****************************************************************************** * 功能:测试是否到了文件结尾 * 参数:file 文件对象 * 返回:到了结尾,返回true;否则返回false ******************************************************************************/ FvsBool_t FileIsAtEOF(const FvsFile_t file) { iFvsFile_t* p = (iFvsFile_t*)file; if (FileIsOpen(p)==FvsFalse) return FvsFalse; return (feof(p->pf)!=0)?FvsTrue:FvsFalse; } /****************************************************************************** * 功能:提交对文件所作的更改 * 参数:file 文件对象 * 返回:错误编号 ******************************************************************************/ FvsError_t FileCommit(FvsFile_t file) { iFvsFile_t* p = (iFvsFile_t*)file; return (fflush(p->pf)==0)?FvsOK:FvsFailure; } /****************************************************************************** * 功能:跳到文件的开头 * 参数:file 文件对象 * 返回:错误编号 ******************************************************************************/ FvsError_t FileSeekToBegin(FvsFile_t file) { iFvsFile_t* p = (iFvsFile_t*)file; if (FileIsOpen(p)==FvsTrue) { if (fseek(p->pf, 0, SEEK_SET)!=0) return FvsFailure; return FvsOK; } return FvsFailure; } /****************************************************************************** * 功能:跳到文件的结尾 * 参数:file 文件对象 * 返回:错误编号 ******************************************************************************/ FvsError_t FileSeekToEnd(FvsFile_t file) { iFvsFile_t* p = (iFvsFile_t*)file; if (FileIsOpen(p)==FvsTrue) { if (fseek(p->pf, 0, SEEK_END)!=0) return FvsFailure; return FvsOK; } return FvsFailure; } /****************************************************************************** * 功能:得到当前的文件指针位置 * 参数:file 文件对象 * 返回:当前的指针位置 ******************************************************************************/ FvsUint_t FileGetPosition(FvsFile_t file) { iFvsFile_t* p = (iFvsFile_t*)file; if (FileIsOpen(p)==FvsTrue) return (FvsUint_t)ftell(p->pf); return 0; } /****************************************************************************** * 功能:跳到文件的指定位置 * 参数:file 文件对象 * position 指定的文件位置 * 返回:错误编号 ******************************************************************************/ FvsError_t FileSeek(FvsFile_t file, const FvsUint_t position) { iFvsFile_t* p = (iFvsFile_t*)file; if (FileIsOpen(p)==FvsTrue) { if (fseek(p->pf, (long int)position, SEEK_SET)!=0) return FvsFailure; return FvsOK; } return FvsFailure; } /****************************************************************************** * 功能:从文件中读数据,所读取的字节数由length决定。读取的数据保存于指针data。 * 参数:file 文件对象 * data 指向存储数据的数组 * length 要读取的字节数 * 返回:实际读取的字节数 ******************************************************************************/ FvsUint_t FileRead(FvsFile_t file, FvsPointer_t data, const FvsUint_t length) { iFvsFile_t* p = (iFvsFile_t*)file; return (FvsUint_t)fread(data, (size_t)1, (size_t)length, p->pf); } /****************************************************************************** * 功能:往文件中写数据,所写的字节数由length决定。要写入的数据保存于指针data。 * 参数:file 文件对象 * data 指向存储数据的数组 * length 要写入的字节数 * 返回:实际写入的字节数 ******************************************************************************/ FvsUint_t FileWrite(FvsFile_t file, const FvsPointer_t data, const FvsUint_t length) { iFvsFile_t* p = (iFvsFile_t*)file; return (FvsUint_t)fwrite(data, (size_t)1, (size_t)length, p->pf); } /****************************************************************************** * 功能:从文件中得到一个字节 * 参数:file 文件对象 * 返回:读取的字节 ******************************************************************************/ FvsByte_t FileGetByte(FvsFile_t file) { iFvsFile_t* p = (iFvsFile_t*)file; return (FvsByte_t)fgetc(p->pf); } /****************************************************************************** * 功能:从文件中读取一个字 * 参数:file 文件对象 * 返回:读取的字 ******************************************************************************/ FvsWord_t FileGetWord(FvsFile_t file) { iFvsFile_t* p = (iFvsFile_t*)file; FvsWord_t w = (FvsWord_t)fgetc(p->pf); return (w<<8)+fgetc(p->pf); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值