阅读:1641回复:5
怎样通知用户程序中断发生?
使用KernelDriver 6.11编写驱动程序,但是不知怎样将发生的中断事件通知运行在用户模式下的程序 :(
KernelDrvier生成的代码中,只演示回调函数在内核态,不能回调用户态的函数 :( 如果能回调,怎样实现? 能不能在用户程序中用CreateEvent生成一个事件句柄,将句柄传给驱动程序,在中断服务程序中用SetEvent设置事件? 中断服务运行在什么级别,在中断服务中不能向用户态的内存缓冲区复制数据吗? [编辑 - 12/1/03 by liskman] |
|
|
沙发#
发布于:2003-12-01 18:58
能不能在用户程序中用CreateEvent生成一个事件句柄,将句柄传给驱动程序,在中断服务程序中用SetEvent设置事件?
对,可以 然后在用户层通过IOCTL传内存地址过来接受数据。。。。。。 |
|
|
板凳#
发布于:2003-12-01 23:08
能举一些代码样例吗?
当时用KernelDriver 5.xx时,有一个KEvent类,可以用用户程序的事件句柄进行初始化,然后操作该事件句柄. 现在KernelDriver 6.xx中没有了该工具类,请问代码该怎么写? |
|
|
地板#
发布于:2003-12-02 09:53
RING3:
CreateEvent DeviceIoControl WaitForSingleObject RING0: IoCreateNotificationEvent KeSetEvent |
|
|
地下室#
发布于:2003-12-02 16:41
在中断服务例程中是绝对不能调用SetEvent的,SetEvent的调用IRQL不应高于DISPATCH_LEVEL。在ISR中可以读写用户缓冲区,但是前提是用户缓冲区被锁定并且映射到了系统地址空间(可以看看mdl)。你如果想将中断事件通知运行在用户模式下的程序,不应该通过SetEvent之类的方法来完成,采用读设备或者自定义的IOCTL来完成比较好,你的用户线程可以向设备发出IOCTL,驱动接受到请求后不立即完成该请求,当你的设备发生中断,在中断的DPCForISR中完成用户线程的IOCTL请求,你的用户线程就可以知道中断发生了,当然这不是实时的,NT本身就不是
|
|
5楼#
发布于:2003-12-04 23:12
多谢!
发现用 ObReferenceObjectByHandle(hEvent, GENERIC_ALL, NULL, KernelMode, &gpEventObject, &objHandleInfo); KeSetEvent( gpEventObject, 0, FALSE); ObDereferenceObject(gpEventObject); 也很好使 |
|
|