C++ 微型过滤器驱动程序不阻止文件编辑

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

我正在尝试创建一个文件系统过滤器(Minifilter)驱动程序。为此,我将遵循此处提供的教程:

简单地说,在本教程中,您将创建一个微型过滤器驱动程序,阻止您写入名为OPENME.txt的文件

这是我的代码:

#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或更高版本
  • 驱动程序设置>目标平台窗体:桌面
然后,我构建了应用程序,得到了成功消息,并创建了.inf和.sys文件

我的目标计算机是Windows 10 x64,我已经设置了允许使用未签名驱动程序的选项

我运行以下命令:

pnputil/add驱动程序FsFilter2.inf

并且驱动程序安装成功。我得到输出:

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,但后者有点复杂。 简言之,以下是一些建议:

  • 签入后创建而不是预创建,因为您下面的文件系统尚未打开文件对象,因此FLTGetFileName信息本身将执行FltCreateFile来打开文件以查询名称
  • 在PostCreate中,还可以决定是否允许打开此文件。您应该检查打开所用的期望访问,以及它是否适合您的掩码,在本例中,一个文件\u GENERIC\u WRITE简单地拒绝创建。看到和
  • 不要忘记将Data->IoStatus.Status设置为Status\u ACCESS\u DENIED,因为Status\u INVALID\u参数非常模糊,事实并非如此
  • 不要在预写中对此进行任何处理,因为它不是,您需要已经阻止创建
  • 不要使用不安全的字符串函数,如WCSSTR,可以考虑使用在<强> NTStrSuraby.H<强>中的API,并且根据所提供的长度进行边界检查,而不是在结尾假设空字符。
    祝你好运,希望这会有所帮助。

    我当然希望Youtube视频没有教你这样做。 这里有很多错误,所以我首先建议您去查看Microsoft minifilter示例。 它们位于 更具体地说,我建议您查看扫描仪样本,或avscan,但后者有点复杂。 简言之,以下是一些建议:

  • 签入后创建而不是预创建,因为您下面的文件系统尚未打开文件对象,因此FLTGetFileName信息本身将执行FltCreateFile来打开文件以查询名称
  • 在PostCreate中,还可以决定是否允许打开此文件。您应该检查打开所用的期望访问,以及它是否适合您的掩码,在本例中,一个文件\u GENERIC\u WRITE简单地拒绝创建。看到和
  • 不要忘记将Data->IoStatus.Status设置为Status\u ACCESS\u DENIED,因为Status\u INVALID\u参数非常模糊,事实并非如此
  • 不要在预写中对此进行任何处理,因为它不是,您需要已经阻止创建
  • 不要使用不安全的字符串函数,如WCSSTR,可以考虑使用在<强> NTStrSuraby.H<强>中的API,并且根据所提供的长度进行边界检查,而不是在结尾假设空字符。
    祝你好运,希望这能有所帮助。

    我决定听从你的建议,按照Microsoft minifilter示例中提供的nullFilter示例从头开始。设法让一个极简主义的例子起作用,所以我将从这里开始。谢谢你的帮助。祝你好运,如果你遇到麻烦,请再次发帖。也不要忘记OSR。所有的驱动程序专家都在那里闲逛。我决定听从你的建议,从零开始,遵循Microsoft minifilter示例中提供的nullFilter示例。设法让一个极简主义的例子起作用,所以我将从这里开始。谢谢你的帮助。祝你好运,如果你遇到麻烦,请再次发帖。也不要忘记OSR。所有的司机专家都在那里闲逛。
    The FsFilter2 service was started successfully.