Winapi 微型过滤器驱动程序。过滤器连接问题

Winapi 微型过滤器驱动程序。过滤器连接问题,winapi,driver,volume,minifilter,Winapi,Driver,Volume,Minifilter,我正在开发一个微型过滤器驱动程序,并使用了微软的SwapBuffers 以微型过滤器为例。 默认情况下,InstanceSetup路由正在连接到所有卷。但是我不想要 要依附于所有这些,只依附于某些选择 我试图在“FLT_注册”中设置“NULL”而不是“InstanceSet” “FilterRegistration”,然后在“DriverEntry”中调用“fltathVolume” 罗廷。我已经做了以下工作: PFLT_卷; UNICODE_字符串vname; .... RTL代码字符串(&v

我正在开发一个微型过滤器驱动程序,并使用了微软的SwapBuffers 以微型过滤器为例。 默认情况下,InstanceSetup路由正在连接到所有卷。但是我不想要 要依附于所有这些,只依附于某些选择

我试图在“FLT_注册”中设置“NULL”而不是“InstanceSet” “FilterRegistration”,然后在“DriverEntry”中调用“fltathVolume” 罗廷。我已经做了以下工作:

PFLT_卷; UNICODE_字符串vname; .... RTL代码字符串(&vname,L“E:\”); FltGetVolumeFromName(gFilterHandle,&vname,&vol); ... FltAttachVolume(gFilterHandle,vol,NULL,NULL);

当我试图用“NULL”3-d参数调用fltathVolume时 (PCUNICODE_字符串InstanceName)我收到一个 “状态\u FLT\u实例\u名称\u冲突”错误

如果我用一个“NOTNULL”3-d参数调用FltAttachVolume,例如 “UniqueInstanceName”返回我“-2145452013”

当我尝试使用 我的用户应用程序中的FilterAttach例程,如下所示:

。。。 driver.driverName=L“swapBuffers”; ... LPCWSTR vname=L“F:\”; ... filteratach(driver.driverName,vname,NULL,NULL,NULL)

具有“NULL”三维参数(LPCWSTR lpInstanceName): “错误\u FLT\u实例\u名称\u冲突”

带有“NOT-NULL”:“-2145452013”

在MiniSpy miniFilter中有一个用户应用程序,例程FilterAttach 使用。我试图在我的应用程序中以同样的方式调用此例程-否 结果

最后,我更改了swapBuffers inf文件:

  • 没有DefaultInstance参数,我将其设置为:“SwapBuffers-Top” 实例”
  • 我还从MiniSpy inf文件复制了此文件:

    [迷你过滤器.AddRegistry] HKR,“实例”,“默认实例”,0x00000000,%DefaultInstance% HKR,“实例\%Instance1.Name%”,“高度”,0x00000000,%Instance1.Altitude% HKR,“实例\%Instance1.Name%”,“标志”,0x00010011,%Instance1.Flags% HKR,“实例\%Instance2.Name%”,“高度”,0x00000000,%Instance2.Altitude% HKR,“实例\%Instance2.Name%”,“标志”,0x00010011,%Instance2.Flags% HKR,“实例\%Instance3.Name%”,“高度”,0x00000000,%Instance3.Altitude% HKR,“实例\%Instance3.Name%”,“标志”,0x00010011,%Instance3.Flags%

    。。。。。。。。。。。。。 Instance1.Name=“SwapBuffers-中间实例” 实例1.海拔高度=“370000” Instance1.Flags=0x1;抑制自动附件 Instance2.Name=“SwapBuffers-底部实例” 实例2.海拔高度=“361000” Instance2.Flags=0x1;抑制自动附件 Instance3.Name=“SwapBuffers-顶级实例” 实例3.海拔高度=“385100” Instance3.Flags=0x1;抑制自动附件

将标志更改为0x1以禁止自动附件。 只有通过这个Inf文件安装我的SwapBuffers迷你过滤器,我收到了 “状态\u成功”来自我的驱动程序中的FltAttachVolume例程。但事实并非如此 正在连接到磁盘

我做错了什么? 谢谢

那很好。 我有一些类似的代码,这很好

status = FltRegisterFilter( DriverObject,
                            &FilterRegistration,
                            &gFilterHandle );

FLT_ASSERT( NT_SUCCESS( status ) );

if (NT_SUCCESS( status )) {
    PSECURITY_DESCRIPTOR sd;
    OBJECT_ATTRIBUTES oa;
    UNICODE_STRING uniString;

    status = FltBuildDefaultSecurityDescriptor(&sd,
        FLT_PORT_ALL_ACCESS);

    if (!NT_SUCCESS(status)) {
        return status;
    }

    RtlInitUnicodeString(&uniString, PORT_NAME);

    InitializeObjectAttributes(&oa,
        &uniString,
        OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
        NULL,
        sd);

    status = FltCreateCommunicationPort(gFilterHandle,
        &gServerPort,
        &oa,
        NULL,
        Connect,
        Disconnect,
        Message,
        1);

    FltFreeSecurityDescriptor(sd);

    BREAK_HERE(); // DbgBreak() macro

    //
    //  Start filtering i/o
    //

    status = FltStartFiltering(gFilterHandle);

    if (!NT_SUCCESS(status)) {

        FltUnregisterFilter(gFilterHandle);
    }
    else {
        RtlInitUnicodeString(&uniString, L"\\Device\\HarddiskVolume1");
        PFLT_VOLUME vol;
        FltGetVolumeFromName(gFilterHandle, &uniString, &vol);
        status = FltAttachVolume(gFilterHandle, vol, NULL, NULL);
        // status == 0x0 at that point and the mini filter is attached to the Volume
    }
}
我通常会连接到所有卷,但我想尝试连接到单个卷,效果很好

status = FltRegisterFilter( DriverObject,
                            &FilterRegistration,
                            &gFilterHandle );

FLT_ASSERT( NT_SUCCESS( status ) );

if (NT_SUCCESS( status )) {
    PSECURITY_DESCRIPTOR sd;
    OBJECT_ATTRIBUTES oa;
    UNICODE_STRING uniString;

    status = FltBuildDefaultSecurityDescriptor(&sd,
        FLT_PORT_ALL_ACCESS);

    if (!NT_SUCCESS(status)) {
        return status;
    }

    RtlInitUnicodeString(&uniString, PORT_NAME);

    InitializeObjectAttributes(&oa,
        &uniString,
        OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
        NULL,
        sd);

    status = FltCreateCommunicationPort(gFilterHandle,
        &gServerPort,
        &oa,
        NULL,
        Connect,
        Disconnect,
        Message,
        1);

    FltFreeSecurityDescriptor(sd);

    BREAK_HERE(); // DbgBreak() macro

    //
    //  Start filtering i/o
    //

    status = FltStartFiltering(gFilterHandle);

    if (!NT_SUCCESS(status)) {

        FltUnregisterFilter(gFilterHandle);
    }
    else {
        RtlInitUnicodeString(&uniString, L"\\Device\\HarddiskVolume1");
        PFLT_VOLUME vol;
        FltGetVolumeFromName(gFilterHandle, &uniString, &vol);
        status = FltAttachVolume(gFilterHandle, vol, NULL, NULL);
        // status == 0x0 at that point and the mini filter is attached to the Volume
    }
}
那很好。 我有一些类似的代码,这很好

status = FltRegisterFilter( DriverObject,
                            &FilterRegistration,
                            &gFilterHandle );

FLT_ASSERT( NT_SUCCESS( status ) );

if (NT_SUCCESS( status )) {
    PSECURITY_DESCRIPTOR sd;
    OBJECT_ATTRIBUTES oa;
    UNICODE_STRING uniString;

    status = FltBuildDefaultSecurityDescriptor(&sd,
        FLT_PORT_ALL_ACCESS);

    if (!NT_SUCCESS(status)) {
        return status;
    }

    RtlInitUnicodeString(&uniString, PORT_NAME);

    InitializeObjectAttributes(&oa,
        &uniString,
        OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
        NULL,
        sd);

    status = FltCreateCommunicationPort(gFilterHandle,
        &gServerPort,
        &oa,
        NULL,
        Connect,
        Disconnect,
        Message,
        1);

    FltFreeSecurityDescriptor(sd);

    BREAK_HERE(); // DbgBreak() macro

    //
    //  Start filtering i/o
    //

    status = FltStartFiltering(gFilterHandle);

    if (!NT_SUCCESS(status)) {

        FltUnregisterFilter(gFilterHandle);
    }
    else {
        RtlInitUnicodeString(&uniString, L"\\Device\\HarddiskVolume1");
        PFLT_VOLUME vol;
        FltGetVolumeFromName(gFilterHandle, &uniString, &vol);
        status = FltAttachVolume(gFilterHandle, vol, NULL, NULL);
        // status == 0x0 at that point and the mini filter is attached to the Volume
    }
}
我通常会附加到所有卷,但我想尝试附加到单个卷,效果很好。

我尝试了此操作,但出现“系统无法找到指定的文件”并立即出现蓝屏…很抱歉,消息是“因为尚未完成初始化(未调用FltStartFiltering)”并且立即出现蓝屏…我尝试了这个,但得到了“系统无法找到指定的文件”和立即出现的蓝屏…很抱歉,消息是“因为它尚未完成初始化(尚未调用FltStartFiltering)”,并且立即出现蓝屏。。。
status = FltRegisterFilter( DriverObject,
                            &FilterRegistration,
                            &gFilterHandle );

FLT_ASSERT( NT_SUCCESS( status ) );

if (NT_SUCCESS( status )) {
    PSECURITY_DESCRIPTOR sd;
    OBJECT_ATTRIBUTES oa;
    UNICODE_STRING uniString;

    status = FltBuildDefaultSecurityDescriptor(&sd,
        FLT_PORT_ALL_ACCESS);

    if (!NT_SUCCESS(status)) {
        return status;
    }

    RtlInitUnicodeString(&uniString, PORT_NAME);

    InitializeObjectAttributes(&oa,
        &uniString,
        OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
        NULL,
        sd);

    status = FltCreateCommunicationPort(gFilterHandle,
        &gServerPort,
        &oa,
        NULL,
        Connect,
        Disconnect,
        Message,
        1);

    FltFreeSecurityDescriptor(sd);

    BREAK_HERE(); // DbgBreak() macro

    //
    //  Start filtering i/o
    //

    status = FltStartFiltering(gFilterHandle);

    if (!NT_SUCCESS(status)) {

        FltUnregisterFilter(gFilterHandle);
    }
    else {
        RtlInitUnicodeString(&uniString, L"\\Device\\HarddiskVolume1");
        PFLT_VOLUME vol;
        FltGetVolumeFromName(gFilterHandle, &uniString, &vol);
        status = FltAttachVolume(gFilterHandle, vol, NULL, NULL);
        // status == 0x0 at that point and the mini filter is attached to the Volume
    }
}