首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以使用FltQueueDeferredIoWorkItem来挂起IRP_MJ_WRITE和IRP_MJ_READ吗?

我可以使用FltQueueDeferredIoWorkItem来挂起IRP_MJ_WRITE和IRP_MJ_READ吗?
EN

Stack Overflow用户
提问于 2017-03-27 11:53:33
回答 1查看 602关注 0票数 1

我正在编写一个文件系统微过滤器驱动程序,用于监控IRP_MJ_CREATE、IRP_MJ_CLOSE、IRP_MJ_READ和IRP_MJ_WRITE操作。我必须以这样的方式实现它:当我的操作前回调被调用时,我需要从用户程序获得一个输入,决定是允许还是阻止我计划使用FltQueueDeferredIoWorkItem和FltCompletePendedPreOperation()的操作(对于所选文件的列表)。

我写了一个示例,其中我的预操作回调函数执行以下操作(作为测试)-分配工作项-调用FltQueueDeferredIoWorkItem并将其排队-将CompletionContext设置为NULL -返回FLT_PREOP_PENDING

我的延迟IO回调例程将创建一条记录(来自非分页池的自定义类型),从PFLT_CALLBACK_DATA复制详细信息并将其传递给Completioncontext参数并返回状态为FLT_PREOP_SUCCESS_WITH_CALLBACK。

如果我只监视IRP_MJ_CREATE,这可以很好地工作。如果我也为IRP_MJ_WRITE/READ/CLOSE注册了pre和post操作例程,它只能工作几秒钟,稍后我的机器就会死机。

在预创建例程中,我不应该像这样为IRP_MJ_WRITE/READ/CLOSE挂起IO吗?

EN

回答 1

Stack Overflow用户

发布于 2017-03-27 15:57:32

好吧,有两个问题:

  1. I最初没有检查FltQueueDeferredIoWorkItem的状态,即使在排队失败时也返回FLT_PREOP_PENDING。
  2. 第二个问题与在调用FltQueueDeferredIoWorkItem之前锁定用户缓冲区有关。似乎使用FltQueueDeferredIoWorkItem进行读/写等操作的正确方法是在调用FltQueueDeferredIoWorkItem之前使用FltLockUserBuffer锁定用户缓冲区。不过,我在MSDN中找不到这个文档,但找到了几个其他链接。按如下方式更改我的预创建例程,现在它可以工作了:

。。WorkItem = FltAllocateDeferredIoWorkItem();

代码语言:javascript
复制
 FltLockUserBuffer(Data);

 Status = FltQueueDeferredIoWorkItem(WorkItem, Data, &FileDeferredRoutine,     DelayedWorkQueue, CompletionContext);

 if(Status==STATUS_SUCCESS)

 return FLT_PREOP_PENDING;

。。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43037684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档