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

同系列文章:

功能描述:

  1. 实现基于WDK获取网卡原生Mac地址、硬盘序列号、CPU ID
  2. 实现基于WMI获取网卡原生Mac地址、硬盘序列号、CPU ID
  3. 实现基于WDK获取系统所有设备的VID和PID
  4. 判断程序是否在VMware虚拟机中运行

源代码出售:

sell
价格:壹仟元人民币
QQ:36748897

动态库及测试程序下载:

HWiNFO 20161229.zip

动态库接口文件:

/* ----------------------------------------------------------
文件名称:HWiNFO.h

作者:秦建辉

QQ:36748897

开发环境:
	Visual Studio V2013

版本历史:
	V1.7	2015年12月04日
			增加对VMware虚拟机的判断。虚拟机可以伪造任意网卡MAC地址
			在WDK中实现0权限获取硬盘序列号

	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
	5.判断程序是否是在VMware虚拟机中运行
------------------------------------------------------------ */
#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
		检测VMware虚拟机,如果检测程序在VMware虚拟机中运行,则返回E_ACCESSDENIED
	*/
	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);

	/*
	功能:判断程序是否在VMware虚拟机中运行
	返回值:
		S_OK:程序是在VMware虚拟机中运行
		S_FALSE:程序不在VMware虚拟机中运行
		其它HRESULT错误类型
	*/
	HRESULT WINAPI WDK_IsVMware();

	/*
	功能:通过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的项必须全部满足
		检测VMware虚拟机,如果检测程序在VMware虚拟机中运行,则返回E_ACCESSDENIED
	*/
	HRESULT WINAPI WMI_DeviceMatch(const TCHAR* CPUID, const TCHAR* HardDiskSerialNumber, const TCHAR *MacAddress);

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

	/*
	功能:判断程序是否在VMware虚拟机中运行
	返回值:
		S_OK:程序是在VMware虚拟机中运行
		S_FALSE:程序不在VMware虚拟机中运行
		其它HRESULT错误类型
	*/
	HRESULT WINAPI WMI_IsVMware();

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

#ifdef __cplusplus
}
#endif

测试软件界面:
HWiNFO-1
HWiNFO-2

Comments are closed.