同系列文章:
功能描述:
- 实现基于WDK获取网卡原生Mac地址、硬盘序列号、CPU ID
- 实现基于WMI获取网卡原生Mac地址、硬盘序列号、CPU ID
- 实现基于WDK获取系统所有设备的VID和PID
- 判断程序是否在VMware虚拟机中运行
源代码出售:
价格:壹仟元人民币
QQ:36748897
动态库及测试程序下载:
动态库接口文件:
/* ---------------------------------------------------------- 文件名称: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