使用C++在Windows上禁用/启用指定的设备驱动

#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、复制的设备实例路径需要在反斜杠那里再写一个反斜杠,当反斜杠表示转义字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值