#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;
}
获取电脑硬件对应的驱动程序信息
最新推荐文章于 2023-10-31 10:44:09 发布