阅读:1222回复:8
请教 事件问题。
用途:等待驱动层发事件。
1。应用程。 IOCTL_FIRST_SEND_EVENT 已定义。 HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); int Length; DeviceIoControl(hDevice, IOCTL_FIRST_SEND_EVENT, &hEvent, sizeof(HANDLE),// input NULL, 0, // output &length,NULL)) 2。驱动层。 KEVENT keWrite; KeInitializeEvent(&keWrite,NotificationEvent,FALSE); switch( ControlCode) { case IOCTL_FIRST_SEND_EVENT: ObReferenceObjectByHandle((HANDLE)(*Buffer), 0x0002, NULL, UserMode, (PVOID *)(&keWrite), NULL); KeClearEvent(&keWrite); break; //................. } 有什么地方不对吗? |
|
|
沙发#
发布于:2002-06-26 15:42
高手们要帮帮忙啊!!!!!!!!!!!
|
|
|
板凳#
发布于:2002-06-27 10:56
typedef struct _FIRST_DEVICE_EXTENSION
{ PDEVICE_OBJECT fdo; PDEVICE_OBJECT NextStackDevice; UNICODE_STRING ifSymLinkName; //HANDLE hEvent; //for Event send KEVENT* hEvent; } FIRST_DEVICE_EXTENSION, *PFIRST_DEVICE_EXTENSION; 在DeviceControl中的处理: PFIRST_DEVICE_EXTENSION dx = (PFIRST_DEVICE_EXTENSION)fdo->DeviceExtension; switch( ControlCode) //............................ case IOCTL_FIRST_SEND_EVENT: status = ObReferenceObjectByHandle(Buffer, 0x0002, NULL, UserMode, (PVOID*)(&dx->hEvent), NULL); KeClearEvent(dx->hEvent); break; //................................... //..................在需要发生事件的地方加入.................. KeSetEvent( dx->hEvent, 2, FALSE); //........................... //......................应用层加入........................ HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if(!DeviceIoControl(hDevice, IOCTL_FIRST_SEND_EVENT, &hEvent, sizeof(HANDLE),// input NULL, 0, // output &length, NULL)) WaitForSingleObject(hEvent, INFINITE); //.......................................... 问题是:现在应用程序执行到WaitForSingleObject()之前就重启了。 |
|
|
地板#
发布于:2002-06-27 11:16
跟一下
看到底是那儿发生错误死机的 |
|
|
地下室#
发布于:2002-06-27 11:22
这样可能不行吧,那IRP什么时候完成啊(就是调用IoCompleteRequest 函数),如果采取异步方式的话,也应该先调用IoMarkIrpPending吧。
|
|
5楼#
发布于:2002-06-27 11:31
这样可能不行吧,那IRP什么时候完成啊(就是调用IoCompleteRequest 函数),如果采取异步方式的话,也应该先调用IoMarkIrpPending吧。 本人对DDK刚入门,运行机制也不熟,大侠能否讲的详细点。 或者我应该怎么改? |
|
|
6楼#
发布于:2002-06-27 11:46
应用程序调用DEVICEIOCONTROL的时候,传一个初始化的事件给最后一个参数的相关域,接着调用WAITFORSINGLEOBJECT等待这个事件。
驱动收到这个IRP时调用IoMarkIrpPending,并在出现你希望的情况下调用IoCompleteRequest,你的应用程序就被唤醒了。当然,除此之外,还应该考虑IRP排队,取消例程等,去看看DDK的帮助文档吧。 |
|
7楼#
发布于:2002-06-27 13:18
不需要这么麻烦的
有个简单的方法,以前的帖子我也发过,看来又的写一编 你可以在驱动中创建事件,然后在应用层打开这个事件,只需要两边的事件同名就可以,然后你就可以在合适的地方置事件,并等待这个事件的发生,这样不需要考虑irp队列完成之类的东东 |
|
|
8楼#
发布于:2003-07-06 14:14
不需要这么麻烦的这种方法的确可行,可用本帖子说的那种方法如何实现?我百思不得其解!!!请高手指点 |
|
|