javayw
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1751回复:18

驱动程序和应用程序通信的问题

楼主#
更多 发布于:2002-11-17 10:30
各位大侠,帮帮忙。给点思路。

我想在当IRP_MJ_CREATE的时候通知应用程序,应用程序出现对话框,让用户选择是否可以继续完成IRP_MJ_CREATE请求,如果可以,则在驱动程序中继续执行,否则取消IRP_MJ_CREATE请求,我该怎么做?
alexe_chen
驱动小牛
驱动小牛
  • 注册日期2002-03-21
  • 最后登录2006-07-31
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-17 11:39
hello! The reference about communication between kernel layer and user layer is  in this site! Pls read it! Secondly,when you use createFile() in app,In driver the corespond xx_create routine will be called! if you want to decide whether do something or not something in this routine,I think you can create event object betwen user and kernel! pls try it! :)
好好学习,天天向上...
javayw
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-17 12:17
非常感谢你的回复。
但我还是不太清楚。

我的思路是

在IRP_MJ_CREATE中
通知应用程序后,然后就挂起

KeSetEvent(pDeviceExtension->hEvent, 2, FALSE);
Irp->IoStatus.Status = STATUS_PENDING;
Irp->IoStatus.Information = 0;
IoMarkIrpPending(Irp);
pDeviceExtension->CreateIrp = Irp;
return STATUS_PENDING;


当应用程序收到消息后判断yes or no时,给驱动发出两个不同的请求
yes时 GET_CONFIRM_CREATE
no时 GET_FORBID_CREATE

在GET_CONFIRM_CREATE中
允许继续执行create

myIrpCreate = pDeviceExtension->CreateIrp;
myirpCreateStack = IoGetCurrentIrpStackLocation (myIrpCreate);

myIrpCreate->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(myIrpCreate,IO_NO_INCREMENT);

在GET_FORBID_CREATE中
禁止继续执行create

myirpCreateStack = IoGetCurrentIrpStackLocation (myIrpCreate);
myIrpCreate->IoStatus.Status = STATUS_UNSUCCESSFUL;
myIrpCreate->IoStatus.Information = 0;
IoCompleteRequest(myIrpCreate,IO_NO_INCREMENT);

这种思路对吗?还望多多指点,谢谢各位
taosa
驱动牛犊
驱动牛犊
  • 注册日期2002-07-29
  • 最后登录2005-01-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-18 11:17
This is my resolving method. Maybe is wrong, and maybe can give you some advice.

I think a program can be open in kernal driver.

Install a program using GUID and register it in register table.

Kernal object can communicate between app and driver, but its condition is app is open.

so ...........
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-18 12:29
应该是对的,你碰到什么问题了吗?
alexe_chen
驱动小牛
驱动小牛
  • 注册日期2002-03-21
  • 最后登录2006-07-31
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-18 16:34
我想这样做是对的!只是必须有一个机制,去完成或取消标记为挂起的irp.比如定时器。 :D
好好学习,天天向上...
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-18 17:05
你不是说在用户选择拒绝或者允许的时候来完成吗?
javayw
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-18 22:35
感谢各位关注!

这个方法目前也实现了,只是我感觉好象效率很低,而且说不定什么时候就GAME OVER。

是不是还有一些其他的方法?
用startio可以吗?我是新手,还要多多向大家请教。
sipu
驱动牛犊
驱动牛犊
  • 注册日期2002-05-13
  • 最后登录2005-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-19 12:41
你在google的新闻组里搜一下,关于这个问题有非常详尽的解决方法。

解决了别忘了在这里反馈一下。
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-11-19 13:37
不知你用于什么地方?这种方式效率不底而且也不会over,好好看看程序。
javayw
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-19 15:34
google!你们还能上吗?我这是上不去,不知道是不是又给封了。
javayw
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-19 15:36
ysy大侠:

我主要是想实现象一般个人防火墙一样,当用户运行应用程序时,比如telnet,立刻就出现个提示框,问是否允许访问网络,让用户选择。
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-11-19 15:52
你说的是这个呀,那你做的应该是tdi层的过滤驱动吧,我们已经实现并且已经发行,肯定没有问题,你的思路也是对的。但是具体代码我就不能说了。
javayw
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-11-19 16:16
说实话,我现在也分不清楚TDI和WDM过滤有什么区别,我也搞不清楚自己这个到底是TDI,还是WDM过滤。
高手能否再赐教一下,小弟感激万分。
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-11-19 17:16
我是猜测应该是tdi驱动,因为你没有提供更多的信息。
javayw
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-11-19 19:17
我的方法很简单
1。用IoGetDeviceObjectPointer获得TCP设备对象
2。用IoCreateDevice建立一个自己的设备
3。用IoAttachDeviceToDeviceStack将自己的设备挂接在tcp之上
然后在IRP_MJ_CREATE中等待应用程序执行。
以后的步骤就是我前面写的那些了。
我看和wdm程序并没有什么区别,也没有用到TDI开头的函数。
老兄,那你看这还能否叫tdi驱动?
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-11-20 13:42
    呵呵,我觉得不必过分追究是否叫什么名字,总是驱动吧?或者叫内核模式的程序?
    但是访问网络好像不是通过IRP_MJ_CREATE进行的。
javayw
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-11-20 16:20
感谢高手,以后还要多多向你学习。给分。
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-11-20 16:22
学习不敢,我觉得应该多交流吧!
游客

返回顶部