0

閉じたときにファイルを変更し、開いたときに変更を元に戻したいのですが。ファイルを暗号化したくないことを除けば、暗号化ドライバーのようなものです。

Visual Studio 2012でWDK8を使用して新しい「フィルタードライバー:ファイルシステムミニフィルター」プロジェクトを作成し、コールバック関数としてPreCreate、PostCreate、PreClose、およびPostCloseを登録しました。

たとえば、バイトが{72,101,108,108,111}( "Hello")であるファイルのIRP_MJ_CLOSEで、PostClose関数の後、ファイルがハードディスク上で次のようになるようにします:{10,11,12,72,101,108,108,111}。

私はそれがただのように簡単ではないと思う:

    FLT_PREOP_CALLBACK_STATUS
    PreClose (
    _Inout_ PFLT_CALLBACK_DATA Data,
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
    )
{
    //...

    //some if statment...
    {
        Data->Iopb->Parameters.Write.WriteBuffer = newBfr;
        Data->Iopb->Parameters.Write.Length = newLen;
    }
    //...

    return FLT_PREOP_SUCCESS_WITH_CALLBACK;
}

この件についてのガイダンスが欲しいのですが。

また、これをデバッグするための最良の方法は何ですか?Windows7のデバッグに出力する方法が見つかりません。

ありがとう!gfgqtmakia。

編集:http ://code.msdn.microsoft.com/windowshardware/swapBuffer-File-System-6b7e6e2dを読みましたが、読み取り/書き込み用であるため、役に立たないと思います。対処したい。

EDIT2:または、ファイルがIRPの途中ではなくハードドライブ上にある場合は、PreCreateとPostCloseで変更を行う必要があります。そうすれば、「オンザフライ」でバッファを処理する必要はありません。ディスク?

4

1 に答える 1

1

スワップバッファのようなものを書く必要があります。PostCreate/PreCloseでファイルデータを変更することはお勧めできません。

いくつかの理由:

  • まず、PostCreate / PreCloseでは、にアクセスするべきではありませんData->Iopb->Parameters.Write.WriteBuffer。これはIRP_MJ_WRITEでのみ有効です。あなたはFltWriteFileファイルにデータを書き込むために行うことができます。
  • Windowsカーネルは、IRP_MJ_CLOSE内/直後にファイルデータをディスクに書き込まない場合があります。ページキャッシュについて考えてみてください。
  • ページングi/o、ダイレクトi / oなど、適切に処理する必要のある複雑な部分がある場合があります。
  • もう1つの重要な点は、ファイルサイズも変更することです(質問で述べたように、実際のデータ長は5バイトですが、データを8バイトに更新します)。現在、これを管理することは非常に困難です。minifilter /filesystemdriverでファイルサイズを変更することは決してお勧めしません。
于 2012-08-23T18:08:32.000 に答える