Win32下VC++重置指定的USB端口/重新启动USB设备方法

2024-04-04 12:04

本文主要是介绍Win32下VC++重置指定的USB端口/重新启动USB设备方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

IOCTL_USB_HUB_CYCLE_PORT 是一个IO控制代码,用于控制USB集线器对特定端口执行重置操作,这有助于重新启动USB设备。在Windows操作系统中,这通常用于修复因为某些原因无法正常通信的USB设备。

在Windows中,你可以使用WinUSB(Windows USB Driver)库或者SetupDi API来发送这个IO控制代码。

以下是一个使用SetupDi API重置USB端口的例子:

#include <windows.h>
#include <setupapi.h>#pragma comment(lib, "setupapi.lib")BOOL ResetUsbPort(LPCWSTR lpDevicePath)
{HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_USB, 0, 0, DIGCF_PRESENT);if (hDevInfo == INVALID_HANDLE_VALUE){return FALSE;}SP_DEVINFO_DATA DeviceInfoData = {0};DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);for (DWORD i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++){LPTSTR path;if (!SetupDiGetDeviceInstanceId(hDevInfo, &DeviceInfoData, &path)){continue;}if (wcsstr(path, lpDevicePath)){HANDLE hDevice = CreateFile(path, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);if (hDevice != INVALID_HANDLE_VALUE){ULONG ulOutValue = 0;BOOL bResult = DeviceIoControl(hDevice, IOCTL_USB_HUB_CYCLE_PORT, &ulOutValue, sizeof(ulOutValue), NULL, 0, NULL, NULL);CloseHandle(hDevice);if (bResult){SetupDiDestroyDeviceInfoList(hDevInfo);return TRUE;}}}HeapFree(GetProcessHeap(), 0, path);}SetupDiDestroyDeviceInfoList(hDevInfo);return FALSE;
}int main()
{LPCWSTR devicePath = L"\\?\\usb#vid_xxxx&pid_xxxx#xxxxxxxxxxxxxxxxxxxxxxxxxxxx#{a5dcbf10-6530-11d2-901f-00c04fb951ed}";// 替换上面的字符串为你的USB设备实际的设备路径if (ResetUsbPort(devicePath)){// 设备重启成功}else{// 设备重启失败}return 0;
}

注意:这个代码需要管理员权限才能运行,并且可能会影响到正在使用的USB设备,因此请谨慎使用。

这篇关于Win32下VC++重置指定的USB端口/重新启动USB设备方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/875735

相关文章

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.