关于windows的USB外接设备启用禁用的C++实现_c++ usb口禁用-程序员宅基地

技术标签: c++  usb  window  

一:注意:

        1: 外接设备指的是通过usb先连接到windows系统的设备(如:测试盒,usb移动硬盘,鼠标,键盘等),其他的我没试过;

        2:启用禁用指的是起到和“设备管理器”的“启用”“禁用”一样的功能;

        3:此代码只有编译成64位程序才会有效,32位程序无法控制;

二:源代码

        注:源代码纯手敲上来的,可能有些拼写错误

#include <iostream>

#include <string>
#include <vector>

//核心头文件
#include <Windows.h>
#include <SetupAPI.h>

using namespace std;

typedef struct _MY_SP_DEVINFO_DATA
{
    HDEVINFO        hDevInfo;
    SP_DEVINFO_DATA devInfoData;
} MY_SP_DEVINFO_DATA;

//函数声明

HDEVINFO getClassDevs(const wstring &str);

vector<MY_SP_DEVINFO_DATA> enumAllDevInfoData(const HDEVINFO &hDevInfo);

string getDevInstanceId(MY_SP_DEVINFO_DATA &myDevInfoData);

BOOL controlDevice(MY_SP_DEVINFO_DATA &myDevInfoData, DWORD controlCode);
BOOL controlDevice(HDEVINFO hDevInfo, PSP_DEVINFO_DATA pDevInfoData, DWORD controlCode);


int main()
{
    std::cout << "hello world!" << endl;

    HDEVINFO hDevInfoUsb      = getClassDevs(L"Usb");
    HDEVINFO hDevInfoMouse    = getClassDevs(L"Mouse");
    HDEVINFO hDevInfoKeyboard = getClassDevs(L"Keyboard");

    vector<MY_SP_DEVINFO_DATA> devInfoDataUsbList      = enumAllDevInfoData(hDevInfoUsb);
    vector<MY_SP_DEVINFO_DATA> devInfoDataMouseList    = enumAllDevInfoData(hDevInfoMouse);
    vector<MY_SP_DEVINFO_DATA> devInfoDataKeyboardList = enumAllDevInfoData(hDevInfoKeyboard);

    //将这些设备放到一个vector中
    vector<MY_SP_DEVINFO_DATA> allDevInfoDataList;

    allDevInfoDataList.insert(allDevInfoDataList.end(), devInfoDataUsbList.begin(), devInfoDataUsbList.end());
    allDevInfoDataList.insert(allDevInfoDataList.end(), devInfoDataMouseList.begin(), devInfoDataMouseList.end());
    allDevInfoDataList.insert(allDevInfoDataList.end(), devInfoDataKeyboardList.begin(), devInfoDataKeyboardList.end());

    //打印instanceId
    for(int i = 0; i < allDevInfoDataList.size(); ++i)
    {
        std::cout << getDevInstanceId(allDevInfoDataList.at(i)) << endl;
    }
    
    /*
     * 以鼠标为例,启用(或禁用)
     */
    
    //启用
    //controlDevice(devInfoDataMouseList.at(0), DICS_ENABLE);

    //禁用
    controlDevice(devInfoDataMouseList.at(0), DICS_DISABLE);

    return 0;
}


HDEVINFO getClassDevs(const wstring &str)
{
    BOOL     success = FALSE;
    GUID     classGuid;
    DWORD    requiredSize = 0;
    HDEVINFO hDevInfo = INVALID_HANDLE_VALUE;
    
    success = SetupDiClassGuidsFrom(str.c_str(), &classGuid, 1, &requiredSize);

    if(TRUE == success)
    {
        hDevInfo  = SetupDiGetClassDevs(&classGuid, nullptr, nullptr, DIGCF_PRESENT);
    }

    return hDevInfo;
}

vector<MY_SP_DEVINFO_DATA> enumAllDevInfoData(const HDEVINFO &hDevInfo)
{
    vector<MY_SP_DEVINFO_DATA> devInfoDataList;
    DWORD                      devIndex = 0;
    MY_SP_DEVINFO_DATA         myDevInfoData;

    myDevInfoData.hDevInfo = hDevInfo;

    while(true)
    {
        myDevInfoData.devInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
        if(SetupDiEnumDeviceInfo(hDevInfo, devIndex, &myDevInfoData.devInfoData) == FALSE)
            break;

        devInfoDataList.push_back(myDevInfoData);
        ++devIndex;
    }

    return devInfoDataList;
}

