【发布时间】:2020-09-03 14:02:08
【问题描述】:
我有一个微过滤驱动程序错过了某些文件删除,问题在于不知道如何删除它们。 Windows 10 1903 及更高版本就是这种情况。经测试 Pre 1809 构建并且工作正常。
例如 MS C++ 2008 x86 redistributable https://www.microsoft.com/en-gb/download/details.aspx?id=29,在安装 setup.exe 时提取文件到 C:{random GUID}(可以在日志中看到)然后安装。之后文件/目录被删除,我在下面的代码中错过了 IRP。
我目前使用 FileDispositionInformation 监视 IRP_MJ_SET_INFORMATION 是否有文件删除,您可以通过转到资源管理器和 shift + 删除来测试。
添加了 IRP_MJ_CREATE 以在关闭时删除以及每个 RbMm cmets。
我还监视 FileRenameInformation 以移动文件或重命名,如果您在资源管理器中移动/重命名文件,这同样有效。
我理想的解决方案是在创建时获取文件并将其复制到另一个位置,但我不确定从哪里开始。我查看了一些微过滤器示例,但找不到 PreOperationCallback 在示例中的位置以复制新创建的文件。
我的另一个选择是尝试了解如何通过上面的示例获取这些已删除的文件。是否有任何其他 FileInformationClass 案例可供我检查以识别这种删除。
我的 PreOperationCallback 代码如下:
FLT_PREOP_CALLBACK_STATUS PreOperationCallback(_Inout_
PFLT_CALLBACK_DATA Data,
_In_ PCFLT_RELATED_OBJECTS FltObjects,
_Flt_CompletionContext_Outptr_ PVOID* CompletionContext)
{
/* IRP-based I/O operation? */
if (FLT_IS_IRP_OPERATION(Data)) {
if (Data->Iopb->MajorFunction == IRP_MJ_CREATE) {
if (Data->Iopb->Parameters.Create.Options & (FILE_DELETE_ON_CLOSE)) {
DbgPrint("FILE_DELETE_ON_CLOSE");
return process_irp(Data, FltObjects, CompletionContext, FALSE, FALSE);
}else if (Data->Iopb->MajorFunction == IRP_MJ_SET_INFORMATION) {
switch (Data->Iopb->Parameters.SetFileInformation.FileInformationClass) {
case FileDispositionInformation:
// deleting a file we need to action
if (((FILE_DISPOSITION_INFORMATION*) Data->Iopb->Parameters.SetFileInformation.InfoBuffer)->DeleteFile) {
return process_irp(Data, FltObjects, CompletionContext, FALSE, FALSE);
}
break;
case FileRenameInformation:
// Process the request according to our needs e.g copy the file
return process_irp(Data, FltObjects, CompletionContext, FALSE, TRUE);
}
}
}
return FLT_PREOP_SUCCESS_NO_CALLBACK;
}
更新 - 我刚刚创建了一个非常简单的 C# 应用程序来创建一个文件并使用 File.Delete("C:\test.txt"); 删除它。驱动程序在 1903 及更高版本的当前代码库中没有选择此功能。
【问题讨论】:
-
您错过了使用
FILE_DELETE_ON_CLOSE选项的创建操作。所以你还需要PreCreate回调并在这里检查Data->Iopb->Parameters.Create.Options & FILE_DELETE_ON_CLOSE -
您能否给我发送文档或示例的链接。抱歉,我以前从未做过任何驱动程序开发。
-
文件可以通过调用
ZwDeleteFile删除,在这种情况下,系统打开文件带有选项FILE_DELETE_ON_CLOSE(可以使用此标志直接创建/打开)。所以你也需要这样检查。也存在FileRenameInformationEx- 所以你也需要检查一下 -
添加案例 FileRenameInformationEx: DbgPrint("FileRenameInformationEx"); return process_irp(数据,FltObjects,CompletionContext,DEFERRED_IO,TRUE,FALSE,FALSE); - 这很少被调用。我正在研究如何实现 FILE_DELETE_ON_CLOSE
-
非常简单 - 你需要处理
IRP_MJ_CREATE的预操作并检查Data->Iopb->Parameters.Create.Options & FILE_DELETE_ON_CLOSE- 这确实是删除文件的主要情况
标签: c windows driver minifilter