迷你过滤器拦截将文件拖放到磁盘?
Mini-Filter intercept drag & drop file(s) to disk?
我正在开发一个迷你过滤器来拦截文件并获取拖放到特定磁盘的文件的名称并获取文件名。
如果我拖放一个文件,我可以获取这个文件名并成功拦截它(这意味着这个文件不是在磁盘上创建的)。
如果我拖放多个文件,我只能获取第一个文件名,而其他则不是。但是当我打开磁盘时,我在这里看不到任何文件(这意味着迷你过滤器成功拦截了它们)。所以我无法获取文件名(第一个文件除外)
我通过重定向它们来拦截拖放:
- 通过 FltGetFileNameInformation() 然后 FltParseFileNameInformation() 获取文件名
- 将其拆分为两部分
- 第一个是:\设备\硬盘卷1\文件夹\
- 第二个是:file.ext
- 为第一部分附加文件名:\设备\硬盘卷 1\文件夹ew_file.ext
- 拦截在磁盘上创建
- 释放此缓冲区:Data->Iopb->TargetFileObject->FileName.Buffer
- 将第一部分分配给 Data->Iopb->TargetFileObject->文件名
- 设置此项:Data->Iopb->TargetFileObject->RelatedFileObject = NULL;
- Data->IoStatus.Information = IO_REPARSE;
- Data->IoStatus.Status = STATUS_REPARSE;
- 返回FLT_PREOP_SUCCESS_NO_CALLBACK;
上面的代码只能截获所有文件并获取第一个文件名。
当我拖放多个文件时,如何拦截每个文件?
我发现自己:
-
从 Data->Iopb->TargetFileObject->文件名中获取文件名
- 滑动两部分:文件路径和文件名
- 将文件名更改为重定向文件名
-
删除重定向文件名。此步骤可以在步骤 #1 之前运行
- 如果重定向文件名不存在,则返回STATUS_OBJECT_NAME_NOT_FOUND (0xC0000034)。这对系统来说不是问题。
- 如果存在重定向文件名。还行。
确保检查 simrep 示例Microsoft他们向您展示如何正确执行此操作。我不会假设拖放在内核和文件系统中具有对应关系。它可以通过多种方式在用户模式下实现,特别是如果您在同一卷上执行此操作。它可以像重命名一样简单。还要记住硬链接和符号链接以及备用数据流。
祝你好运。
相关文章:
- 在组合框中拖放项目
- wxWidgets 拖放文件事件处理程序初始化问题(无效static_cast)
- 拖放我的MDI被CRichEditView拦截并在CRichEditView::GetDocument中崩溃 - 如何覆
- 在特定区域拖放 | Qt
- Qt - 在QGraphicScene中拖放时如何从项目中获取文本?
- Qt 模型拖放 - 无法保存类型 QJsonValue
- 如何在 2 个应用程序之间实现拖放?
- 在拖放 QML 列表中插入/删除项目使用 cpp 模型查看
- UI具有拖放功能
- 如何使用拖放功能和点击信号函数QT创建标签
- 使用MFC在对话框上拖放文件
- QListWidget通过setItemWidget使用自定义小部件集进行拖放
- 将拖放连接到QListWidget中的函数的最佳方法
- QTextEdit-根据QCursor位置进行条件拖放
- 如果使用Qt::DecorationRole,则在拖放时崩溃
- 用代码模拟窗口拖放
- Ole 拖放故障排除
- 基于文本的角色扮演游戏拖放和保留物品功能
- 拖放C++在拖放之前操作 Outlook 文件
- 如何在QML无窗口应用程序中设置拖放区域