#include <Windows.h>
#include <SetupAPI.h>
#include <Cfgmgr32.h>
#include <iostream>
#include <string>
#include <sddl.h>
#pragma comment(lib, "Setupapi.lib")
#pragma comment(lib, "Cfgmgr32.lib")
bool IsRunningAsAdmin() {
BOOL isAdmin = FALSE;
PSID adminGroup = NULL;
SID_IDENTIFIER_AUTHORITY ntAuthority = SECURITY_NT_AUTHORITY;
if (AllocateAndInitializeSid(&ntAuthority, 2,
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0, &adminGroup)) {
CheckTokenMembership(NULL, adminGroup, &isAdmin);
FreeSid(adminGroup);
}
return isAdmin == TRUE;
}
bool EnableDevice(const std::wstring& instanceId, bool enable) {
HDEVINFO deviceInfoSet = SetupDiGetClassDevs(nullptr, nullptr, nullptr, DIGCF_ALLCLASSES | DIGCF_PRESENT);
if (deviceInfoSet == INVALID_HANDLE_VALUE) {
std::wcerr << L"SetupDiGetClassDevs failed\n";
return false;
}
SP_DEVINFO_DATA deviceInfoData = { 0 };
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (DWORD i = 0; SetupDiEnumDeviceInfo(deviceInfoSet, i, &deviceInfoData); ++i) {
WCHAR buffer[512];
if (SetupDiGetDeviceInstanceId(deviceInfoSet, &deviceInfoData, buffer, sizeof(buffer) / sizeof(WCHAR), nullptr)) {
//std::wcout << L"[Device " << i << L"] Instance ID: " << buffer << L"\n";
if (std::wstring(buffer).find(instanceId) != std::wstring::npos) {
CONFIGRET status;
if (enable) {
status = CM_Enable_DevNode(deviceInfoData.DevInst, 0);
}
else {
status = CM_Disable_DevNode(deviceInfoData.DevInst, 0);
}
if (status != CR_SUCCESS) {
std::wcerr << L"Failed to change device state: " << status << L"\n";
SetupDiDestroyDeviceInfoList(deviceInfoSet);
return false;
}
else {
std::wcout << (enable ? L"Enabled" : L"Disabled") << L" device successfully\n";
SetupDiDestroyDeviceInfoList(deviceInfoSet);
return true;
}
}
}
}
SetupDiDestroyDeviceInfoList(deviceInfoSet);
std::wcerr << L"Device not found\n";
return false;
}
int main()
{
if (!IsRunningAsAdmin()) {
std::wcerr << L"当前不是管理员权限运行,操作将失败!\n";
return 1;
}
std::wstring instanceId = L"PCI\\VEN_xxxx&DEV_xxxx&SUBSYS_001E0000&REV_D6\\0000000101000A350";
bool enable = true; // true = enable, false = disable
if (!EnableDevice(instanceId, enable)) {
std::wcerr << L"Operation failed.\n";
return 1;
}
system("pause");
return 0;
}
Note:1、需要以管理员启动vs,2、需要修改程序的uac级别为high、3、设备设备实例路径在(设备管理器中右键设备 → 属性 → “详细信息” → 选择“设备实例路径”),4、复制的设备实例路径需要在反斜杠那里再写一个反斜杠,当反斜杠表示转义字符