2

トップレベルのミニフィルタードライバーとユーザーモードサービスがあります。これは、 スキャナーのMSDNの例に似ています。

ユーザーモードサービスをA.txtメモ帳で開いたときに、ファイルの内容を置き換えたいのですが。

そのため、IRP_MJ_CREATE操作後のコールバックでは、サービスに通知を送信し、ファイルに新しいデータが書き込まれるのを待っています。ただし、サービスはメモ帳で既にロックされているため、を
開くことができません。A.txt

カーネルFltWriteFileを使用せずにサービスがデータを書き込めるようにするにはどうすればよいですか?
これを行うための最良の方法は何ですか?

たぶん、ファイルのオープンをキャンセルして、サービスにデータを書き込み、操作後のコールバックを残さずに同じパラメーターで再度オープンさせますか?
たぶん、手術前に必要なアクセスを上書きする必要がありますか?

---
どんな情報でもいただければ幸いです。この質問の詳細が不足していると思われる場合は、お知らせください。

4

3 に答える 3

2

PostOperation でサービスに通知する代わりに、PreOperation コールバックでそれを行います。PostOperation でそれを行うまでに、ファイルは Notepad.exe に対して既に開かれているため、サービスで開くことができません。

また、まだ行っていない場合は、サービスが新しいデータをファイルに書き込む間、PreOperation で待機する必要があります。

于 2012-12-15T07:28:15.940 に答える
1

メモ帳の前に他のプロセスによってファイルがロックされる可能性が非常に高いため、Roganの回答にはまったく同意しません。それはここでの問題ではなく、少なくともこの問題をどのように見るべきかという問題ではありません。

A.txt の特定のビューをメモ帳に表示したい場合は、単にメモ帳の FILE_OBJECT を使用し、カーネルから自分で書き込みを行います。ObReferenceObjectByPointerを使用してWRITEアクセスを要求することを忘れないでください。アクセスモードはカーネルモードになるので許可されます。

または、サービスで本当に実行したい場合は、ドライバーから自分でファイルを開き、サービスへのハンドルを提供します。カーネル モードからファイルを開くと、共有モードなどが抑制される可能性があります。FltCreateFileEx2のドキュメントを読んで、必要なパラメーターがすべて揃っていることを確認する必要があります。開いたばかりの FileObject でObOpenObjectByPointerを使用し、モード UserMode にアクセスします。KeStackAttachProcessを介して、ユーザー モードのプロセス アドレス空間にアタッチされていることを確認してください。

PostCreate での操作の順序:

  1. FltCreateFileEx2 (the_file、ignore_share_access など)
  2. KeStackAttachProcess (your_service_eprocess)
  3. ObOpenObjectByPointer(UserMode=access_mode) -> now your um process has a handle to the file
  4. KeUnstackDetachProcess()
  5. Send the HANDLE pointer to the user-mode process as now it is able to use it.
  6. Wait for the user mode service to write the data and also close the handle Dereference the FileObject obtained as well as close the handle from FltCreateFileEx2.
  7. Let the Create go for Notepad
  8. Profit.

Good luck.

于 2018-01-26T21:28:18.733 に答える
0

//宣言

PFLT_CALLBACK_DATA Data //Note: you get this in preOperation as argument so dont need to defined explicitly

PFLT_FILE_NAME_INFORMATION nameInfo=NULL;//must be declared
NTSTATUS status;


if(KeCurrentIrql()==PASSIVE_LEVEL)// file operation should be performed in IRQL PASSIVE_LEVEL
{

status=FltGetFileNameInformation(Data,FLT_FILE_NAME_OPENED |FLT_FILE_NAME_qUERY_ALWAYS_ALLOW_CACHE_LOOKUP,&nameInfo);

if(NT_SUCCESS(status))
{
 status = FltParseFileNameInformation(nameInfo);
}
}

//これで、nameInfo 構造体にファイルの情報があります。

//上記の使用されている構造のドキュメントを読むと、それらについて詳しく知ることができるなどのファイル情報を取得できます。特に PFLT_FILE_NAME_INFORMATION 。

于 2016-10-21T05:14:47.227 に答える