SetupDiSetClassInstallParams函数一般是用来禁用/启用某个设备
比如我们可以禁用网络适配器
/* for Devpkey */
#define INITGUID
/* dependencies */
#pragma comment (lib, "SetupAPI")
#include <windows.h>
#include <SetupAPI.h>
#include <Devpkey.h>
#include <iostream>
#include <stdio.h>
#include <devguid.h>
using namespace std;
VOID SetDeviceState(LPCWSTR lpszHardwareId, DWORD dwState)
{
HDEVINFO devInfo;
if (devInfo = SetupDiGetClassDevsW(NULL, NULL, NULL, DIGCF_ALLCLASSES))
{
DWORD dwBuffersize;
SP_DEVINFO_DATA devData;
DEVPROPTYPE devProptype;
LPWSTR devBuffer;
devData.cbSize = sizeof(SP_DEVINFO_DATA);
for (int i = 0; ; i++)
{
SetupDiEnumDeviceInfo(devInfo, i, &devData);
if (GetLastError() == ERROR_NO_MORE_ITEMS) break;
/* calculate buffer size */
SetupDiGetDevicePropertyW(devInfo, &devData, &DEVPKEY_Device_HardwareIds, &devProptype, NULL, 0, &dwBuffersize, 0);
/* real call */
if (devBuffer = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, dwBuffersize))
{
SetupDiGetDevicePropertyW(devInfo, &devData, &DEVPKEY_Device_HardwareIds, &devProptype, (PBYTE)devBuffer, dwBuffersize, NULL, 0);
// cout << devBuffer << endl;
// printf("%s\n", devBuffer);
if (lstrcmpW(devBuffer, lpszHardwareId) == 0)
{
/* matched */
SP_CLASSINSTALL_HEADER ciHeader;
ciHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
ciHeader.InstallFunction = DIF_PROPERTYCHANGE;
SP_PROPCHANGE_PARAMS pcParams;
pcParams.ClassInstallHeader = ciHeader;
pcParams.StateChange = dwState;
pcParams.Scope = DICS_FLAG_GLOBAL;
pcParams.HwProfile = 0;
BOOL FLAG = SetupDiSetClassInstallParamsW(devInfo, &devData, (PSP_CLASSINSTALL_HEADER)&pcParams, sizeof(SP_PROPCHANGE_PARAMS));
SetupDiChangeState(devInfo, &devData);
}
HeapFree(GetProcessHeap(), 0, devBuffer);
}
}
SetupDiDestroyDeviceInfoList(devInfo);
}
}
int main()
{
SetDeviceState(L"PCI\\VEN_8086&DEV_15E3&SUBSYS_07A11028&REV_00", DICS_DISABLE);
return 0;
}
我们可以从设备管理器中查看硬件的ID