获取电脑硬件对应的驱动程序信息

#include <Windows.h>
#include <Cfgmgr32.h>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <SetupAPI.h>
#include <tchar.h>

#pragma comment(lib, "Cfgmgr32.lib")
#pragma comment(lib, "Setupapi.lib")

using namespace std;

void printGUID(GUID& guid);
TCHAR* FindVersionFromULONGLONG(ULONGLONG data);

int main()
{
	GUID guid = { 0 };
	DWORD dwRet = 0;
	ULONG guidIndex = 0;

	setlocale(LC_ALL, "chs");//让程序支持UTF-16中文的输出

	while (true)
	{
		dwRet = CM_Enumerate_Classes(guidIndex++, &guid, 0);
		if (CR_NO_SUCH_VALUE == dwRet)
		{
			cout << "设备类枚举完成" << endl;
			break;
		}
		printGUID(guid);

		HDEVINFO hdevInfo = 0;
		hdevInfo = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT);
		if (INVALID_HANDLE_VALUE == hdevInfo)
		{
			cout << "SetupDiGetClassDevs failed" << endl;
			break;
		}

		DWORD deviceIndex = 0;
		SP_DEVINFO_DATA devInfoData = { sizeof(SP_DEVINFO_DATA) };

		for (deviceIndex = 0; SetupDiEnumDeviceInfo(hdevInfo, deviceIndex, &devInfoData);++deviceIndex)
		{
			_tprintf(L"-------------------------------------------------------------\n现有设备:\n");
			
			ULONG buffSize = 0;
			if (CR_SUCCESS != CM_Get_Device_ID_Size(&buffSize, devInfoData.DevInst, 0))
			{
				break;
			}

			TCHAR* buff = new TCHAR[buffSize + 1];
			dwRet = CM_Get_Device_ID(devInfoData.DevInst, buff, buffSize, 0);
			if (CR_SUCCESS != dwRet)
			{
				break;
			}
			buff[buffSize] = TEXT('\0');
			_tprintf(TEXT("Device ID:%s\n"), buff);
			delete[]buff;

			DWORD dwPropertyRegDataType, dwSize;
			wchar_t propertyBuffer[4096];
			
			if (SetupDiGetDeviceRegistryProperty(hdevInfo, &devInfoData, SPDRP_DEVICEDESC,
				&dwPropertyRegDataType, (PBYTE)propertyBuffer, sizeof(propertyBuffer), &dwSize))
			{
				_tprintf(L"Device Name:%s\n", propertyBuffer);
			}

			
			if (SetupDiGetDeviceRegistryProperty(hdevInfo, &devInfoData, SPDRP_HARDWAREID,
				&dwPropertyRegDataType, (PBYTE)propertyBuffer, sizeof(propertyBuffer), &dwSize))
			{
				_tprintf(L"硬件ID:\n");
				wchar_t* p = propertyBuffer;
				for (; *p != TEXT('\0') && p + dwSize / sizeof(char) <= propertyBuffer + ARRAYSIZE(propertyBuffer); p += lstrlen(p) + 1)
				{
					_tprintf(L"%s\n", p);
				}
			}
			else
			{
				continue;
			}

			_tprintf(L"\n兼容ID:\n");
			if (SetupDiGetDeviceRegistryProperty(hdevInfo, &devInfoData, SPDRP_COMPATIBLEIDS,
				&dwPropertyRegDataType, (PBYTE)propertyBuffer, sizeof(propertyBuffer), &dwSize))
			{
				wchar_t* p = propertyBuffer;
				for (; *p != TEXT('\0') && p + dwSize / sizeof(char) <= propertyBuffer + ARRAYSIZE(propertyBuffer); p += lstrlen(p) + 1)
				{
					_tprintf(TEXT("%s\n"), p);
				}
			}

			_tprintf(TEXT("\n对应驱动:\n"));
			//遍历驱动
			if (SetupDiBuildDriverInfoList(hdevInfo, &devInfoData, SPDIT_COMPATDRIVER))
			{
				SP_DRVINFO_DATA driverInfoData = { sizeof(SP_DRVINFO_DATA) };
				int i = 0;
				for (; SetupDiEnumDriverInfo(hdevInfo, &devInfoData, SPDIT_COMPATDRIVER, i, &driverInfoData); ++i);

				--i;
				_tprintf(TEXT("设备名称:%s\n"), driverInfoData.Description);
				_tprintf(TEXT("驱动程序提供商:%s\n"), driverInfoData.ProviderName);
				_tprintf(TEXT("设备制造商:%s\n"), driverInfoData.MfgName);
				_tprintf(TEXT("驱动程序版本:%s\n"), FindVersionFromULONGLONG(driverInfoData.DriverVersion));

				SYSTEMTIME sysTime;
				FileTimeToSystemTime(&driverInfoData.DriverDate, &sysTime);
				_tprintf(TEXT("驱动程序日期:%d/%d/%d\n"),
					sysTime.wYear, sysTime.wMonth, sysTime.wDay);
				
				SetupDiDestroyDriverInfoList(hdevInfo, &devInfoData, SPDIT_COMPATDRIVER);
			}
			else
			{
				_tprintf(TEXT("\n没找到对应驱动程序\n"));
			}
			_tprintf(TEXT("-------------------------------------------------------------\n"));
		}
	}

	system("pause");
    return 0;
}

void printGUID(GUID& guid)
{
	_tprintf(TEXT("GUID:%8X %4X %4X %2X %2X %2X %2X %2X %2X %2X %2X\n"),
		guid.Data1, guid.Data2, guid.Data3, guid.Data4[0], guid.Data4[1], guid.Data4[2], 
		guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
}

TCHAR* FindVersionFromULONGLONG(ULONGLONG data)
{
	static TCHAR buff[64];
	memset(buff, 0, sizeof(buff));
	ULONG temp = 0;
	TCHAR numbuff[8];

	for (int i = 48; i >= 0; i -= 16)
	{
		temp = (data >> i) & 0xFFFF;
		_ultot_s(temp, numbuff, 10);
		_tcscat_s(buff, numbuff);
		_tcscat_s(buff, TEXT("."));
	}
	buff[_tcslen(buff) - 1] = 0;
	return buff;
}

参考链接

官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值