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

Mini-Filter intercept drag & drop file(s) to disk?

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

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

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

我通过重定向拦截拖放:

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

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

拖放多个文件时如何截取每个文件?

我发现自己:

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

    • 分两部分:文件路径和文件名
    • 将文件名更改为重定向文件名
  2. 。此步骤可以 运行 在步骤 #1

    之前
    • 如果重定向文件名不存在,它return STATUS_OBJECT_NAME_NOT_FOUND (0xC0000034)。不是系统问题。
    • 如果重定向文件名存在。没关系。

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

祝你好运。