【发布时间】: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重定向文件
标签: c++ drag-and-drop driver minifilter kernel-mode