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/

是設備類,裏面是驅動項,包含驅動程序信息

 

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