阅读:2106回复:11
USB过滤驱动打开问题?
我是修改的UsbSniffer代码,我把过滤驱动已经附加在了一个USB的驱动上了,并且能够截获所有发送给这个驱动的IRP,安装,卸载完全正常,可是我使用应用程序和此过滤驱动通讯时候出现问题
大概是这样的 驱动 GUID InterfaceClassGuid=RegSampleDevice_CLASS_GUID; IoRegisterDeviceInterface (pdo,&InterfaceClassGuid,NULL,&nameString); IoSetDeviceInterfaceState (&nameString,TRUE); 此时nameString返回\\\\\\\\.\\\\USB#Vid_07d0&Pid_4100#5&16304b08&0&1#{c6afb5ed-ca11-4b0f-84b5-b48a442d9263} 应用程序 直接使用这个名字CreateFile成功,然后使用DeviceIoControl也返回成功,但是驱动没有收到MJ_CREATE和MJ_DRIVER_CONTROL 我已经郁闷很久了,哪位能帮我提示一下, |
|
沙发#
发布于:2005-05-25 22:06
我是修改的UsbSniffer代码,我把过滤驱动已经附加在了一个USB的驱动上了,并且能够截获所有发送给这个驱动的IRP,安装,卸载完全正常,可是我使用应用程序和此过滤驱动通讯时候出现问题 既然你的MJ_CREATE都没有收到,当然就不可能有后面的MJ_DRIVER_CONTROL等了 |
|
|
板凳#
发布于:2005-05-26 10:07
你可以在设置完再查询一下设备接口属性,确认一下是这个GUID
|
|
|
地板#
发布于:2005-05-26 12:54
谢谢大哥们得参与,
现在我知道为什么我收不到MJ_CREATE了,因为我的过滤驱动是lower的,上层的没有把MJ_CREATE向下传, 于是我这样。 建立过滤驱动设备无名的,然后再建立一个命名的设备对象用来用来通讯代码如下 #define USBFILTER_NT_NAME L\"\\\\Device\\\\usbsnoop\" #define USBFILTER_DOS_NAME L\"\\\\DosDevices\\\\usbsnoop\" RtlInitUnicodeString( &nameString, USBFILTER_NT_NAME ); RtlInitUnicodeString( &LinkName, USBFILTER_DOS_NAME ); status = IoCreateDevice(DriverObject, 0, &nameString, FILE_DEVICE_UNKNOWN, 0, FALSE, &g_ControlDeviceObject); status =IoCreateSymbolicLink(&LinkName,&nameString); 这些都成功。 我用WINOBJ查看了在\\?\\里已经有了一个LINK,但是 我 HANDLE hDev = CreateFile(_T(\"\\\\\\\\.\\\\usbsnoop\") GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 失败,错误是2,没有该设备 请问谁能给点提示,是不是我的MJ_CREATE没有些对,还是 |
|
地下室#
发布于:2005-05-26 14:07
鉴定:方法是完全可行的(实际使用过)。
[编辑 - 5/27/05 by richer-w] |
|
|
5楼#
发布于:2005-05-26 18:40
在IoCreateDevice里面还是指定一个设备扩展试试呢?
能不能具体点, 指定一个设备扩展用来何意义呢,能不能把你的代码给我关键一段给我看看,不甚感谢 |
|
6楼#
发布于:2005-05-26 20:26
在IoCreateDevice里面还是指定一个设备扩展试试呢? 应该跟设备扩展没有关系。 你要在MJ_CREATE,Close,DeviceIoControl函数里判断一下,是你的ControlDevice,就直接处理了,不是ControlDevice,再IoCallDriver往下传 就应该ok了 |
|
7楼#
发布于:2005-05-27 09:03
谢谢大哥们得参与, 这个问题最好的办法是在你的IRP_MJ_CREATE处理例程入口下断点,调试一下 |
|
|
8楼#
发布于:2005-05-29 10:07
我的过滤驱动是下层过滤驱动,
A,B,C,D四层驱动层,A是USB设备的驱动,例如你装了USB红外适配器,然后你出现了A, C是USB的类驱动吧,D是PDO,由于USB都是很多IRP内部产生的,是由A产生直接给C的,因此装A的上层过滤就截获不到这些内部IRP, 应此我装了B,装在A,C之间, 但是我需要和B通讯,我的MJ_CREATE这些,都在A这里就不往下传了,我在B里根本就收不到这些IRP,我试着把B放在A之上,这些MJ_CREATE才能收到,但是又不能截获所有USB的IRP,因此郁闷啊 我就算用命名设备对象,也不知道怎么去和他通讯 |
|
9楼#
发布于:2005-05-29 11:21
我的过滤驱动是下层过滤驱动, 1。你自己建立一个ControlDevice,再调用IoCreateSymbolic建立一个连接名字,上层应用程序打开 2。驱动里判断是自己ControlDevice(Create,Close,DeivceIoControl),是就直接处理了 3。不是才IoCallDriver往下传 4。用ice在MJ_CREATE设置断点调试一下,看看是不是看到了DeviceObject 等于ControlDevice的情况 这是一种非常基本的方法,不会有任何问题,你好好跟踪调试一下 |
|
10楼#
发布于:2005-05-31 11:00
感谢zhaock,问题解决
也感谢所有参与的人,我爱你们 |
|
11楼#
发布于:2005-07-26 18:17
论坛上有很多类似的贴子,没有一个完整的,能否麻烦老兄将最后解决的标准代码贴出来??/
|
|