基于消息方式的usb监测完整基础代码

C++ 实现usb插入操作监控 // usbTest.cpp: 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include #include using namespace std; #include /*------------------------------------------------------------- 阅读详情
 //   der_USB_Dieb.cpp   :   Defines   the   entry   point   for   the   application.  
  //  
   
  #include   "stdafx.h"  
  #include   "resource.h"  
   
  #include     <setupapi.h>      
     
  #include     <regstr.h>      
  #include     <winbase.h>      
     
  #include     <Dbt.h>  
   
  LPVOID   pszMySharedMapView;  
   
  char   FirstDriveFromMask   (ULONG   unitmask)  
  {  
        char   i;  
   
        for   (i   =   0;   i   <   26;   ++i)  
        {  
              if   (unitmask   &   0x1)  
                    break;  
              unitmask   =   unitmask   >>   1;  
        }  
   
        return   (i   +   'A');  
  }  
   
  void   DeviceChangeEventOpt(WPARAM   wParam,   LPARAM   lParam)  
  {  
  switch(wParam)  
  {  
  // case   DBT_CONFIGCHANGECANCELED:  
  // MessageBox(NULL,"设备改变DBT_CONFIGCHANGECANCELED","提示",MB_OK);  
  // break;  
  // case   DBT_CONFIGCHANGED:  
  // MessageBox(NULL,"设备改变DBT_CONFIGCHANGED","提示",MB_OK);  
  // break;  
  // case   DBT_CUSTOMEVENT:    
  // MessageBox(NULL,"设备改变DBT_CUSTOMEVENT","提示",MB_OK);  
  // break;  
  case   DBT_DEVICEARRIVAL:   //   A   device   has   been   inserted   and   is   now   available.      
   
  // MessageBox(NULL,"设备改变DBT_DEVICEARRIVAL","提示",MB_OK);  
   
  DEV_BROADCAST_HDR   *stHDR;  
  stHDR   =   (DEV_BROADCAST_HDR   *)lParam;  
   
  //判断设备类型  
  switch(stHDR->dbch_devicetype)  
  {  
  // case   DBT_DEVTYP_DEVICEINTERFACE:    
  // MessageBox(NULL,"设备类型   DBT_DEVTYP_DEVICEINTERFACE","提示",MB_OK);  
  // break;  
  // case   DBT_DEVTYP_HANDLE:    
  // MessageBox(NULL,"设备类型   DBT_DEVTYP_HANDLE","提示",MB_OK);  
  // break;  
  // case   DBT_DEVTYP_OEM:    
  // MessageBox(NULL,"设备类型   DBT_DEVTYP_OEM","提示",MB_OK);  
  // break;  
  // case   DBT_DEVTYP_PORT:  
  // MessageBox(NULL,"设备类型   DBT_DEVTYP_PORT","提示",MB_OK);  
  // break;  
  case   DBT_DEVTYP_VOLUME:// Logical   volume.   This   structure   is   a   DEV_BROADCAST_VOLUME   structure  
  DEV_BROADCAST_VOLUME   *lpdbv=(DEV_BROADCAST_VOLUME   *)&stHDR;  
  char   szPath[_MAX_PATH]={0};  
   
  sprintf(szPath,"%c,%lx",  
  FirstDriveFromMask(lpdbv   ->dbcv_unitmask),lpdbv->dbcv_flags);  
  MessageBox(NULL,szPath,"提示",MB_OK);  
  break;  
  }  
  //  
   
  break;  
  // case   DBT_DEVICEQUERYREMOVE:    
  // MessageBox(NULL,"设备改变DBT_DEVICEQUERYREMOVE","提示",MB_OK);  
  // break;  
  // case   DBT_DEVICEQUERYREMOVEFAILED:    
  // MessageBox(NULL,"设备改变DBT_DEVICEQUERYREMOVEFAILED","提示",MB_OK);  
  // break;  
  // case   DBT_DEVICEREMOVECOMPLETE://   A   device   has   been   removed.    
  // MessageBox(NULL,"设备改变DBT_DEVICEREMOVECOMPLETE","提示",MB_OK);  
  // break;  
  // case   DBT_DEVICEREMOVEPENDING://    
  // MessageBox(NULL,"设备改变DBT_DEVICEREMOVEPENDING","提示",MB_OK);  
  // break;  
  // case   DBT_DEVICETYPESPECIFIC://    
  // MessageBox(NULL,"设备改变DBT_DEVICETYPESPECIFIC","提示",MB_OK);  
  // break;  
  // case   DBT_QUERYCHANGECONFIG:      
  // MessageBox(NULL,"设备改变DBT_QUERYCHANGECONFIG","提示",MB_OK);  
  // break;  
  // case   DBT_USERDEFINED   ://  
  // MessageBox(NULL,"设备改变DBT_USERDEFINED","提示",MB_OK);  
  // break;  
   
  }  
   
  //       PDEV_BROADCAST_HDR   lpdb   =   (PDEV_BROADCAST_HDR)lParam;  
  //       char   szMsg[80];  
  //  
  //       switch(wParam)  
  //       {  
  //             case   DBT_DEVICEARRIVAL:  
  //                   //   Check   whether   a   CD   or   DVD   was   inserted   into   a   drive.  
  //                   if   (lpdb   ->   dbch_devicetype   ==   DBT_DEVTYP_VOLUME)  
  //                   {  
  //                         PDEV_BROADCAST_VOLUME   lpdbv   =   (PDEV_BROADCAST_VOLUME)lpdb;  
  //  
  //                         if   (lpdbv   ->   dbcv_flags   &   DBTF_MEDIA)  
  //                         {  
  //                               sprintf   (szMsg,   "Drive   %c:   Media   has   arrived./n",  
  //                                                   FirstDriveFromMask(lpdbv   ->dbcv_unitmask));  
  //  
  //                               MessageBox   (NULL,   szMsg,   "WM_DEVICECHANGE",   MB_OK);  
  //                         }  
  //                   }  
  //                   break;  
  //  
  //             case   DBT_DEVICEREMOVECOMPLETE:  
  //                   //   Check   whether   a   CD   or   DVD   was   removed   from   a   drive.  
  //                   if   (lpdb   ->   dbch_devicetype   ==   DBT_DEVTYP_VOLUME)  
  //                   {  
  //                         PDEV_BROADCAST_VOLUME   lpdbv   =   (PDEV_BROADCAST_VOLUME)lpdb;  
  //  
  //                         if   (lpdbv   ->   dbcv_flags   &   DBTF_MEDIA)  
  //                         {  
  //                               sprintf   (szMsg,   "Drive   %c:   Media   was   removed./n",  
  //                                                   FirstDriveFromMask(lpdbv   ->dbcv_unitmask));  
  //  
  //                               MessageBox   (NULL,   szMsg,   "WM_DEVICECHANGE",   MB_OK);  
  //                         }  
  //                   }  
  //                   break;  
  //  
  //             default:  
  //                       /*  
  //                             Process   other   WM_DEVICECHANGE   notifications   for   other    
  //                             devices   or   reasons.  
  //                       */    
  //                         ;  
  //       }  
   
  }  
   
   
   
  INT_PTR   CALLBACK   DialogProc(                     HWND   hDlg,  
          UINT   uMsg,  
          WPARAM   wParam,  
          LPARAM   lParam  
  )  
  {  
  switch   (uMsg)   {    
  case   WM_INITDIALOG:    
  {  
  //only   one   instance  
  HANDLE   hInstanceMap=CreateFileMapping(((HANDLE)0xFFFFFFFF),  
  NULL,PAGE_READWRITE,0,0x10,"der   USB   Dieb");  
   
  if   (hInstanceMap   !=   NULL   &&   GetLastError()   ==   ERROR_ALREADY_EXISTS)    
  {    
  MessageBox(hDlg,"ALREADY_EXISTS","exit",MB_ICONEXCLAMATION|MB_OK);  
  CloseHandle(hInstanceMap);    
  hInstanceMap   =   NULL;  
  PostMessage(hDlg,WM_CLOSE,0,0);  
  return   TRUE;  
  }    
  pszMySharedMapView=MapViewOfFile(hInstanceMap,FILE_MAP_READ|FILE_MAP_WRITE  
  ,0,0,0);    
  //sprintf(pszMySharedMapView,"%d");  
  //CopyMemory(pszMySharedMapView,&hDlg,sizeof(hDlg));  
  sprintf((PCHAR)pszMySharedMapView,"%lx",(long)hDlg);  
   
  //Setup   USB   message   receiver  
  DEV_BROADCAST_DEVICEINTERFACE   NotificationFilter;  
  DWORD   Err;  
   
  ZeroMemory(   &NotificationFilter,   sizeof(NotificationFilter)   );  
  NotificationFilter.dbcc_size   =    
  sizeof(DEV_BROADCAST_DEVICEINTERFACE);  
  NotificationFilter.dbcc_devicetype   =   DBT_DEVTYP_DEVICEINTERFACE;  
  //NotificationFilter.dbcc_classguid   =   GUID_DEVINTERFACE_USB_DEVICE;  
   
  HANDLE   hDevNotify   =   RegisterDeviceNotification(   GetModuleHandle(NULL),    
  &NotificationFilter,  
  DEVICE_NOTIFY_WINDOW_HANDLE  
  );  
   
  if(!hDevNotify)    
  {  
  Err   =   GetLastError();  
  PostMessage(hDlg,WM_CLOSE,0,0);  
  return   TRUE;  
  }  
   
  return   TRUE;    
  }  
  case   WM_COMMAND:    
  switch(LOWORD(wParam)){    
  case   IDOK:    
  case   IDCANCEL:    
  EndDialog(hDlg,   LOWORD(wParam));    
  }    
  return   TRUE;    
   
  case   WM_NCPAINT   :    
  //Hide   window  
  ShowWindow(hDlg,SW_HIDE);  
  return   TRUE;    
  break;  
  // case   WM_DESTROY   :    
  case   WM_NCDESTROY   :    
  MessageBox(hDlg,"WM_DESTROY","exit",MB_ICONEXCLAMATION|MB_OK);  
  if   (!UnmapViewOfFile(pszMySharedMapView))  
  {}  
  return   TRUE;    
  break;  
  case   WM_DEVICECHANGE:  
  DeviceChangeEventOpt(wParam,lParam);  
  return   TRUE;    
  }    
  return FALSE;    
  }  
   
   
  int   APIENTRY   WinMain(HINSTANCE   hInstance,  
                                            HINSTANCE   hPrevInstance,  
                                            LPSTR           lpCmdLine,  
                                            int               nCmdShow)  
  {  
    int   ret=DialogBoxParam   (hInstance,MAKEINTRESOURCE(IDD_MAIN),NULL,(DLGPROC)DialogProc,0);  
   
  return(ret   !=   IDOK);    
  }   
    
   
