#include<windows.h>
#include<stdio.h>
#include <SetupAPI.h>
#pragma comment(lib, "setupapi.lib")
typedef BOOL(*TfEnumDevicesCallback)(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PVOID lpContext);
VOID EnumDevices(WCHAR *DeviceClassName, TfEnumDevicesCallback Callback, PVOID CallbackContext)
{
GUID Guid;
DWORD cbOpt;
if (SetupDiClassGuidsFromName(DeviceClassName, &Guid, 1, &cbOpt))
{
HDEVINFO hDev;
hDev = SetupDiGetClassDevs(&Guid, NULL, HWND_DESKTOP, DIGCF_PRESENT);
if (hDev != INVALID_HANDLE_VALUE)
{
DWORD MemberIndex;
SP_DEVINFO_DATA sdd;
MemberIndex = 0;
sdd.cbSize = sizeof(sdd);
while (SetupDiEnumDeviceInfo(hDev, MemberIndex, &sdd))
{
if (!Callback(hDev, &sdd, CallbackContext))
{
break;
}
MemberIndex++;
}
SetupDiDestroyDeviceInfoList(hDev);
}
}
return;
}
BOOL GetDevicePropertyValue(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property, PVOID *lppResult, DWORD *lpbResult)
{
PBYTE lpBuffer;
DWORD length;
DWORD ret=0;
lpBuffer = NULL;
length = 0;
if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet, DeviceInfoData, Property, NULL, NULL, 0, &ret))
{
if (ret==0)
{
return FALSE;
}
if (lpBuffer = (PBYTE)GlobalAlloc(GPTR, ret))
{
ZeroMemory(lpBuffer,ret);
if (SetupDiGetDeviceRegistryProperty(DeviceInfoSet, DeviceInfoData, Property, NULL, lpBuffer, ret, NULL))
{
*lppResult = lpBuffer;
*lpbResult = ret;
return TRUE;
}
GlobalFree(lpBuffer);
}
}
return FALSE;
}
VOID FreeGetDevicePropertyValue(PVOID lpBuffer)
{
GlobalFree(lpBuffer);
}
BOOL EnumNetCallback(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PVOID CallbackContext)
{
PVOID lpBusNumber;
DWORD cbBusNumber;
if (GetDevicePropertyValue(DeviceInfoSet, DeviceInfoData, SPDRP_BUSNUMBER, &lpBusNumber, &cbBusNumber))
{
if (cbBusNumber)
{
PVOID lpFriendlyName;
DWORD cbFriendlyName;
if (GetDevicePropertyValue(DeviceInfoSet, DeviceInfoData, SPDRP_FRIENDLYNAME, &lpFriendlyName, &cbFriendlyName))
{
printf("%S\n", lpFriendlyName);
FreeGetDevicePropertyValue(lpFriendlyName);
}
}
FreeGetDevicePropertyValue(lpBusNumber);
}
return TRUE;
}
BOOL EnumCpuCallback(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PVOID CallbackContext)
{
PVOID lpFriendlyName;
DWORD cbFriendlyName;
if (GetDevicePropertyValue(DeviceInfoSet, DeviceInfoData, SPDRP_FRIENDLYNAME, &lpFriendlyName, &cbFriendlyName))
{
printf("%S\n", lpFriendlyName);
FreeGetDevicePropertyValue(lpFriendlyName);
}
return TRUE;
}
BOOL EnumDiskCallback(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PVOID CallbackContext)
{
PVOID lpFriendlyName;
DWORD cbFriendlyName;
if (GetDevicePropertyValue(DeviceInfoSet, DeviceInfoData, SPDRP_FRIENDLYNAME, &lpFriendlyName, &cbFriendlyName))
{
printf("%S\n", lpFriendlyName);
FreeGetDevicePropertyValue(lpFriendlyName);
}
return TRUE;
}
BOOL EnumDisplayCallback(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PVOID CallbackContext)
{
PVOID lpFriendlyName;
DWORD cbFriendlyName;
if (GetDevicePropertyValue(DeviceInfoSet, DeviceInfoData, SPDRP_DEVICEDESC, &lpFriendlyName, &cbFriendlyName))
{
printf("%S\n", lpFriendlyName);
FreeGetDevicePropertyValue(lpFriendlyName);
}
return TRUE;
}
int main(int argc, CHAR* argv[])
{
UCHAR Mac[8];
printf("%s\n", "Net");
WCHAR net[] = L"Net";
EnumDevices(net, EnumNetCallback, NULL);
printf("\n");
printf("%s\n", "Processor");
WCHAR Processor[] = L"Processor";
EnumDevices(Processor, EnumCpuCallback, NULL);
printf("\n");
printf("%s\n", "Display");
WCHAR Display[] = L"Display";
EnumDevices(Display, EnumDisplayCallback, NULL);
return getchar();
}