1

ioctlの反転モデルを使用したい。つまり、ドライバーが特定のアクティビティを検出したときに、ユーザースペーススレッドであるワークアイテムをスケジュールしたいということです。たとえば。1.カーネルモードドライバーで特定の割り込みのコールバックを登録します。
2.割り込みが発生するたびに、ユーザーがioctlを使用して登録したユーザースペーススレッドをスケジュールしたいと思います。

DPC、APC、またはIRPのいずれかを使用できますか。私は、ドライバースペースの作業をユーザースペースと異なるべきではない/できないことを知っています。私が望んでいるのは、特定のハードウェアイベントが発生したときに、ユーザースペースでいくつかの独立したアクティビティを実行することです。

ありがとう

4

2 に答える 2

1

ドライバからユーザーモードスレッドを作成することは本当に悪い習慣であり、カーネルモードからユーザーモードに制御を単純に移すことはできません。ユーザーアプリでワーカースレッドを作成し、このスレッドでイベントを待つ必要があります。待つための2つの主なアプローチがあります。1)ioctlでドライバーに投稿するイベントを待つことができます。ある瞬間、ドライバーはイベントをアラート可能に設定し、イベントをスレッド化して処理します。これは主要で単純なアプローチです

2)ioctlを同期的に投稿し、ドライバーペンドでこのirp->スレッドブロックをDeviceIoControl呼び出しで実行できます。イベントが発生すると、ドライバーはこれらのirpとスレッドを完了し、ウェイクアップして処理を開始します。

割り込みが発生するたびに、ユーザーがioctlを使用して登録したユーザースペーススレッドをスケジュールしたいと思います。

最初に安全なirql(<DISPATCH_IRQL)に移動する必要があります。たとえば、高いirqlでイベントを通知できないため、割り込み->DPCがキューにプッシュ->ワーカースレッドになります。

これを読んで くださいhttp://www.osronline.com/article.cfm?id=108

とウォルターオネイの本

于 2012-05-02T21:18:25.777 に答える
0

作業項目をキューに入れたり、イベントを投稿するのに凝ったことをしたりする必要はありません。スケジューラーはDISPATCH_LEVELで呼び出し可能であるため、DPCは誰にでも信号を送るのに十分です。

通常の反転呼び出しを使用するだけです。

1)アプリはIOCTLを送信します(複数のスレッドにシグナルを送信する必要がある場合は、FILE_FLAG_OVERLAPPEDと非同期I / Oを使用する必要があります)。

2)ドライバーは、キャンセルルーチンなどを設定した後、結果のIRPをドライバー管理キューに入れます。irpを保留にマークし、STATUS_PENDINGを返します。

3)割り込みが到着しました... ISRからDPCをキューに入れます(または、これがusbまたはその他のスタックの場合は、すでにDISPATCH_LEVELにいる可能性があります)。

4)キューからリクエストを削除し、IoCompleteRequestを呼び出します。

手順2と4にはKMDFを使用します。irpsのキューイングで失敗する可能性のあるものがたくさんあるので、そのためには十分にテストされたコードを使用するのが最善です。

于 2012-05-06T17:01:02.027 に答える