获取USB设备插拔消息的备忘 获取USB设备插拔消息的备忘coolslob(coolslob@163.com)先记录要点,有空再整理成文。1、可根据dbch_devicetype(DBT_DEVTYP_DEVICEINTERFACE和DBT_DEVTYP_VOLUME),分别得到PID/VID/SN和盘符号。2、当USB设备不是存储设备时,只出发一次WM_DEVICECHANGE,devicetype是DBT_DEVTYP_D 阅读详情

相关推荐

RISC-V USB PD诱骗器:五档电压主动协商与高精度功率监测

USB Power Delivery(PD)是一种基于CC信道BMC编码的双向数字电源协商协议,其核心在于Source与Sink设备通过动态握手实现电压/电流自适应调整。理解PD协议栈、Sink角色行为及物理层(PHY)交互原理,对快充开发、电源验证与嵌入式能效测试至关重要。本方案聚焦PD诱骗(Emulation)技术,利用RISC-V微控制器协同专用PD PHY芯片(如CH224K),实现对5V/9V/12V/15V/20V标准档位的主动电压请求与稳定维持,并集成高精度电流检测(INA219)与实时功率分

weixin_33068055的博客 274

U盘文件盗取

U盘文件盗取(Win32程序) 要根据下面的流程图来做,先做一个捕捉消息的窗口,如果插入U盘的话,窗口会捕捉到WM_DEVICECHANGE消息,窗口一直处于激活状态,所每次捕捉到消息就会调用获取盘符的函数,并且创建一个线程调用复制函数。最后写出工作日志。 首先是创建窗口函数 这里需要注意的是因为我项目用的字符集是Unicode 所以字符串前都加了L 如果需要修改的话就点击项目->属性->高级-> // 程序入口点 int CALLBACK WinMain( _In_ HINS

