fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
阅读:1447回复:7

关于取消IRP请求的问题?

楼主#
更多 发布于:2004-09-21 11:56
参照FileMon,想在IRP请求的处理过程中,通过判断IRP请求的详细信息,对特定的IRP进行取消。
我的想法实在IRP请求提交前,即IoCallDriver( hookExt->FileSystem, Irp )之前,取消该IRP请求。
我试了用IoCompleteRequest替代IoCallDriver(瞎碰),结果是经常崩溃。我又看了OSR的文档Cancel,觉得其中讲的可能是这方面的东东,但还没有试用。

请大侠们给点建议,谢谢!

最新喜欢:

hsly110hsly11... cyliucyliu
在交流中学习。。。
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-21 16:29
我觉得文件系统中大部分irp用iocompleterequest都应该不会崩溃,
不清楚你是如何调用的,能说说你出错的具体信息吗?
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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
请大侠给把把脉,谢谢!
在交流中学习。。。
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-09-22 13:44
通常在调用IoCallDriver的前面都会调用IoSkipCurrentIrpStackLocation或者IoCopyCurrentIrpStackLocationToNext,
而直接IoCompleteRequest则不需要,你是不是这部分处理错了?
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-09-22 14:26
通常在调用IoCallDriver的前面都会调用IoSkipCurrentIrpStackLocation或者IoCopyCurrentIrpStackLocationToNext,
而直接IoCompleteRequest则不需要,你是不是这部分处理错了?
 

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]
在交流中学习。。。
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-09-23 09:36
还是自己跟踪一下吧
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
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;
}
在交流中学习。。。
zhangc98
驱动牛犊
驱动牛犊
  • 注册日期2002-03-30
  • 最后登录2004-10-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-10-11 21:13
逛荡:(
目前:新手上路; 目标:高级站友; 理想:开国大佬; 方法:自己的努力+大家的关照!
游客

返回顶部