一:注意:
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;
}
文章浏览阅读8.1k次。(本人为本文原作者,转载请标明出处)第一节 三角函数正交性推导三角函数标准形式为公式2.1所示 在物理意义上这个函数又称之为正弦信号(正弦波),其中的t为时间变量,A为波幅, 为角速度, 为相位,我们可以通过公式2.2求得这个正弦波的频率。 并由式2.2可知,角速度和正弦波的频率是正相关的。同时,因为三角函数是周期函数,其在-π到π的积分必定为0,由此性质可写出式2.3,2.4 设某三角函数..._三角波的傅里叶变换
文章浏览阅读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全排列的记忆化
文章浏览阅读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
文章浏览阅读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
文章浏览阅读236次。这里需要发送post包,我们需要导入 requests 库,而且我们需要批量化而不是单个的操作,所以我们。本地创建一个 url.txt ,然后通过python去读取。我们为了批量验证是否目标存在漏洞,可以通过命令执行一个。最后我们可以把存在漏洞的url进行保存。接下来就是发送 post 包。那么说明该url是存在漏洞的。的问题,所以可能会弹一些警告。然后定义 post 内容。接下来就可以通过发送。因为可能会存在目标为。如何目标数据包回显存。_h3c rce
文章浏览阅读634次,点赞3次,收藏8次。编程是指使用计算机语言编写代码,以实现计算机程序的过程。编程是一种创造性的活动,它要求程序员具备逻辑思维、分析问题和解决问题的能力。编程可以用于开发各种类型的软件,例如桌面应用程序、移动应用程序、网站、游戏等。Java是一门面向对象编程语言,它由 Sun Microsystems 公司于 1995 年推出。不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。_java基础知识点面试
文章浏览阅读4.2k次。作者简介:焦硕,博士毕业于西北农林科技大学,目前在北京大学做博士后。文章链接 https://doi.org/10.1016/j.soilbio.2016.04.005主编按:此文于2016年发表于Soil Biology and Biochemistry (IF=4.926),文章思路清楚、图表美观,发表不到两年引用24次(超杂志平均引用2倍),更被众多同行选为学习的经典示范材料。今天诚...
文章浏览阅读1.6k次。使用 systemd 管理 MySQL 的场景下,MySQL 提供的相关程序 mysqld_pre_systemd 及 [email protected] 存在一些缺陷,本文旨在指出缺陷并修改脚本来修复它们。_mysqld_pre_systemd
文章浏览阅读3.9k次。JAVA 前端上传文件,后端解析文件流并写入数据库_后端怎么把前端传的文件导入
文章浏览阅读182次。1、使用clipboard.min.js工具,引用此js 注意事项: IOS微信网页开发中,若使用此工具来开发复制功能,则需要在超链接/按钮上新增 onclick=" "2、clipboard使用 <li class="flex ai-center jc-sb"> <div class="reportCode"&..._html5 复制剪贴板
文章浏览阅读5.4k次,点赞2次,收藏19次。1、标准差:标准差是方差的算术平方根。标准差能反映一个数据集的离散程度。平均数相同的两组组数据,标准差未必相同。 --------------------------------------------------------------------------------------------------------2、均方误差:是指参数估计值与参数真值之差平方的期望值(英文解释-MSE: ..._均方根误差matlab
文章浏览阅读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