1

質問に入る前に、私が現在取り組んでいることについて説明します。これにより、私がすでに行った/試したことについての適切なアイデアが得られます。

DeviceIOControl 呼び出しを KMDF ドライバー (純粋なソフトウェア、ハードウェアなし) に発行するマルチスレッド ユーザーモード Windows デスクトップ アプリケーションがあります。5 つの個別のスレッドがあり、すべてがドライバーに対して同じカスタム IOCTL 呼び出しを常に行います。このリクエストは次のもので構成されます。

  1. PsLookupProcessByProcessId を使用して、メモリを読み取るプロセスを取得します。
  2. MmCopyVirtualMemory を使用して、要求されたメモリを提供されたバッファーにコピーします。
  3. ObDereferenceObject を使用して、参照カウントをデクリメントします。

ドライバーは現在これをシリアルに実行しており、ユーザー モード アプリケーションの主なボトルネックは、メモリの読み取りが完了するのを待っていることです。シーンを「レンダリング」するには、すべてを完了する必要があります。

DeviceIOControl リクエストの量をできる限り減らしたので、オーバーラップした IO を調査し、各スレッドがリクエストを非同期に送信できるようにしました。私の質問は、ドライバーで複数のスレッドを使用して異なるアドレスから同時に読み取ることができるかどうかわからないため、これが試してみる価値があるかどうかです。

4

2 に答える 2

2

OK、あなたの質問の最も重要な部分はここにあるようです:

私は、WDF が IOCTL 要求を処理する方法に関して、ファイルをオーバーラップとして実際に開くことが実際にどのように変化するかを見つけようとして、広範囲に検索してきました [...]

何も変わりません。デバイス ドライバーへのすべての要求は非同期です。

同期ハンドルで I/O を実行すると、Windows はユーザーに代わってドライバーに非同期 I/O 要求を発行し、それが完了するまで待機します。 私の知る限り、ドライバーには、元の要求が同期であったか、重複していたかを判断する方法さえありません。 [編集: これは実際には正しくありません。[

とにかく、ドライバーが現在単一のスレッドでしか実行されていない場合は、重複した I/O を使用しても役に立ちません。ドライバーを変更する必要があります。逆に、ドライバーを変更するだけで十分です。おそらく、アプリケーションを変更する必要はありません。(例外: 複数のスレッドから同じ同期ハンドルを同時に使用することが合法かどうかはわかりません。そのため、少なくともドライバーが動作していることを確認するまでは、各スレッドがデバイスに対して独自のハンドルを開くことをお勧めします。望んだ通りに。)

私は WDF に詳しくありませんが、MSDN のエントリDispatching Methods for I/O Requestsは関連しているようです。

于 2017-02-08T23:31:51.897 に答える