检测USB和SD卡存储设备的接入和移除
2014-02-27 19:34
393 查看
方法一:依赖窗口
方法二:从注册表入手
方法一:
由于USB存储设备和SD卡都是存储设备,
当设备接入的时候枚举注册表路径"HKEY_LOCAL_MACHINE//Drivers//Active"下的子键,根据 p->dbcp_name;查找自检中与此值匹配的项,查找该项的键项"Key"的值是否包含"Drivers//USB//ClientDrivers//Mass_Storage_Class"字段,如果包含则加入了USB存储设备,若包含带有SD的字段,则加入了SD卡设备
但是当设备移除的时候从注册表里已经找不到这些信息,唯一可行的就是要存储注册表项的内容,显得比较麻烦,而且非得依赖窗口才能实现,在写DLL的时候出现了一些问题,所以寻找下一种方法。
方法二:
思路:
1.枚举注册表路径"HKEY_LOCAL_MACHINE//Drivers//Active"下的子键,
若该键的键项"Key"的值包含"Drivers//USB//ClientDrivers//Mass_Storage_Class",表示该设备为USB设备;
若该键的键项"Key"的值包含"Drivers//SDCARD//ClientDrivers//Class",表示该设备为SD卡设备;
规定,若未SD卡设备value = 1;若未USB存储设备value = 0.
2.枚举的时候采用从head插入,读取的时候从链表头开始读,读到某一项其键项"Key"的值既不代表USB存储设备也不代表SD卡设备的时候停止。
存储求得的和sum;
old_itemNameList = EnumActiveDir();
old_sum = Count(old_itemNameList);
3.监控注册表项"HKEY_LOCAL_MACHINE,TEXT//Drivers//Active",此项发生变化说明有设备接入或者移除,当变化的时候重新枚举并比较变化前后的结构体
cur_itemNameList = EnumActiveDir(); //PREG_ITEM_NAME EnumActiveDir()
compare(old_itemNameList, cur_itemNameList);//比较主要是查看两个结构体子项的数目,如果old比cur大,说明有设备移除,反之有设备添加。
根据old和cur的差值来判断是哪种类型的设备接入或者移除。
EnumActiveDir函数实现如下:
方法二:从注册表入手
方法一:
由于USB存储设备和SD卡都是存储设备,
当设备接入的时候枚举注册表路径"HKEY_LOCAL_MACHINE//Drivers//Active"下的子键,根据 p->dbcp_name;查找自检中与此值匹配的项,查找该项的键项"Key"的值是否包含"Drivers//USB//ClientDrivers//Mass_Storage_Class"字段,如果包含则加入了USB存储设备,若包含带有SD的字段,则加入了SD卡设备
但是当设备移除的时候从注册表里已经找不到这些信息,唯一可行的就是要存储注册表项的内容,显得比较麻烦,而且非得依赖窗口才能实现,在写DLL的时候出现了一些问题,所以寻找下一种方法。
方法二:
思路:
1.枚举注册表路径"HKEY_LOCAL_MACHINE//Drivers//Active"下的子键,
若该键的键项"Key"的值包含"Drivers//USB//ClientDrivers//Mass_Storage_Class",表示该设备为USB设备;
若该键的键项"Key"的值包含"Drivers//SDCARD//ClientDrivers//Class",表示该设备为SD卡设备;
规定,若未SD卡设备value = 1;若未USB存储设备value = 0.
2.枚举的时候采用从head插入,读取的时候从链表头开始读,读到某一项其键项"Key"的值既不代表USB存储设备也不代表SD卡设备的时候停止。
存储求得的和sum;
old_itemNameList = EnumActiveDir();
old_sum = Count(old_itemNameList);
3.监控注册表项"HKEY_LOCAL_MACHINE,TEXT//Drivers//Active",此项发生变化说明有设备接入或者移除,当变化的时候重新枚举并比较变化前后的结构体
cur_itemNameList = EnumActiveDir(); //PREG_ITEM_NAME EnumActiveDir()
compare(old_itemNameList, cur_itemNameList);//比较主要是查看两个结构体子项的数目,如果old比cur大,说明有设备移除,反之有设备添加。
根据old和cur的差值来判断是哪种类型的设备接入或者移除。
EnumActiveDir函数实现如下:
void compare(PREG_ITEM_NAME old_itemNameStruct, PREG_ITEM_NAME cur_itemNameStruct) { PREG_ITEM_NAME old_struct = old_itemNameStruct; PREG_ITEM_NAME cur_struct = cur_itemNameStruct; int old_count = 0; int cur_count = 0; while(old_struct) { old_count++; old_struct = old_struct->pNext; } while(cur_struct) { cur_count++; cur_struct = cur_struct->pNext; } //还原指针指向 cur_struct = cur_itemNameStruct; old_struct = old_itemNameStruct; if((old_count>cur_count) && (old_count-cur_count == 1))//有设备移除 { //取old的最上面一个 new_sum = Count(cur_struct); if(new_sum == old_sum) AfxMessageBox(L"USB设备移除"); else if(old_sum-new_sum == 1 ) AfxMessageBox(L"SD卡移除"); } if((cur_count>old_count) && (cur_count-old_count == 1))//有新设备添加 { new_sum = Count(cur_struct); if(new_sum == old_sum) AfxMessageBox(L"接入USB设备"); else if(new_sum-old_sum == 1 ) AfxMessageBox(L"接入SD卡"); } old_itemNameList = cur_itemNameList; old_sum = new_sum; }
相关文章推荐
- 检测USB和SD卡存储设备的接入和移除
- 检测USB和SD卡存储设备的接入和移除
- 检测USB设备接入和移除
- 两种检测USB设备插入和移除的方法(Ver 2)
- android外接存储设备状态判断-USB和SD卡连接状态
- 编写 USB 存储设备使用痕迹检测和删除工具
- vc检测USB设备插入或移除
- 用 C# 编写 USB 存储设备使用痕迹检测和删除工具
- (转) 两种自动检测USB设备的添加和移除的方法
- USB移动存储设备的检测、写入及弹出
- 两种自动检测USB设备的添加和移除的方法
- 两种自动检测USB设备的添加和移除的方法
- MFC 如何检测到USB设备插入拔出
- 树莓派自动挂载usb移动存储设备
- USB控制大师 公司内部禁用USB存储设备
- 主机如何检测到USB设备连接?
- 用组策略彻底禁止USB存储设备
- 用组策略彻底禁止USB存储设备、光驱、软驱、ZIP软驱
- USB存储设备单向控制的研究与实现
- 树莓派2(Raspberry pi)取消 usb 存储设备的自动挂载