C++ 微型过滤器驱动程序不阻止文件编辑
我正在尝试创建一个文件系统过滤器(Minifilter)驱动程序。为此,我将遵循此处提供的教程: 简单地说,在本教程中,您将创建一个微型过滤器驱动程序,阻止您写入名为OPENME.txt的文件 这是我的代码:C++ 微型过滤器驱动程序不阻止文件编辑,c++,minifilter,C++,Minifilter,我正在尝试创建一个文件系统过滤器(Minifilter)驱动程序。为此,我将遵循此处提供的教程: 简单地说,在本教程中,您将创建一个微型过滤器驱动程序,阻止您写入名为OPENME.txt的文件 这是我的代码: #include <fltKernel.h> #include <dontuse.h> #include <suppress.h> PFLT_FILTER FilterHandle = NULL; NTSTATUS MiniUnload(FLT_FIL
#include <fltKernel.h>
#include <dontuse.h>
#include <suppress.h>
PFLT_FILTER FilterHandle = NULL;
NTSTATUS MiniUnload(FLT_FILTER_UNLOAD_FLAGS Flags);
FLT_POSTOP_CALLBACK_STATUS MiniPostCreate(PFLT_CALLBACK_DATA Data, PCFLT_RELATED_OBJECTS FltObjects, PVOID* CompletionContec, FLT_POST_OPERATION_FLAGS Flags);
FLT_PREOP_CALLBACK_STATUS MiniPreCreate(PFLT_CALLBACK_DATA Data, PCFLT_RELATED_OBJECTS FltObjects, PVOID* CompletionContec);
FLT_PREOP_CALLBACK_STATUS MiniPreWrite(PFLT_CALLBACK_DATA Data, PCFLT_RELATED_OBJECTS FltObjects, PVOID* CompletionContec);
const FLT_OPERATION_REGISTRATION Callbacks[] =
{
{ IRP_MJ_CREATE,0,MiniPreCreate, MiniPostCreate },
{ IRP_MJ_WRITE,0,MiniPreWrite, NULL },
{ IRP_MJ_OPERATION_END }
};
const FLT_REGISTRATION FilterRegistration =
{
sizeof(FLT_REGISTRATION),
FLT_REGISTRATION_VERSION,
0,
NULL,
Callbacks,
MiniUnload,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL
};
NTSTATUS MiniUnload(FLT_FILTER_UNLOAD_FLAGS Flags)
{
KdPrint(("driver unload \r\n"));
FltUnregisterFilter(FilterHandle);
return STATUS_SUCCESS;
}
FLT_POSTOP_CALLBACK_STATUS MiniPostCreate(PFLT_CALLBACK_DATA Data, PCFLT_RELATED_OBJECTS FltObjects, PVOID* CompletionContec, FLT_POST_OPERATION_FLAGS Flags)
{
KdPrint(("post create running \r\n"));
return FLT_POSTOP_FINISHED_PROCESSING;
}
FLT_PREOP_CALLBACK_STATUS MiniPreCreate(PFLT_CALLBACK_DATA Data, PCFLT_RELATED_OBJECTS FltObjects, PVOID* CompletionContec)
{
PFLT_FILE_NAME_INFORMATION FileNameInfo;
NTSTATUS status;
WCHAR Name[200] = { 0 };
status = FltGetFileNameInformation(Data, FLT_FILE_NAME_NORMALIZED | FLT_FILE_NAME_QUERY_DEFAULT, &FileNameInfo);
if (NT_SUCCESS(status))
{
status = FltParseFileNameInformation(FileNameInfo);
if (NT_SUCCESS(status))
{
if (FileNameInfo->Name.MaximumLength < 260)
{
RtlCopyMemory(Name, FileNameInfo->Name.Buffer, FileNameInfo->Name.MaximumLength);
KdPrint(("create file: %wa \r\n", Name));
}
}
FltReleaseFileNameInformation(FileNameInfo);
}
return FLT_PREOP_SUCCESS_WITH_CALLBACK;
}
FLT_PREOP_CALLBACK_STATUS MiniPreWrite(PFLT_CALLBACK_DATA Data, PCFLT_RELATED_OBJECTS FltObjects, PVOID* CompletionContec)
{
PFLT_FILE_NAME_INFORMATION FileNameInfo;
NTSTATUS status;
WCHAR Name[200] = { 0 };
status = FltGetFileNameInformation(Data, FLT_FILE_NAME_NORMALIZED | FLT_FILE_NAME_QUERY_DEFAULT, &FileNameInfo);
if (NT_SUCCESS(status))
{
status = FltParseFileNameInformation(FileNameInfo);
if (NT_SUCCESS(status))
{
if (FileNameInfo->Name.MaximumLength < 260)
{
RtlCopyMemory(Name, FileNameInfo->Name.Buffer, FileNameInfo->Name.MaximumLength);
_wcsupr(Name);
if (wcsstr(Name, L"OPENME.txt") != NULL)
{
KdPrint(("write file %ws blocked \r\n", Name));
Data->IoStatus.Status = STATUS_INVALID_PARAMETER;
Data->IoStatus.Information = 0;
FltReleaseFileNameInformation(FileNameInfo);
return FLT_PREOP_COMPLETE;
}
KdPrint(("create file: %wa \r\n", Name));
}
}
FltReleaseFileNameInformation(FileNameInfo);
}
return FLT_PREOP_SUCCESS_NO_CALLBACK;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
NTSTATUS status;
status = FltRegisterFilter(DriverObject, &FilterRegistration, &FilterHandle);
if (NT_SUCCESS(status))
{
status = FltStartFiltering(FilterHandle);
if (!NT_SUCCESS(status))
{
FltUnregisterFilter(FilterHandle);
}
}
return status;
}
然后,在项目属性中设置以下配置:
- 平台形状:x64
- C/C++>警告级别:级别1(/W1)
- 链接器>将链接器警告视为错误:否(/WX:No)
- 驱动程序设置>目标操作系统版本:Windows 10或更高版本
- 驱动程序设置>目标平台窗体:桌面
Microsoft PnP Utility
Adding driver package: FsFilter2.inf
Driver package added successfully.
Published Name: oem73.inf
Total driver packages: 1
Added driver packages: 1
然后,我通过执行以下操作启动驱动器:
净启动FsFilter2
并获得以下输出:
The FsFilter2 service was started successfully.
然而,我仍然可以写入OPENME.txt文件。。。在本教程中,这是不可能的
我也在使用DebugView,在其中看不到我的任何消息
有人知道我做错了什么吗?或者我能做些什么来发现我的问题?我当然希望Youtube视频没有教你这样做。 这里有很多错误,所以我首先建议您去查看Microsoft minifilter示例。 它们位于 更具体地说,我建议您查看扫描仪样本,或avscan,但后者有点复杂。 简言之,以下是一些建议:
祝你好运,希望这会有所帮助。我当然希望Youtube视频没有教你这样做。 这里有很多错误,所以我首先建议您去查看Microsoft minifilter示例。 它们位于 更具体地说,我建议您查看扫描仪样本,或avscan,但后者有点复杂。 简言之,以下是一些建议:
祝你好运,希望这能有所帮助。我决定听从你的建议,按照Microsoft minifilter示例中提供的nullFilter示例从头开始。设法让一个极简主义的例子起作用,所以我将从这里开始。谢谢你的帮助。祝你好运,如果你遇到麻烦,请再次发帖。也不要忘记OSR。所有的驱动程序专家都在那里闲逛。我决定听从你的建议,从零开始,遵循Microsoft minifilter示例中提供的nullFilter示例。设法让一个极简主义的例子起作用,所以我将从这里开始。谢谢你的帮助。祝你好运,如果你遇到麻烦,请再次发帖。也不要忘记OSR。所有的司机专家都在那里闲逛。
The FsFilter2 service was started successfully.