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/
是设备类,里面是驱动项,包含驱动程序信息