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 ", 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