阅读:1741回复:7
中间层过滤驱动通讯,大家帮帮忙
我的过滤驱动是下层过滤驱动,
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里根本就收不到这些CREATE的IRP,我试着把B放在A之上,这些MJ_CREATE才能收到,但是又不能截获所有USB的IRP,因此郁闷啊 我建立命名设备对象用来通讯,一个过滤设备对象,代码如下 建立过滤驱动设备无名的,然后再建立一个命名的设备对象用来用来通讯代码如下 #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,没有该设备 |
|
沙发#
发布于:2005-05-29 11:25
再贴一遍
1。你自己建立一个ControlDevice,再调用IoCreateSymbolic建立一个连接名字,上层应用程序打开 2。驱动里判断是自己ControlDevice(Create,Close,DeivceIoControl),是就直接处理了 3。不是才IoCallDriver往下传 这些步骤你都做了吗? 4。用ice在MJ_CREATE设置断点调试一下,看看是不是看到了DeviceObject 等于ControlDevice的情况 这是一种非常基本的方法,不会有任何问题,你好好跟踪调试一下 |
|
板凳#
发布于:2005-05-30 11:57
再贴一遍 首先你这种方法我已经使用过了,虽然CREATEFILE成功,虽然DEVICEIOCONTROL成功,但是我在自己驱动里根本收不到这两个IRP,我是下层过滤驱动,是不是我指定设备名,MJ_CREATE也需要从我的上层驱动那里传下来,如果他不传下来呢 |
|
地板#
发布于:2005-05-30 12:26
[quote]再贴一遍 首先你这种方法我已经使用过了,虽然CREATEFILE成功,虽然DEVICEIOCONTROL成功,但是我在自己驱动里根本收不到这两个IRP,我是下层过滤驱动,是不是我指定设备名,MJ_CREATE也需要从我的上层驱动那里传下来,如果他不传下来呢 [/quote] 如果你自己指定名,io manager直接找到你的驱动,根本不通过 你上面的驱动。你在什么时候指定名字?你应该在DriverEntry里创建一个ControlDevice,和AddDevice里的没有任何关系。 这种方法我6年前,做鼠标的过滤器驱动的时候,就在这么用了,没有任何问题 |
|
地下室#
发布于:2005-05-30 17:25
问题是,我能用winobj.exe看到我的设备对象,但是就是CREATEFILE返回NULL,我不知道除了作那些代码以外还有什么代码要写
你能留下你的QQ吗,直接和你说行吗 |
|
5楼#
发布于:2005-05-30 19:13
你把代码发给我吧,我帮你看看,zhao_ck@sohu.com
|
|
6楼#
发布于:2005-05-31 09:26
zhao_ck@sohu.com
大哥,我已经把代码和说明都发到你邮箱了,请你查看一下,如果有什么事情请联系 QQ 10568617 |
|
7楼#
发布于:2005-07-14 09:45
你中间层过滤驱动通讯的问题解决了吗,我是通过中间驱动程序来实现的,你用上面的方法实现了吗。我们可以相互交流交流这两种办法
|
|
|