阅读:3385回复:8
内核驱动如何通知用户态程序某事件发生呢?
在过滤驱动里面 如何通知 用户态的程序某个事件的发生,然后让用户态程序到内核驱动处取得数据?
能不能共享同步事件对象,或者什么...? |
|
沙发#
发布于:2007-04-08 21:17
deviceioControl吧。
|
|
板凳#
发布于:2007-04-08 21:53
能具体一点不?DeviceIoControl怎么传递Kevent 对象呢?
|
|
地板#
发布于: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; |
|
地下室#
发布于:2007-04-09 10:05
事件,共享内存
|
|
|
5楼#
发布于:2007-04-27 15:33
在用户程序中建立EVENT对象。
使用DeviceIoControl将EVENT的HANDLE传递到驱动程序中。 在驱动程序中建立KEVENT对象,使用OBJECTREFENCE函数将EVENT对象链接起来。 下面就是在驱动中SETEVENT,在用户程序中WaitforSingleObject了。 |
|
|
6楼#
发布于:2007-04-30 09:08
好像不能共享 KSEMAPHORE,那有没有什么方法可以实现类似KSEMAPHORE的功能呢?
|
|
7楼#
发布于:2007-04-30 14:54
lpc
|
|
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,应用程序发现有事件,应该在一个循环中读取,直到读取失败,表明没有数据可读;否则会漏掉后续数据,而没有及时读取; |
|