Magic_TA的博客 1331

Unity_USB真机测试,以ADB的方式运行Profiler

运行环境:Unity5.3、Windows7、Android手机 1.配置 a)手机通过USB连接到电脑 b)如果没有adb的同学请自行下载adb(就是红框中的那个东东) c)unity: 把平台切换为Android平台 选择File-&amp;amp;gt;Build Settings… 勾选Development Build和Autoconnect Profiler d)cmd: 找...

wy小骑士 5534

WINDOWS SDK 检测U盘插入

工作需要,需要随时检测U盘的插入或拔出状态,在网上搜索到下列方法:今天一位老兄要我帮忙做一个软件,需要把在U盘插入USB接口激活之后自动把U盘里的内容拷贝到硬上。拷贝文件不难,麻烦的就是不知道怎么检测U盘是否激活,激活后又是哪个盘符。google了一下,在MSDN上看了几个例子,找到了检测U盘插入,并确定其盘符的方法。下面给出窗口的回调函数:LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {

Amy_1007的专栏 5211

手把手调试USB PD协议:如何用逻辑分析仪抓取并解析‘数据消息’(以Source_Capabilities为例)

本文详细介绍了如何使用逻辑分析仪调试USB PD协议,重点解析Source_Capabilities数据消息的结构与解码方法。通过硬件装备清单、软件工具链配置及实战案例,帮助开发者掌握协议层数据捕获与分析技巧,解决充电协商中的常见问题。

weixin_30908941的博客 397

保姆级教程:用K230和USB转TTL模块,5分钟搞定串口通信(附完整代码)

本文提供了一份详细的K230开发板串口通信教程,从硬件连接到MicroPython代码解析,帮助开发者快速实现串口通信功能。教程涵盖了硬件准备、软件配置、代码解析及常见问题解决方案,特别适合嵌入式开发新手。

weixin_33738555的博客 516

c++监控u盘插入拔出

#include <windows.h> #include <dbt.h> char FirstDriveFromMask(ULONG unitmask) { char i; for (i = 0; i < 26; ++i) { if (unitmask & 0x1) ...

weixin_30617561的博客 696

USB3.0热插拔检测电路实现:项目应用实例

深入解析USB3.0热插拔检测电路的实现原理,结合实际项目案例,展示信号稳定性和插拔响应的优化方案,突出usb3.0高速传输特性与系统兼容性设计要点。

weixin_30674431的博客 1528

WPF 窗口接收 Windows 消息

▪ Windows 消息 在做一些 COM 串口、USB 相关的软件时,我们需要程序实时监测这些端口的状态:比如是否新插入、是否拔出等等,从而让软件做出相应的动作。 实际编写过程中, ▪ WPF 处理 Windows 消息的几种方式 1. Windows API 钩子 WPF 的窗体并没有 Winform 中的 Handle,所以在使用 API 时并不能直接使用设置或者移除钩子。要想使用 API 的 SetWindowsHookEx, UnhookWindowsHookEx, CallNextHookEx

外来物种 2428

USB PD诱骗器设计:RISC-V+CH224K的协议验证与功率监测终端

USB PD诱骗器是用于模拟受电设备、主动协商USB Type-C供电参数的关键测试工具,其本质是基于USB Power Delivery协议的负载仿真与双向通信系统。工作原理依托BMC编码物理层、Structured VDM协议栈及实时电压电流采样闭环,技术价值在于替代传统固定电阻负载,实现可编程电压档位(5V/9V/12V/15V/20V)、毫秒级响应与高精度功率计量。典型应用于PD充电器合规性验证、快充线缆压降分析、移动电源能效评估等硬件调试场景。本设计采用RISC-V微控制器CH32V003与专用P

weixin_36123300的博客 367

TMS320F280x通过TUSB3410实现USB转串口通信的完整方案

在嵌入式系统开发中,串口通信(UART)作为一种基础且广泛使用的异步串行通信协议,因其简单可靠而成为设备与上位机交互的经典方式。其工作原理基于起始位、数据位、停止位的帧格式,通过约定的波特率实现数据收发。随着PC接口的演进,原生串口逐渐被USB取代,这使得USB转串口桥接技术成为连接嵌入式设备与现代计算机的关键桥梁。该技术的核心价值在于,它将复杂的USB协议栈对嵌入式工程师透明化,开发者只需使用熟悉的串口编程接口,即可实现高速、稳定的数据交换,极大降低了开发门槛。这一方案在工业控制、电机驱动、数字电源等对实

weixin_34268310的博客 623

USB虚拟串口实现多字节数据接收,基于stm32h743

USB虚拟串口很具有实用价值,由于USB内核协议的限制,串口一次性最多接收64字节数据,本文通过对正点原子接收函数的改写实现了任意字节数据的接收,亲测好用,供大家参考,谢谢!

tutu_hu的博客 7889

USB3.1 Type-C接口测试实战:从信号完整性到PD协议全解析

高速串行接口是现代电子设备实现高速数据传输的核心技术,其核心原理在于通过差分信号和先进的编码技术(如8b/10b、128b/132b编码)来克服信道损耗和噪声,确保信号完整性。这项技术的价值在于为消费电子提供了高带宽、低延迟的数据通道,广泛应用于外部存储、显示扩展和高速外设连接等场景。以USB3.1 Type-C接口为例,它集成了高速数据传输、智能供电(Power Delivery)和多协议复用能力,其测试验证是确保产品可靠性的关键环节。测试重点包括利用眼图分析评估信号质量,以及通过协议分析仪验证PD协商流

weixin_30335353的博客 422

USB-HUB 不识别设备?可能这样解决

USB-HUB无法识别设备常因供电不足、信号干扰或协议错误导致。本文结合实际案例与硬件调试经验,分析设备枚举失败原因,提出自供电改造、信号完整性优化等解决方案,适用于工业与嵌入式场景。

food6的博客 2450

基于C++的USB插拔检测程序设计与实现

随着项目规模扩大,将设备监听逻辑分散在多个窗口类中会导致代码重复与维护困难。为此,应设计一个独立的类,集中管理设备注册、事件解析与回调分发,实现关注点分离。Windows平台为不同类型的设备接口预定义了一系列全局唯一标识符(GUID),这些GUID用于在设备安装过程中向即插即用管理器声明设备所属的功能类别。当应用程序需要监听某一类设备的接入事件时,必须明确指定对应的接口类GUID,以便通过等API准确过滤目标设备集合。

weixin_32445049的博客 745

USB 3.0 Type-C设计核心要点

本文深入分析USB 3.0 Type-C测试板的原理图与PCB设计关键技术,涵盖高速信号完整性、差分阻抗控制、CC引脚检测机制、PD协议交互、ESD防护及电源管理等内容,强调系统级设计对稳定性和可靠性的决定性影响。

d6e7f8g9h的博客 1250

USB枚举过程 USB Enumeration

USB架构中, hub负责检测设备的连接和断开,利用其中断IN端点(Interrupt IN Endpoint)来向主机(Host)报告。在系统启动时,主机轮询它的根hub(Root Hub)的状态看是否有设备(包括子hub和子hub上的设备)连接。USB总线拓扑结构见下图(最顶端为主机的Root Hub): USB总线拓扑结构 (USB Bus Topology)

DriverMonkey的专栏 1613

PCIe 物理层(Physical Layer)详解

PCIe物理层关键技术解析 PCIe物理层作为协议栈底层核心,承担着比特流传输、链路训练与电气特性管理等关键功能。该层采用分层架构,包含逻辑物理层(负责编解码/加扰)和电气物理层(处理信号收发)。关键技术亮点包括: 智能链路管理:通过LTSSM状态机实现11种状态转换,涵盖链路检测(Detect)、协商(Polling/Configuration)、功耗管理(L0s/L1)等全生命周期控制 高效编码方案:Gen1/Gen2采用8b/10b编码(20%开销),Gen3+升级为128b/130b(仅1.5%开销

珂珂可爱多 730

USB PD协议:从物理层到策略引擎的深度技术解析

本文深入解析USB PD协议,从物理层的BMC编码与CC通道机制,到数据包结构、状态机驱动的协商流程,再到策略引擎的核心决策逻辑。详细探讨了Fixed PDO与PPS APDO的应用,并涵盖协议安全认证与VDM扩展机制,为嵌入式与硬件开发者提供底层技术实现细节。

numpy6sculptor的博客 1026

YOLOv11低照度增强主干网络PE-YOLO:原理与完整实现教程

编码器部分# 解码器部分self.dec_conv2 = nn.Conv2d(512, 128, 3, padding=1) # 跳跃连接self.dec_conv3 = nn.Conv2d(256, 64, 3, padding=1) # 跳跃连接self.dec_conv4 = nn.Conv2d(128, 32, 3, padding=1) # 跳跃连接# 编码路径# 解码路径(带跳跃连接)

FJN110的博客 728

学Simulink--复杂路况场景实例:基于Simulink的智能车辆高速公路行驶仿真(超车与车道变换)

本文详细介绍了基于Simulink的智能车辆高速公路超车仿真系统设计方法。系统包含多车道交通流建模、三层超车决策逻辑(触发条件、可行性检查、执行许可)、五次多项式变道轨迹规划以及横向纵向协同控制等核心模块。通过设定三车道场景(自车初始速度100km/h,前方慢车72km/h),演示了如何实现安全高效的左变道超车全过程(5秒完成3.75m横向移动),并验证了变道平滑性(最大横向加速度1.8m/s²)和安全距离(最小TTC 5.2s)。文章还强调了传感器融合的必要性,并提供了从交通流生成到控制器设计的完整Sim

xiaoheshang_123的博客 397
上一篇: 使用OllyDbg 分析 USB HID 设备接口协议
下一篇: 反静态反汇编技术
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值