阅读:1765回复:14
帮个忙 , 有关CompleteRoutine
我在DeviceIoControl内的程序如下:
NTSTATUS InternalIOCTLCompletion(IN PDEVICE_OBJECT fido, IN PIRP Irp, IN PVOID Context) { PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fido->DeviceExtension; PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp); if (Irp->PendingReturned) { IoMarkIrpPending(Irp); } KeSetEvent(&pdx->SendKeyEvent, 0, FALSE); //这行 return STATUS_SUCCESS; } 我的目的是要我的过滤驱动在抓到信号时能再送到另一个Driver,但在IoSetCompletionRoutine设定的那个程序(如上)在作 KeSetEvent 却会造成刷屏 , 如果没有那行 , 就可正常无误的加载, 是因为在DeviceIoControl内不能用到KeSetEvent吗?希望大家能给点建议 , 谢谢~ |
|
沙发#
发布于:2004-07-19 15:04
If Wait is set to FALSE, the caller can be running at IRQL <= DISPATCH_LEVEL. Otherwise, callers of KeSetEvent must be running at IRQL PASSIVE_LEVEL and in a nonarbitrary thread context.
|
|
板凳#
发布于:2004-07-19 15:36
这个event初始化了吗?
然后,这个event信号态后,你处理得对不对啊? 有没有造成死循环? |
|
地板#
发布于:2004-07-19 20:40
谢谢前面两位
To: Asmsys 这个我有注意到 DDK有说明 . To: Shentu 1. event初始化我在 createEvent |
|
地下室#
发布于:2004-07-21 16:06
这个,就要具体情况具体分析了,跟踪一下看看吧,仔细读读代码。
或者叫个高手帮你看看,:) 另外,刷屏什么意思? [编辑 - 7/21/04 by Shentu] |
|
5楼#
发布于:2004-07-22 08:39
这个,就要具体情况具体分析了,跟踪一下看看吧,仔细读读代码。 基本上是irql的问题,确认完成例程的irql. 应该是调用 KeInitializeEvent初始化event |
|
|
6楼#
发布于:2004-07-22 20:46
刷屏就是会重新开机,
而且还会出现蓝色画面 , 导致我要ghost回去,会有关于开机的档案被影响到 你们说的irql , 我知道它必须在dispatch之上丫, 这部份我也有确认丫, 真的不知道是错在哪 求救 , 谢谢 ~ |
|
7楼#
发布于:2004-07-27 00:13
这边应该没问题,假如初始化没问题的话,
可能在等待的那边有问题 |
|
|
8楼#
发布于:2004-07-27 11:13
To lifeship :
谢谢 , 你所说的等待问题是指KeWaitForSingleObject吗? 能否再讲的清楚一点 , 谢谢 ~ |
|
9楼#
发布于:2004-07-27 14:33
问题估计是出在等待的那边,你这里触发了Event,那里Wait到后做的一些动作导致了蓝屏
|
|
10楼#
发布于:2004-07-27 19:37
To bingjie
谢谢 bingjie , 有个观念想要请教 , 如果程序它原本是在readwrite function 内设定 readcompleteroutine , 也在这边触发event , 接着thread要作传递message的动作, 这部份我试过都没问题, 那我把它改在在DeviceIoControl 去readcompleteroutin(我想这边是ok的) 然后我在completeroutine内去KeSetEvent , 其它部份就跟前面” 接着thread要作传递message的动作, 这部份我试过都没问题,” 我不知道这样是不是就会不行 , 因为两者现在的差别就是 一个是在readwrite function 作 , 一个是在 DeviceIoControl里作 , 我的Device是 Keyboard 只是我从readwrite function 去抓code 只能抓到标准key , 所以我就从DeviceIoControl内去抓 , 可以抓的到 , 但只能在Driver Monitor上看到 我要将Key 抓到Ap上呈现 , 现在就卡在 filter Driver 送到我的另一个Driver 时就会蓝屏 就是我现在的状况 |
|
11楼#
发布于:2004-07-27 23:01
我不适非常明白你说的话,是不是这个意思,你喜欢像某个地方发送message,你的message是什么意思
这里好像有点问题,在DeviceIoControl或者readwrite function 和completeroutine 两者有个很大的区别,前这是在非任意线程环境下运行的,而后者在人以线程环境下运行,这是,某些资源就可能是失效了,如一些地址,句并等等 |
|
|
12楼#
发布于:2004-07-27 23:59
I think your DeviceIoControl dispatch routine should like the following.
YourDeviceIoControlDispatchRoutine ( PDEVICE_OBJECT DeviceObject, PIRP Irp ) { NTSTATUS status; PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension; IoCopyCurrentIrpStackLocationToNext(Irp); KeInitializeEvent(&pdx->SendKeyEvent, NotificationEvent, FALSE ); IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE) InternalIOCTLCompletion, pdx, TRUE, TRUE, TRUE); // No need for Cancel status = IoCallDriver(pdx->NextLowerDevice, Irp); if (STATUS_PENDING == status) { KeWaitForSingleObject( &pdx->SendKeyEvent, Executive, // Waiting for reason of a driver KernelMode, // Waiting in kernel mode FALSE, // No alert NULL); // No timeout } // // We must now complete the IRP, since we stopped it in the // completion routine with STATUS_MORE_PROCESSING_REQUIRED. // Irp->IoStatus.Status = status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return status; } Then your completion routine should like the following. NTSTATUS InternalIOCTLCompletion(IN PDEVICE_OBJECT fido, IN PIRP Irp, IN PVOID Context) { PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fido->DeviceExtension; KeSetEvent(&pdx->SendKeyEvent, 0, FALSE); //这行 return STATUS_MORE_PROCESSING_REQUIRED; } If a completion routine signals an event, it should not call IoMarkIrpPending. Hope this can help you. |
|
13楼#
发布于:2004-07-28 10:00
谢谢所有参与讨论的人 。
To lifeship: 我所说的message指的是USB Keyboard 的keycode , 而readwrite fuction 和 DeviceIoControl 以 USB Keyboard 来说 , 收到的 keycode 就会放在 readwirte function 内去作 , 而 一些control pipe 的Data 就会放在 DeviceIoControl 内去作 , 基本上completeroutine 是用来设定某事情 作完 ,再去作某事情 非任意线程环境 与 线程环境 这个我还不太懂 ; To piggy : I now try your suggestion , thanks |
|
14楼#
发布于:2004-08-06 15:48
我果然是event没有初始化的问题 ,
但现在我去 KetSetEvent 的部份并不会有相对应的动作 , |
|