迷你过滤器拦截拖放文件到磁盘?

Posted

技术标签:

【中文标题】迷你过滤器拦截拖放文件到磁盘?【英文标题】:Mini-Filter intercept drag & drop file(s) to disk? 【发布时间】:2015-01-29 08:08:29 【问题描述】:

我正在开发一个微型过滤器来拦截文件并获取文件名,这些文件被拖放到特定磁盘并获取文件名。

如果我拖放一个文件,我可以得到这个文件名并成功拦截(也就是说这个文件不是在磁盘上创建的)。

如果我拖放多个文件,我只能得到第一个文件名而其他不是。但是当我打开磁盘时,我在这里看不到任何文件(这意味着 Mini-Filter 成功拦截了它们)。 所以我无法获取文件名(第一个文件除外)

我通过重定向来拦截拖放:

    通过 FltGetFileNameInformation() 然后 FltParseFileNameInformation() 获取文件名 把它分成两部分 首先是:\Device\HarddiskVolume1\folder\ 二是:file.ext 为第一部分附加文件名:\Device\HarddiskVolume1\folder\new_file.ext 在磁盘上拦截创建 释放此缓冲区:Data->Iopb->TargetFileObject->FileName.Buffer 将第一部分分配给 Data->Iopb->TargetFileObject->FileName 设置:Data->Iopb->TargetFileObject->RelatedFileObject = NULL; 数据->iostatus.Information = IO_REPARSE; 数据->IoStatus.Status = STATUS_REPARSE; 返回 FLT_PREOP_SUCCESS_NO_CALLBACK;

以上代码只能截取所有文件并获取第一个文件名。

当我拖放多个文件时,如何拦截每个文件?

【问题讨论】:

我根据redirect-file-open-using-windows重定向文件 【参考方案1】:

我发现自己:

    从Data->Iopb->TargetFileObject->FileName获取文件名

    分两部分:文件路径和文件名 将文件名更改为重定向文件名

    Delete redirect file name。此步骤可以在步骤 #1 之前运行

    如果重定向文件名不存在,则返回 STATUS_OBJECT_NAME_NOT_FOUND (0xC0000034)。系统没有问题。 如果重定向文件名存在。没关系。

【讨论】:

【参考方案2】:

请务必检查来自 Microsoft 的 simrep 示例,他们会向您展示如何正确执行此操作。 我不会假设 Drag&Drop 在内核和文件系统中有对应关系。它可以在用户模式下以多种方式实现,特别是如果您在同一卷上执行此操作。它可以像重命名一样简单。还要记住硬链接和符号链接以及备用数据流。

祝你好运。

【讨论】:

以上是关于迷你过滤器拦截拖放文件到磁盘?的主要内容,如果未能解决你的问题,请参考以下文章

什么是过滤驱动

struts2配置过滤器与拦截器

AOP与拦截器过滤器之间的关系

java-过滤器-监听器-拦截器

过滤器监听器拦截器的区别

Servlet,过滤器,监听器,拦截器的区别