zzyheart
驱动牛犊
驱动牛犊
  • 注册日期2007-03-15
  • 最后登录2008-07-04
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
阅读:3384回复:8

内核驱动如何通知用户态程序某事件发生呢?

楼主#
更多 发布于:2007-04-08 19:57
  在过滤驱动里面 如何通知 用户态的程序某个事件的发生,然后让用户态程序到内核驱动处取得数据?
能不能共享同步事件对象,或者什么...?
formytest
驱动牛犊
驱动牛犊
  • 注册日期2007-01-16
  • 最后登录2010-03-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望33点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-04-08 21:17
deviceioControl吧。
zzyheart
驱动牛犊
驱动牛犊
  • 注册日期2007-03-15
  • 最后登录2008-07-04
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-04-08 21:53
能具体一点不?DeviceIoControl怎么传递Kevent 对象呢?
formytest
驱动牛犊
驱动牛犊
  • 注册日期2007-01-16
  • 最后登录2010-03-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望33点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-04-08 23:22
http://www.xfocus.net/articles/200503/788.html
参考这篇文章吧。
    case IRP_MJ_DEVICE_CONTROL:
        DbgPrint("IRP_MJ_DEVICE_CONTROL\n");
        inputLength=irpStack->Parameters.DeviceIoControl.InputBufferLength;
        outputLength=irpStack->Parameters.DeviceIoControl.OutputBufferLength;
        switch (irpStack->Parameters.DeviceIoControl.IoControlCode)
        {
        case IOCTL_PASSEVENT:    //用事件做通信
            inputBuffer = pIrp->AssociatedIrp.SystemBuffer;

            DbgPrint("inputBuffer:%08x\n", (HANDLE)inputBuffer);
            status = ObReferenceObjectByHandle(*(HANDLE *)inputBuffer,
                GENERIC_ALL,
                NULL,
                KernelMode,
                &gpEventObject,
                &objHandleInfo);

            if(status!=STATUS_SUCCESS)
            {
                DbgPrint("wrong\n");
                break;
            }
            break;
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2007-04-09 10:05
事件,共享内存
驱动开发者 呵呵
zlf1110
驱动牛犊
驱动牛犊
  • 注册日期2002-11-10
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分39分
  • 威望365点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-04-27 15:33
在用户程序中建立EVENT对象。
使用DeviceIoControl将EVENT的HANDLE传递到驱动程序中。
在驱动程序中建立KEVENT对象,使用OBJECTREFENCE函数将EVENT对象链接起来。
下面就是在驱动中SETEVENT,在用户程序中WaitforSingleObject了。
zlf1110
zzyheart
驱动牛犊
驱动牛犊
  • 注册日期2007-03-15
  • 最后登录2008-07-04
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-04-30 09:08
好像不能共享 KSEMAPHORE,那有没有什么方法可以实现类似KSEMAPHORE的功能呢?
lazydog
驱动牛犊
驱动牛犊
  • 注册日期2004-07-08
  • 最后登录2009-10-30
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望85点
  • 贡献值0点
  • 好评度72点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-04-30 14:54
lpc
ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-04-30 17:46
Q:
请问有什么方法实现驱动程序主动和应用程序进行实时通讯,而不用应用程序采用定时查询的方法?
比如驱动有一事件发生需要立即通知应用程序,或驱动程序需要向应用程序读取一些内容.

A:
有一个很容易的方式,在驱动程序和应用程序之间用一个事件。
在应用程序CreateFile的时候,驱动程序IoCreateSynchronizationEvent一个有名的事件,然后应用程序CreateEvent/OpenEvent此有名事件即可。
注意点:
1,不要在驱动初始化的时候创建事件,此时大多不能成功创建;
2,让驱动先创建,那么此后应用程序打开时,只能读(Waitxxxx),不能写(SetEvent/ResetEvent)。反之,如果应用程序先创建,则应用程序和驱动程序都有读写权限;
3,用名字比较理想,注意驱动中名字在\BaseNamedObjects\下,例如应用程序用“xxxEvent”,那么驱动中就是“\BaseNamedObjects\xxxEvent”;
4,用HANDLE的方式也可以,但是在WIN98下是否可行,未知。
5,此后,驱动对读请求应立即返回,否则就返回失败。不然将失去用事件通知的意义(不再等待读完成,而是有需要(通知事件)时才会读);
6,应用程序发现有事件,应该在一个循环中读取,直到读取失败,表明没有数据可读;否则会漏掉后续数据,而没有及时读取;
游客

返回顶部