c - Minifilter 在特定情况下丢失已删除的文件 Windows 10 1903 +
问题描述
我有一个微过滤驱动程序,它错过了某些文件删除,问题在于不知道它们是如何被删除的。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 + delete 来测试它。
添加了 IRP_MJ_CREATE 以在关闭时删除以及根据 RbMm 注释。
我还监视 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 及更高版本的当前代码库中没有选择此功能。
解决方案
您必须为 FileRenameInformationEx 和 FileDispositionInformationEx 'process_irp',如下所示。
switch (Data->Iopb->Parameters.SetFileInformation.FileInformationClass) {
case FileDispositionInformation:
case 64/*FileDispositionInformationEx*/:
// 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:
case 65/*FileRenameInformationEx*/:
// Process the request according to our needs e.g copy the file
return process_irp(Data, FltObjects, CompletionContext, FALSE, TRUE);
}
}
推荐阅读
- css - 在 Chrome 中关闭两个单独元素的 CSS 过渡时间
- asp.net-mvc - 没有母版页的 MVC 部分视图呈现
- jsf - 在 JSF 应用程序中使用 Cookie 来记住登录凭据
- android - 将 Android Studio 2.3.2 项目导入 Android Studio 3.1.3 时,Gradle 构建失败(清单合并失败)
- python - 查看 Flask 应用的路由结构
- r - 来自`GlobalEnv`的`list2env()`的`list`
- java - error ndkBuild: createprocess error=2 系统找不到指定的文件
- sql - 将偶数字符替换为大写,其余字符替换为小写
- php - php urlencod utf-8 字符串使其成为 mb_detect_encoding 中的 ascii
- xaml - Xamarin - XAML - 顶部栏应用程序菜单