USB设备的Windows应用消息

 1 注册接收设备消息

 DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;

 ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
 NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
 NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
 //HKEY_MACHINE/System/CurrentControlSet/Control/DeviceClasses/
 //HKEY_MACHINE/System/CurrentControlSet/Control/Class/
 GUID InterfaceClassGuid= {0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED}; //USB INTF
 NotificationFilter.dbcc_classguid = InterfaceClassGuid;

 HDEVNOTIFY hDevNotify = RegisterDeviceNotification(m_hWnd,&NotificationFilter,DEVICE_NOTIFY_WINDOW_HANDLE);
 //UnregisterDeviceNotification(hDevNotify);

2 消息接收

......

 ON_MESSAGE(WM_DEVICECHANGE,OnDevChange)
......

LRESULT CEKeyMsgDlg::OnDevChange(WPARAM wPar,LPARAM lPar)
{
 PDEV_BROADCAST_HDR pDevHdr=NULL;
 PDEV_BROADCAST_PORT pDevPort=NULL;
 PDEV_BROADCAST_VOLUME pDevVol=NULL;
 PDEV_BROADCAST_DEVICEINTERFACE pDevIntf=NULL;
 if(lPar)
 {
  pDevHdr= (PDEV_BROADCAST_HDR)lPar;
  if(pDevHdr->dbch_devicetype==DBT_DEVTYP_PORT)
   pDevPort= (PDEV_BROADCAST_PORT)lPar;
  if(pDevHdr->dbch_devicetype==DBT_DEVTYP_VOLUME)
   pDevVol= (PDEV_BROADCAST_VOLUME)lPar;
  else if(pDevHdr->dbch_devicetype==DBT_DEVTYP_DEVICEINTERFACE)
   pDevIntf= (PDEV_BROADCAST_DEVICEINTERFACE)lPar;
 }
 //pDevPort->dbcp_name: DSK1:
 switch(wPar)
 {
 case DBT_DEVNODES_CHANGED:
  break;
 case DBT_DEVICEARRIVAL: //insert
  break;
 case DBT_DEVICEREMOVECOMPLETE: //draw
  break;
 }
 return 0;
}

3 U盘盘符的获取

DEV_BROADCAST_VOLUME.dbcv_unitmask

Logical unit mask identifying one or more logical units. Each bit in the mask corresponds to one logical drive. Bit 0 represents drive A, bit 1 represents drive B, and so on.

比如

dbcv_unitmask=000000c0

从右边开始,对应的二进制是:

000000110000......,对应的盘符是:

abcdefgh,即g、h为1,所以U盘对应的盘符是g:和h:

 

4 厂家标识和产品标识

DEV_BROADCAST_DEVICEINTERFACE.dbcc_name

Vid_厂家标识&Pid_产品标识

 

5 注册表

//HKEY_MACHINE/System/CurrentControlSet/Control/DeviceClasses/

是接口类,里面有各Vendor和Product,可得到符号链接

//HKEY_MACHINE/System/CurrentControlSet/Enum

是符号链接项,可得到设备类和驱动项
//HKEY_MACHINE/System/CurrentControlSet/Control/Class/

是设备类,里面是驱动项,包含驱动程序信息

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章