1

DriverEntry に登録されている IRP へのコールバックを受信して​​いないファイル フィルター ドライバーがあります。FltRegisterFilter に登録された PreOperation および PostOperation コールバックがファイル フィルター ドライバーで呼び出されないという問題が発生した人はいますか?

VS2013 ファイル フィルター ドライバー テンプレートを (自分で作成するのではなく) テストしようと思ったのですが、登録された IRP に対してドライバーが呼び出されないことにすぐに気付きました。

FltRegisterFilter で指定されたすべてのドライバー コールバックでデバッグ トレース出力を取得しています。

    MyFileUnload,                           //  MiniFilterUnload
    MyFileInstanceSetup,                    //  InstanceSetup
    MyFileInstanceQueryTeardown,            //  InstanceQueryTeardown
    MyFileInstanceTeardownStart,            //  InstanceTeardownStart
    MyFileInstanceTeardownComplete,         //  InstanceTeardownComplete

...しかし、同じ呼び出しで提供された IRP ハンドラーからのものはありません。IRP ハンドラーにブレークポイントを設定してもヒットしませんが、上記のドライバー コールバックでブレークポイントがヒットします。

Win7 x86 ターゲットからのドライバー -

kd> !drvobj MyFile
Driver object (84b29168) is for:
 \FileSystem\MyFile
Driver Extension List: (id , addr)

Device Object list:

kd>

ブレークポイント

kd> bl
    0 e 925b6000 [f:\MyFile\myfile.c @ 75]     0001 (0001) MyFile!DriverEntry
    1 e 925b3340 [f:\MyFile\myfile.c @ 264]    0001 (0001) MyFile!MyFilePostOperation
    2 e 925b3370 [f:\MyFile\myfile.c @ 143]    0001 (0001) MyFile!MyFilePreOperation

コールバック ダンプ

kd> dt -a10 callbacks
MyFile!Callbacks
[0] @ 925b4068 
---------------------------------------------
   +0x000 MajorFunction    : 0 ''
   +0x004 Flags            : 0
   +0x008 PreOperation     : 0x925b3370     _FLT_PREOP_CALLBACK_STATUS  MyFile!MyFilePreOperation+0
   +0x00c PostOperation    : 0x925b3340     _FLT_POSTOP_CALLBACK_STATUS  MyFile!MyFilePostOperation+0
   +0x010 Reserved1        : (null) 

[1] @ 925b407c 
---------------------------------------------
   +0x000 MajorFunction    : 0x1 ''
   +0x004 Flags            : 0
   +0x008 PreOperation     : 0x925b3370     _FLT_PREOP_CALLBACK_STATUS  MyFile!MyFilePreOperation+0
   +0x00c PostOperation    : 0x925b3340     _FLT_POSTOP_CALLBACK_STATUS  MyFile!MyFilePostOperation+0
   +0x010 Reserved1        : (null) 

[2] @ 925b4090 
---------------------------------------------
   +0x000 MajorFunction    : 0x2 ''
   +0x004 Flags            : 0
   +0x008 PreOperation     : 0x925b3370     _FLT_PREOP_CALLBACK_STATUS  MyFile!MyFilePreOperation+0
   +0x00c PostOperation    : 0x925b3340     _FLT_POSTOP_CALLBACK_STATUS  MyFile!MyFilePostOperation+0
   +0x010 Reserved1        : (null) 

[ ... ]

kd> x Myfile!My*
925b3070          MyFile!MyFileInstanceQueryTeardown (struct _FLT_RELATED_OBJECTS *, unsigned long)
925b3410          MyFile!MyFilePreOperationNoPostOperation (struct _FLT_CALLBACK_DATA *, struct _FLT_RELATED_OBJECTS *, void **)
925b3370          MyFile!MyFilePreOperation (struct _FLT_CALLBACK_DATA *, struct _FLT_RELATED_OBJECTS *, void **)
925b3240          MyFile!MyFileDoRequestOperationStatus (struct _FLT_CALLBACK_DATA *)
925b31c0          MyFile!MyFileUnload (unsigned long)
925b32c0          MyFile!MyFileOperationStatusCallback (struct _FLT_RELATED_OBJECTS *, struct _FLT_IO_PARAMETER_BLOCK *, long, void *)
925b3150          MyFile!MyFileInstanceTeardownStart (struct _FLT_RELATED_OBJECTS *, unsigned long)
925b30e0          MyFile!MyFileInstanceTeardownComplete (struct _FLT_RELATED_OBJECTS *, unsigned long)
925b3340          MyFile!MyFilePostOperation (struct _FLT_CALLBACK_DATA *, struct _FLT_RELATED_OBJECTS *, void *, unsigned long)
925b3000          MyFile!MyFileInstanceSetup (struct _FLT_RELATED_OBJECTS *, unsigned long, unsigned long, _FLT_FILESYSTEM_TYPE)

コードスニペット

// Filter registration
//
CONST FLT_OPERATION_REGISTRATION Callbacks[] = {

    { IRP_MJ_CREATE,
      0,
      MyFilePreOperation,
      MyFilePostOperation },

    { IRP_MJ_CREATE_NAMED_PIPE,
      0,
      MyFilePreOperation,
      MyFilePostOperation },

    { IRP_MJ_CLOSE,
      0,
      MyFilePreOperation,
      MyFilePostOperation },

    { IRP_MJ_READ,
      0,
      MyFilePreOperation,
      MyFilePostOperation },

    { IRP_MJ_WRITE,
      0,
      MyFilePreOperation,
      MyFilePostOperation },

    [ ... all other file filter IRPs including fast I/O ... ]

    { IRP_MJ_VOLUME_DISMOUNT,
      0,
      MyFilePreOperation,
      MyFilePostOperation },

    { IRP_MJ_OPERATION_END }
};

CONST FLT_REGISTRATION FilterRegistration = {

    sizeof( FLT_REGISTRATION ),         //  Size
    FLT_REGISTRATION_VERSION,           //  Version
    0,                                  //  Flags

    NULL,                               //  Context
    Callbacks,                          //  Operation callbacks

    MyFileUnload,                           //  MiniFilterUnload

    MyFileInstanceSetup,                    //  InstanceSetup
    MyFileInstanceQueryTeardown,            //  InstanceQueryTeardown
    MyFileInstanceTeardownStart,            //  InstanceTeardownStart
    MyFileInstanceTeardownComplete,         //  InstanceTeardownComplete

    NULL,                               //  GenerateFileName
    NULL,                               //  GenerateDestinationFileName
    NULL                                //  NormalizeNameComponent

};

NTSTATUS
DriverEntry (
    _In_ PDRIVER_OBJECT DriverObject,
    _In_ PUNICODE_STRING RegistryPath
    )
{
    NTSTATUS status;

    UNREFERENCED_PARAMETER( RegistryPath );

    PT_DBG_PRINT( PTDBG_TRACE_ROUTINES,
                  ("MyFile!DriverEntry: Entered\n") );

    //
    //  Register with FltMgr to tell it our callback routines
    //

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

    FLT_ASSERT( NT_SUCCESS( status ) );

    if (NT_SUCCESS( status )) {

        //
        //  Start filtering i/o
        //

        status = FltStartFiltering( gFilterHandle );

        if (!NT_SUCCESS( status )) {

            FltUnregisterFilter( gFilterHandle );
        }
    }

    return status;
}

ここでも、DriverEntry および MyFileUnload コールバックのみが呼び出されます (dbg トレースおよびライブ ブレークポイントで確認されます)。ドライバーで IRP ハンドラーが呼び出されることはありません (これまで)。

ご覧いただきありがとうございます。

4

1 に答える 1