string getDevInstanceId(MY_SP_DEVINFO_DATA &myDevInfoData)
{
    const int maxSize = 1024;
    wchar_t   tempCh[maxSize] = {};
    DWORD     requiredSize = 0;
    string    str;

    if(SetupDiGetDeviceInstanceId(myDevInfoData.hDevInfo, &myDevInfoData.devInfoData, tempCh, maxSize, &requiredSize) == TRUE)
    {
        std::unique_ptr<char[]> pTemp(new char[requiredSize]{});
        for(DWORD i = 0; i < requiredSize; ++i
        {
            pTemp[i] = tempCh[i];
        }

        str = string(pTemp.get(), requiredSize);
    }

    return str;
}

BOOL controlDevice(MY_SP_DEVINFO_DATA &myDevInfoData, DWORD controlCode)
{
    return controlDevice(myDevInfoData.hDevInfo, &myDevInfoData.devInfoData, controlCode);
}

BOOL controlDevice(HDEVINFO hDevInfo, PSP_DEVINFO_DATA pDevInfoData, DWORD controlCode)
{
    SP_PROPCHANGE_PARAMS propChangeParams;

    switch(controlCode)
    {
    case DICS_ENABLE:
    {
        //need to enalbe both on global and config-specific

        //enable global
        propChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
        propChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
        propChangeParams.StateChange = controlCode;
        propChangeParams.Scope = DICS_FLAG_GLOBAL;
        propChangeParams.HwProfile = 0;

        if(SetupDiSetClassInstallParams(hDevInfo, pDevInfoData, &propChangeParams.ClassInstallHeader, sizeof(propChangeParams)))
        {
            SetupDiCallClassInstall(DIF_PROPERTYCHANGE, hDevInfo, pDevInfoData);
        }

        //config-specific
        propChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
        propChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
        propChangeParams.StateChange = controlCode;
        propChangeParams.Scope = DICS_FLAG_CONFIGSPECIFIC;
        propChangeParams.HwProfile = 0;
    }
        break;
    default:
    {
        //config-specific
        propChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
        propChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
        propChangeParams.StateChange = controlCode;
        propChangeParams.Scope = DICS_FLAG_CONFIGSPECIFIC;
        propChangeParams.HwProfile = 0;
    }
        break;
    }

    BOOL result = FALSE;
    
    if(!SetupDiSetClassInstallParams(hDevInfo, pDevInfoData, &propChangeParams.ClassInstallHeader, sizeof(propChangeParams))
        || !SetupDiCallClassInstall(DIF_PROPERTYCHANGE, hDevInfo, pDevInfoData))
    {
        std::cout << "falied to invoke DIF_PROPERTYCHANGE" << endl;
        result  = FALSE;
    }
    else
    {
        SP_DEVINSTALL_PARAMS devInstallParams;
        
        devInstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
        
        if(SetupDiGetDeviceInstallParams(hDevInfo, pDevInfoData, &devInstallParams)
            && devInstallParams.Flags & (DI_NEEDRESTART | DI_NEEDREBOOT)))
        {
            std::cout << "need reboot";
        }
        else
        {
            std::cout << "do not need reboot";
        }

        result = true;
    }

    return result;
}








 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_34236354/article/details/89205112

智能推荐

三角波的傅里叶变换对_傅里叶变换推导详解-程序员宅基地

文章浏览阅读8.1k次。(本人为本文原作者,转载请标明出处)第一节 三角函数正交性推导三角函数标准形式为公式2.1所示 在物理意义上这个函数又称之为正弦信号(正弦波),其中的t为时间变量,A为波幅, 为角速度, 为相位,我们可以通过公式2.2求得这个正弦波的频率。 并由式2.2可知,角速度和正弦波的频率是正相关的。同时,因为三角函数是周期函数,其在-π到π的积分必定为0,由此性质可写出式2.3,2.4 设某三角函数..._三角波的傅里叶变换

java 全排列 可重复_JAVA实现全排列算法(去重复)-程序员宅基地

