0

ファイルを傍受し、特定のディスクにドラッグアンドドロップされたファイルの名前を取得してファイル名を取得するミニフィルターを開発しています。

ファイルをドラッグ アンド ドロップすると、このファイル名を取得して正常にインターセプトできます (つまり、このファイルはディスク上に作成されません)。

複数のファイルをドラッグ アンド ドロップすると、最初のファイル名しか取得できず、他のファイル名は取得できません。しかし、ディスクを開くと、ここにファイルが表示されません (つまり、Mini-Filter がファイルを正常にインターセプトしたことを意味します)。そのため、ファイル名を取得できません(最初のファイルを除く)

それらをリダイレクトしてドラッグ&ドロップをインターセプトします:

  1. FltGetFileNameInformation()とFltParseFileNameInformation()でファイル名を取得
  2. 二つに分けて
    • 最初は: \Device\HarddiskVolume1\folder\
    • 2 つ目: file.ext
  3. 最初の部分にファイル名を追加します: \Device\HarddiskVolume1\folder\new_file.ext
  4. ディスク上での作成の傍受
    • このバッファを解放します: Data->Iopb->TargetFileObject->FileName.Buffer
    • 最初の部分を Data->Iopb->TargetFileObject->FileName に割り当てます
    • これを設定します: Data->Iopb->TargetFileObject->RelatedFileObject = NULL;
    • Data->IoStatus.Information = IO_REPARSE;
    • データ->IoStatus.Status = STATUS_REPARSE;
    • FLT_PREOP_SUCCESS_NO_CALLBACK を返します。

上記のコードは、すべてのファイルを傍受して最初のファイル名を取得することしかできません。

複数のファイルをドラッグ アンド ドロップしたときに、各ファイルをインターセプトするにはどうすればよいですか?

4

2 に答える 2

1

私は自分自身を見つけました:

  1. Data->Iopb->TargetFileObject->FileName からファイル名を取得

    • ファイル パスとファイル名の 2 つの部分を省略します。
    • ファイル名をリダイレクト ファイル名に変更する
  2. リダイレクト ファイル名 を削除します。このステップは、ステップ #1 の前に実行できます

    • リダイレクト ファイル名が存在しない場合は、STATUS_OBJECT_NAME_NOT_FOUND (0xC0000034) を返します。システム上問題ありません。
    • リダイレクトファイル名が存在する場合。大丈夫です。
于 2015-02-03T07:08:56.860 に答える
0

Microsoft のsimrepサンプルを確認してください。これを正しく行う方法が示されています。Drag&Drop がカーネルとファイルシステムで対応しているという私の仮定は根拠にしません。特に同じボリュームで実行している場合は、多くの方法でユーザーモードで実装できます。名前の変更と同じくらい簡単です。また、ハードリンク、シンボリックリンク、代替データ ストリームにも注意してください。

幸運を。

于 2018-01-26T19:44:47.387 に答える