質問に入る前に、私が現在取り組んでいることについて説明します。これにより、私がすでに行った/試したことについての適切なアイデアが得られます。
DeviceIOControl 呼び出しを KMDF ドライバー (純粋なソフトウェア、ハードウェアなし) に発行するマルチスレッド ユーザーモード Windows デスクトップ アプリケーションがあります。5 つの個別のスレッドがあり、すべてがドライバーに対して同じカスタム IOCTL 呼び出しを常に行います。このリクエストは次のもので構成されます。
- PsLookupProcessByProcessId を使用して、メモリを読み取るプロセスを取得します。
- MmCopyVirtualMemory を使用して、要求されたメモリを提供されたバッファーにコピーします。
- ObDereferenceObject を使用して、参照カウントをデクリメントします。
ドライバーは現在これをシリアルに実行しており、ユーザー モード アプリケーションの主なボトルネックは、メモリの読み取りが完了するのを待っていることです。シーンを「レンダリング」するには、すべてを完了する必要があります。
DeviceIOControl リクエストの量をできる限り減らしたので、オーバーラップした IO を調査し、各スレッドがリクエストを非同期に送信できるようにしました。私の質問は、ドライバーで複数のスレッドを使用して異なるアドレスから同時に読み取ることができるかどうかわからないため、これが試してみる価値があるかどうかです。