linan1003
驱动牛犊
驱动牛犊
  • 注册日期2005-05-05
  • 最后登录2010-02-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1741回复:7

中间层过滤驱动通讯,大家帮帮忙

楼主#
更多 发布于:2005-05-29 10:18
我的过滤驱动是下层过滤驱动,
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,没有该设备
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-05-29 11:25
再贴一遍
1。你自己建立一个ControlDevice,再调用IoCreateSymbolic建立一个连接名字,上层应用程序打开
2。驱动里判断是自己ControlDevice(Create,Close,DeivceIoControl),是就直接处理了
3。不是才IoCallDriver往下传
这些步骤你都做了吗?
4。用ice在MJ_CREATE设置断点调试一下,看看是不是看到了DeviceObject 等于ControlDevice的情况
这是一种非常基本的方法,不会有任何问题,你好好跟踪调试一下
linan1003
驱动牛犊
驱动牛犊
  • 注册日期2005-05-05
  • 最后登录2010-02-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-05-30 11:57
再贴一遍
1。你自己建立一个ControlDevice,再调用IoCreateSymbolic建立一个连接名字,上层应用程序打开
2。驱动里判断是自己ControlDevice(Create,Close,DeivceIoControl),是就直接处理了
3。不是才IoCallDriver往下传
这些步骤你都做了吗?
4。用ice在MJ_CREATE设置断点调试一下,看看是不是看到了DeviceObject 等于ControlDevice的情况
这是一种非常基本的方法,不会有任何问题,你好好跟踪调试一下


首先你这种方法我已经使用过了,虽然CREATEFILE成功,虽然DEVICEIOCONTROL成功,但是我在自己驱动里根本收不到这两个IRP,我是下层过滤驱动,是不是我指定设备名,MJ_CREATE也需要从我的上层驱动那里传下来,如果他不传下来呢
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-05-30 12:26
[quote]再贴一遍
1。你自己建立一个ControlDevice,再调用IoCreateSymbolic建立一个连接名字,上层应用程序打开
2。驱动里判断是自己ControlDevice(Create,Close,DeivceIoControl),是就直接处理了
3。不是才IoCallDriver往下传
这些步骤你都做了吗?
4。用ice在MJ_CREATE设置断点调试一下,看看是不是看到了DeviceObject 等于ControlDevice的情况
这是一种非常基本的方法,不会有任何问题,你好好跟踪调试一下


首先你这种方法我已经使用过了,虽然CREATEFILE成功,虽然DEVICEIOCONTROL成功,但是我在自己驱动里根本收不到这两个IRP,我是下层过滤驱动,是不是我指定设备名,MJ_CREATE也需要从我的上层驱动那里传下来,如果他不传下来呢 [/quote]
如果你自己指定名,io manager直接找到你的驱动,根本不通过
你上面的驱动。你在什么时候指定名字?你应该在DriverEntry里创建一个ControlDevice,和AddDevice里的没有任何关系。
这种方法我6年前,做鼠标的过滤器驱动的时候,就在这么用了,没有任何问题
linan1003
驱动牛犊
驱动牛犊
  • 注册日期2005-05-05
  • 最后登录2010-02-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-05-30 17:25
问题是,我能用winobj.exe看到我的设备对象,但是就是CREATEFILE返回NULL,我不知道除了作那些代码以外还有什么代码要写
你能留下你的QQ吗,直接和你说行吗
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2005-05-30 19:13
你把代码发给我吧,我帮你看看,zhao_ck@sohu.com
linan1003
驱动牛犊
驱动牛犊
  • 注册日期2005-05-05
  • 最后登录2010-02-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-05-31 09:26
zhao_ck@sohu.com
大哥,我已经把代码和说明都发到你邮箱了,请你查看一下,如果有什么事情请联系 QQ 10568617
zzq191
驱动中牛
驱动中牛
  • 注册日期2001-08-09
  • 最后登录2018-05-29
  • 粉丝17
  • 关注0
  • 积分1041分
  • 威望716点
  • 贡献值0点
  • 好评度318点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2005-07-14 09:45
你中间层过滤驱动通讯的问题解决了吗,我是通过中间驱动程序来实现的,你用上面的方法实现了吗。我们可以相互交流交流这两种办法
QQ:416331891,承接windows下应用和驱动的开发,雅虎通:zzq191, Email:zzq191@21cn.com
游客

返回顶部