阅读:1447回复:7
关于取消IRP请求的问题?
参照FileMon,想在IRP请求的处理过程中,通过判断IRP请求的详细信息,对特定的IRP进行取消。
我的想法实在IRP请求提交前,即IoCallDriver( hookExt->FileSystem, Irp )之前,取消该IRP请求。 我试了用IoCompleteRequest替代IoCallDriver(瞎碰),结果是经常崩溃。我又看了OSR的文档Cancel,觉得其中讲的可能是这方面的东东,但还没有试用。 请大侠们给点建议,谢谢! |
|
|
沙发#
发布于:2004-09-21 16:29
我觉得文件系统中大部分irp用iocompleterequest都应该不会崩溃,
不清楚你是如何调用的,能说说你出错的具体信息吗? |
|
板凳#
发布于:2004-09-22 09:53
我觉得文件系统中大部分irp用iocompleterequest都应该不会崩溃, 我是在FileMon的FilemonHookRoutine函数中进行判断和处理的。我对IRP_MJ_CREATE进行分析,发现如果操作不是FILE_OPEN就取消该IRP请求,我只对代码做了简单的修改如下: ... ... if (cancelIRP){ IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } else return IoCallDriver( hookExt->FileSystem, Irp ); 这样做的结果是,我删除一个文件系统就蓝屏,错误提示为: KMODE_EXCEPTION_NOT_HANDLED 请大侠给把把脉,谢谢! |
|
|
地板#
发布于:2004-09-22 13:44
通常在调用IoCallDriver的前面都会调用IoSkipCurrentIrpStackLocation或者IoCopyCurrentIrpStackLocationToNext,
而直接IoCompleteRequest则不需要,你是不是这部分处理错了? |
|
地下室#
发布于:2004-09-22 14:26
通常在调用IoCallDriver的前面都会调用IoSkipCurrentIrpStackLocation或者IoCopyCurrentIrpStackLocationToNext, tooflat给指导一下吧。 我把IoCompleteRequest放在下面语句的前面: *nextIrpStack = *currentIrpStack; 还是出问题,我在程序中的判断是这样的 case IRP_MJ_CREATE: disposition = (currentIrpStack->Parameters.Create.Options >> 24) & 0xFF; //只允许FILE_OPEN的IRP_MJ_CREATE if(currentIrpStack->Parameters.Create.SecurityContext){ DesiredAccess = (FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA) & currentIrpStack->Parameters.Create.SecurityContext->DesiredAccess; } if((disposition == FILE_CREATE) || disposition == FILE_OPEN_IF || disposition == FILE_OVERWRITE_IF || disposition == FILE_SUPERSEDE || DesiredAccess){ match = TRUE; } // // If its an open-by-id we free the hash entry now so that on the next access to // the file we'll pick up the file's real name. // if( currentIrpStack->Parameters.Create.Options & FILE_OPEN_BY_FILE_ID ) { FilemonFreeHashEntry( FileObject ); } break; ... ... if (match){ IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } else return IoCallDriver( hookExt->FileSystem, Irp ); 现在对于新建一个文件(目录)、修改文件名称都可以成功取消,但是Del删除或者粘贴一个文件到监控的目录,就会崩溃。 烦请高人看看什么问题。 [编辑 - 9/22/04 by fslife] |
|
|
5楼#
发布于:2004-09-23 09:36
还是自己跟踪一下吧
|
|
6楼#
发布于:2004-09-23 10:27
呵呵,搞定了。谢谢tooflat!
把取消的代码改成下面就好了 if (match) { Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_UNSUCCESSFUL; } |
|
|
7楼#
发布于:2004-10-11 21:13
逛荡:(
|
|
|