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_unitmaskLogical 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/
是設備類,裏面是驅動項,包含驅動程序信息