MiniFilter驱动程序。过滤附加问题

时间:2011-05-08 21:23:04

标签: winapi driver volume minifilter

我正在开发一个miniFilter驱动程序,并采用了微软的SwapBuffers 以miniFilter为例。 默认情况下,InstaceSetup例程将附加到所有卷。但我不想要 附加到所有这些,只有一些选择......

我尝试在“FLT_REGISTRATION”中设置“NULL”而不是“InstanceSetup” FilterRegistration“然后在”DriverEntry“中调用”FltAttachVolume“ routin。我做了以下事情:

PFLT_VOLUME vol; UNICODE_STRING vname; .... RtlInitUnicodeString(& vname,L“E:\”); FltGetVolumeFromName(gFilterHandle,& vname,& vol); ... FltAttachVolume(gFilterHandle,vol,NULL,NULL); ...

当我尝试使用“NULL”3-d参数调用FltAttachVolume时 (PCUNICODE_STRING InstanceName)我收到了 “STATUS_FLT_INSTANCE_NAME_COLLISION”错误。

如果我使用“NOT NULL”3-d参数调用FltAttachVolume,例如a “UniqueInstaceName”它返回“ - 2145452013”​​

我正在收到相同的错误,当我试图附加一个卷时,使用一个 我的用户应用程序中的FilterAttach例程,如下所示:

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

使用“NULL”3-d参数(LPCWSTR lpInstanceName): 的 “ERROR_FLT_INSTANCE_NAME_COLLISION”

使用“NOT-NULL”:“ - 2145452013”​​

在MiniSpy miniFilter中有一个User应用程序和例程FilterAttach 用来。我尝试以相同的方式在我的应用程序中调用此例程 - 不 结果。

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

  • 没有DefaultInstance参数,我设置它:“SwapBuffers - Top 实例”。
  • 我也从MiniSpy inf-file中复制了这个:

    [MiniFilter.AddRegistry] HKR, “实例”, “DefaultInstance”,00000000,%DefaultInstance% HKR, “实例\” %Instance1.Name%, “海拔高度”,00000000,%Instance1.Altitude% HKR, “实例\” %Instance1.Name%, “旗”,0x00010001,%Instance1.Flags% HKR, “实例\” %Instance2.Name%, “海拔高度”,00000000,%Instance2.Altitude% HKR, “实例\” %Instance2.Name%, “旗”,0x00010001,%Instance2.Flags% HKR, “实例\” %Instance3.Name%, “海拔高度”,00000000,%Instance3.Altitude% HKR, “实例\” %Instance3.Name%, “标记”,0x00010001,%Instance3.Flags%

    ............. Instance1.Name =“SwapBuffers - 中间实例” Instance1.Altitude =“370000” Instance1.Flags = 0x1;禁止自动附件 Instance2.Name =“SwapBuffers - 底部实例” Instance2.Altitude =“361000” Instance2.Flags = 0x1;禁止自动附件 Instance3.Name =“SwapBuffers - 最佳实例” Instance3.Altitude =“385100” Instance3.Flags = 0x1;禁止自动附件

将标志更改为0x1以禁止自动附件。 我收到的只是通过这个Inf文件安装我的SwapBuffers miniFilter 我的驱动程序中的FltAttachVolume例程中的“STATUS_SUCCESS”。但事实并非如此 附在磁盘上......

我做错了什么? 感谢。

1 个答案:

答案 0 :(得分:0)

Instance1.Flags = 0x1 

没关系。 我有一些类似的代码,工作正常。

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
    }
}

我通常会附加到所有卷,但我想尝试附加到单个卷,它可以正常工作。