阅读:2792回复:5
有谁遇到过KERNEL_STACK_INPAGE_ERROR,0X77?莫名其妙的错误。
一段标准的程序(我认为很标准),怎么总是出错?
大家帮忙看一下啊。 DriverEntry( ) { ... DriverObject->MajorFunction[IRP_MJ_READ] = Read ; ... } Read( ) { KEVENT Event ; IoCopyCurrentIrpStackLocationToNext( Irp ) ; IoSetCompletionRoutine( Irp , ReadCompletion , &Event , TRUE , TRUE , TRUE ) ; KeInitializeEvent( &Event , NotificationEvent , FALSE ); IoCallDriver( pDeviceObject , Irp ) ; KeWaitForSingleObject( &Event , Executive , KernelMode , FALSE , NULL ) ; IoCompleteRequest( Irp , IO_NO_INCREMENT ) ; } ReadCompletion( ) { PKEVENT Event = ( PKEVENT )Context ; if( Irp->PendingReturned ) { IoMarkIrpPending( Irp ) ; } KeSetEvent( Event , 0 , FALSE ) ; return STATUS_MORE_PROCESSING_REQUIRED ; } 总是在ReadCompletion以后就出错,P1=2,P2=0,P3=1,P4=XXXX ,这是怎么回事呀? |
|
沙发#
发布于:2003-05-02 17:57
如果是ifs filter,去掉这个试试: if( Irp->PendingReturned ) { IoMarkIrpPending( Irp ) ; } |
|
板凳#
发布于:2003-05-05 10:19
没有用,具体情况是这样的,在对小文件操作的时候没有问题,
但是大文件copy时会出错,在返回系统以后,这到底是怎么回事啊? |
|
地板#
发布于:2003-05-05 10:23
还有,只要我不用IoSkipCurrentIrpStackLocation,那么在Completion Routine里面处理IoMarkIrpPending应该是没有问题的吧?
|
|
地下室#
发布于:2003-05-05 12:11
我没有写过ifs,下面只是猜测;) 你的错误可能是这样子产生的: 你在kernel stack中创建了一个event对象, 然后,传递一个IRP到底陈驱动, 下面的驱动费了很长时间才完成这个IRP,在完成这个IRP的过程之 中,你的系统已经耗费了太多的资源,不得不把这那个正在等待的 线程的内核stack置换到硬盘上。 这时候,不幸的事情发生了, IRP被完成了。 你的完成历程被调用啦。一访问那个event,系统就over了。 所以说,准确地讲,那个错误是在 KeSetEvent( Event , 0 , FALSE ) ; 的时候发生的。 而且,多半你那个 P4=XXXX正好就是event地地址(也可能是 kenel stack 或者 KTHREAD之类的)。 还有,如果你去掉了 if( Irp->PendingReturned ) { IoMarkIrpPending( Irp ) ; } 估计会出另外一个错误;) |
|
5楼#
发布于:2003-05-05 12:25
你是写virtual disk?
是的话,你要自已处理分割。 |
|