文章浏览阅读420次。从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。在原作者的基础上[/color][color=#000080]加了去重复排列[code=java]package example;import java.util.ArrayList;import java.util.Arrays;import java.u..._java全排列的记忆化

python生成10个随机数并排序_python生成不重复随机数和对list乱序的解决方法-程序员宅基地

文章浏览阅读1.9k次。andom.sample(list, n)即是从list中随机选取n个不同的元素# -*- coding: utf-8 -*-import random# 从一个list中随机挑选5个list = [12, 23, 13, 14, 78, 234, 123, 12345]randomlist = random.sample(list, 5)print randomlist# 在range(10)中..._生成10个不重复的自然数,并按照降序排列python

UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte XXX in position xxx: invalid start byte原因_utf-8' codec can't decode byte 0xb1 in position 94-程序员宅基地

文章浏览阅读656次,点赞10次,收藏10次。UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte XXX in position xxx: invalid start byte原因。由于执行一直报错改文件编码格式还是不行,最后发现是pytest.ini中的注释有中文,去掉pytest.ini配置文件的中文注释后重新运行即可。_utf-8' codec can't decode byte 0xb1 in position 94: invalid start byte

1.H3C-iMC智能管理中心rce-exp编写_h3c rce-程序员宅基地

文章浏览阅读236次。这里需要发送post包,我们需要导入 requests 库,而且我们需要批量化而不是单个的操作,所以我们。本地创建一个 url.txt ,然后通过python去读取。我们为了批量验证是否目标存在漏洞,可以通过命令执行一个。最后我们可以把存在漏洞的url进行保存。接下来就是发送 post 包。那么说明该url是存在漏洞的。的问题,所以可能会弹一些警告。然后定义 post 内容。接下来就可以通过发送。因为可能会存在目标为。如何目标数据包回显存。_h3c rce

Java基础(面试总结最全!!!)_java基础知识点面试-程序员宅基地

文章浏览阅读634次,点赞3次,收藏8次。编程是指使用计算机语言编写代码,以实现计算机程序的过程。编程是一种创造性的活动,它要求程序员具备逻辑思维、分析问题和解决问题的能力。编程可以用于开发各种类型的软件,例如桌面应用程序、移动应用程序、网站、游戏等。Java是一门面向对象编程语言,它由 Sun Microsystems 公司于 1995 年推出。不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。_java基础知识点面试

随便推点

SBB-2016-石油污染土壤微生物群落构建与生物多样性研究-程序员宅基地

文章浏览阅读4.2k次。作者简介:焦硕,博士毕业于西北农林科技大学,目前在北京大学做博士后。文章链接 https://doi.org/10.1016/j.soilbio.2016.04.005主编按:此文于2016年发表于Soil Biology and Biochemistry (IF=4.926),文章思路清楚、图表美观,发表不到两年引用24次(超杂志平均引用2倍),更被众多同行选为学习的经典示范材料。今天诚...

【MySQL】【systemd】mysqld_pre_systemd 及 [email protected] 的 bugs-程序员宅基地

文章浏览阅读1.6k次。使用 systemd 管理 MySQL 的场景下,MySQL 提供的相关程序 mysqld_pre_systemd 及 [email protected] 存在一些缺陷,本文旨在指出缺陷并修改脚本来修复它们。_mysqld_pre_systemd

JAVA 前端上传文件,后端解析文件流并写入数据库_后端怎么把前端传的文件导入-程序员宅基地

文章浏览阅读3.9k次。JAVA 前端上传文件,后端解析文件流并写入数据库_后端怎么把前端传的文件导入

html5: 复制到剪贴板 clipboard.js-程序员宅基地

文章浏览阅读182次。1、使用clipboard.min.js工具,引用此js  注意事项:    IOS微信网页开发中,若使用此工具来开发复制功能,则需要在超链接/按钮上新增 onclick=" "2、clipboard使用         <li class="flex ai-center jc-sb">        <div class="reportCode"&..._html5 复制剪贴板

平均绝对误差的MATLAB怎么写,标准差、均方误差、均方根误差、平均绝对误差-程序员宅基地

文章浏览阅读5.4k次,点赞2次,收藏19次。1、标准差:标准差是方差的算术平方根。标准差能反映一个数据集的离散程度。平均数相同的两组组数据,标准差未必相同。 --------------------------------------------------------------------------------------------------------2、均方误差:是指参数估计值与参数真值之差平方的期望值(英文解释-MSE: ..._均方根误差matlab

java getcause_java – Exception.getCause()在尝试查找异常源时返回null-程序员宅基地

文章浏览阅读927次。为什么要System.out.println(e.getCause());给出null?并且可以像这样存储整个HashSet集合吗?private void saving() throws IOException, ClassNotFoundException {ObjectOutputStream out = null;try {out = new ObjectOutputStream(new ..._e.getcause为null