阅读:1925回复:5
关于监控USB设备
我想在文件过滤驱动里能监测USB设备的插入和拔出。在有USB插入时就attach一个filter到这个设备上,拔出的时候就unattach。看filemon的源码发现它没有实现这样的功能,请高手指教该如何实现?
|
|
沙发#
发布于:2004-11-18 13:24
csdn faq
你好,用过U盘的都知道,如果要安全的拔除U盘,必须通过右下的”安全拔下或弹出“的小工具来进行。我现在想自己写一段代码来安全地删除某个usb设备,不知如何下手,请高手赐教。 谢谢。 完整代码如下,在VC6,2000环境下编译通过。 谢谢大家捧场,特别感谢codewarrior(会思考的草)和 holyeagle(一杯清茶)两位朋友,没有你们我肯定解决不了这个问题。另外,也感谢tikomo software(日本),他们的例子让我少走了许多弯路。 谢谢大家,散分了. #include <tchar.h> #include <stdio.h> #include <windows.h> #include <devguid.h> #define DWORD_PTR DWORD #define ULONG_PTR DWORD extern "C" { #include "hidsdi.h" } // 需加入hid.lib #include <setupapi.h> // 需加入setupapi.lib #include <regstr.h> #include <winbase.h> #include <cfgmgr32.h> // 需要加入cfgmgr32.lib #include <initguid.h> //#include <usbiodef.h> DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE, 0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED); #define GUID_CLASS_USB_DEVICE GUID_DEVINTERFACE_USB_DEVICE int main(int argc, _TCHAR* argv[]) { HDEVINFO hDevInfo; SP_DEVINFO_DATA DeviceInfoData; DWORD i; //-------------------------------------------------------------------------- // 获取设备信息 hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_CLASS_USB_DEVICE, 0, // Enumerator 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE ); if (hDevInfo == INVALID_HANDLE_VALUE) { // 查询信息失败 printf("ERROR - SetupDiGetClassDevs()"); return 1; } //-------------------------------------------------------------------------- // 枚举每个USB设备 DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); for (i=0;SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData);i++) { LPTSTR buffer = NULL; PVOID buffer2 = NULL; DWORD buffersize = 0; ULONG len; CONFIGRET cr; PNP_VETO_TYPE pnpvietotype; CHAR vetoname[MAX_PATH]; ULONG ulStatus; ULONG ulProblemNumber; cr = CM_Get_DevNode_Status( &ulStatus, &ulProblemNumber, DeviceInfoData.DevInst, 0); if ( CR_SUCCESS == cr ) { printf("OK - CM_Get_DevNode_Status()[%d]\n", cr); printf("OK - CM_Get_DevNode_Status() sts [%x]\n", ulStatus); printf("OK - CM_Get_DevNode_Status() pro [%x]\n", ulProblemNumber); } else { printf("ERROR - CM_Get_DevNode_Status()[%d]\n", cr); printf("ERROR - CM_Get_DevNode_Status()[%d]\n", GetLastError()); } // DN_DISABLEABLE or DN_REMOVABLE if ((DN_DISABLEABLE & ulStatus ) != 0 ) { printf("HAS - DN_DISABLEABLE()[%x]\n", DN_DISABLEABLE & ulStatus); } else { continue; } if ((DN_REMOVABLE & ulStatus ) != 0 ) { printf("HAS - DN_REMOVABLE()[%x]\n", DN_REMOVABLE & ulStatus); } else { continue; } len = MAX_PATH; // pnpvietotype = PNP_VetoDevice; cr = CM_Request_Device_Eject( DeviceInfoData.DevInst, &pnpvietotype, vetoname, len, 0 ); if ( CR_SUCCESS == cr ) { printf("OK - CM_Request_Device_Eject()[%d]\n", cr); } else { printf("ERROR - CM_Request_Device_Eject()[%d]\n", cr); printf("ERROR - CM_Request_Device_Eject()[%d]\n", GetLastError()); } } if ( GetLastError()!=NO_ERROR && GetLastError()!=ERROR_NO_MORE_ITEMS ) { // Insert error handling here. return 1; } // Cleanup SetupDiDestroyDeviceInfoList(hDevInfo); return 0; } |
|
|
板凳#
发布于:2004-11-18 09:53
我想在文件过滤驱动里能监测USB设备的插入和拔出。在有USB插入时就attach一个filter到这个设备上,拔出的时候就unattach。看filemon的源码发现它没有实现这样的功能,请高手指教该如何实现? 总线过滤驱动, |
|
|
地板#
发布于:2004-11-17 22:29
你可以在上层获得加载信息,很简单用VC实现,然后传给驱动
|
|
地下室#
发布于:2004-11-15 10:19
顶一下:)
|
|
|
5楼#
发布于:2004-09-27 14:51
用IoRegisterPlugPlayNotification可以监控到已知的USB设备的插入和移出,前提是你知道该设备的GUID,但根据DDK文档的说明似乎该函数不能针对任意的USB设备!但可以肯定的是,如果你知道某个USB设备的GUID,那么这个功能肯定能实现!我曾经做过类似的一个驱动,完全没有问题!
|
|