阅读:1763回复:10
IoSetCompleteRoutine的问题!急!30分偶做一个过滤驱动,现截取到一个读的irp,然后 *nextIS = *currentIS;//copy to nextstack IoSetCompletionRoutine(Irp, IceReadComplete, 0, TRUE,TRUE,TRUE) ; IoCallDriver(); NTSTATUS IceReadFileComplete( PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context ) { . . . if(Irp->PendingReturned) { IoMarkIrpPending(Irp); return STATUS_MORE_PROCESSING_REQUIRED; } . . //do my job //no problem Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = length; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } 这样每次return 之后电脑都自动重起,用softice跟踪显示错误 error=44 MULTPLE_IRP_COMPLETE_REQUESTS。 if(Irp->PendingReturned) { IoMarkIrpPending(Irp); return STATUS_MORE_PROCESSING_REQUIRED; } 有没有都一样 怎么办?好郁闷啊!n天了! :( :( :( :( |
|
最新喜欢:jinghu...
|
沙发#
发布于:2002-12-08 18:28
*nextIS = *currentIS;//copy to nextstack
直接这样好象有问题。 :o |
|
|
板凳#
发布于:2002-12-08 19:38
不是这个问题,我能进入IceReadFileComplete(),而且好像filemon也是这样的
|
|
|
地板#
发布于:2002-12-08 20:00
如果我没有记错的话,应该是这样的
if(Irp->PendingReturned) { IoMarkIrpPending(Irp); return STATUS_MORE_PROCESSING_REQUIRED; } 如果返回了STATUS_MORE_PROCESSING_REQUIRED就不用 IoMarkIrpPending(Irp); 而如果用了 IoMarkIrpPending(Irp); 则应该返回 STATUS_PENDING |
|
地下室#
发布于:2002-12-08 20:03
A routine that calls IoMarkIrpPending must return STATUS_PENDING.
Note, however, that a driver that passes down the IRP and then waits on an event should not mark the IRP pending. Instead, its IoCompletion routine should signal the event and return STATUS_MORE_PROCESSING_REQUIRED. |
|
5楼#
发布于:2002-12-09 10:00
IoCompleteRequest(Irp, IO_NO_INCREMENT); 去掉就行了
|
|
6楼#
发布于:2002-12-09 12:33
如果我没有记错的话,应该是这样的 这个应该是错了,但程序根本就没有进到if{}里面,我把那个去掉也一样 |
|
|
7楼#
发布于:2002-12-09 12:37
IoCompleteRequest(Irp, IO_NO_INCREMENT); 去掉就行了 我是截取了上层应用程序的irp,如果不IoCompleteRequest()怎么能返回到应用程序,这样肯定是不行的, 而且我也试过, 不过还是多谢大家对我的问题的关注! thanks! |
|
|
8楼#
发布于:2002-12-09 13:15
拿掉 *nextIS = *currentIS;//copy to nextstack IoSetCompletionRoutine(Irp, IceReadComplete, 0, TRUE,TRUE,TRUE) ; 加入 IoSkipCurrentIrpStackLocation(Irp); IoCallDriver(org driver? right?); |
|
9楼#
发布于:2002-12-09 14:56
IoCompleteRequest(Irp, IO_NO_INCREMENT); 去掉就行了 今天仔细看了看,art baker的书,主要的毛病就在这里,拿去IoCompleteRequest(Irp, IO_NO_INCREMENT); 然后再修改一下自己的程序,果然成功了,不过就是不知道为什么我原来这样就不行。 反正高定了,放分 :D :D :D :D :D :D :D |
|
|
10楼#
发布于:2002-12-09 18:29
[quote]IoCompleteRequest(Irp, IO_NO_INCREMENT); 去掉就行了 今天仔细看了看,art baker的书,主要的毛病就在这里,拿去IoCompleteRequest(Irp, IO_NO_INCREMENT); 然后再修改一下自己的程序,果然成功了,不过就是不知道为什么我原来这样就不行。 反正高定了,放分 :D :D :D :D :D :D :D [/quote] 这个还不简单, 错误代码是MULTPLE_IRP_COMPLETE_REQUESTS 也就是你在完成例程不应该调用Iocompleterequest. |
|