5

最近、Windows DDK でドライバーを作成する方法を学んでいます。システム スレッドと同期を試すいくつかのテスト ドライバーを作成した後、私はそれを一段と向上させ、役に立たないものではありますが、実際に何かを実行するドライバーを作成することにしました。

現在、私のドライバーは Winsock Kernel を使用して他のコンピューターに接続し、コマンド「exit」を取得するまで、送信したものをループしてエコー バックし、ループから抜け出します。私のループではWskReceive()、他のコンピューターからデータを取得するために呼び出した後KeWaitForMultipleObjects()、2 つの SynchronizationEvent のいずれかを待機していました。BlockEvent は IRP によって設定されCompletionRoutine()、ソケットからデータを受信したことをスレッドに知らせます。EndEvent は私のDriverUnload()ルーチンによって設定され、アンロード中であり、終了する必要があることをスレッドに伝えます。

「exit」コマンドを送信すると、スレッドは問題なく終了し、その後ドライバーを安全にアンロードできます。ただし、他のコンピューターからのデータを待機している間にドライバーを停止しようとすると、次のエラーでブルー スクリーンが表示されます。DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS

EndEvent を取得した後、ループを終了する前に、IRP をキャンセルしてIoCancelIrp()で完了しようとしましIoCompleteRequest()たが、どちらもDRIVER_IRQL_NOT_LESS_OR_EQUALエラーが発生します。

WskDisconnect()次に、受信操作が完了することを期待して を呼び出してみましたが、CANCELLING_PENDING_OPERATIONSエラーに戻りました。

ドライバーがアンロードされているときに、実行中の IRQL で WSK ソケットから保留中の I/O 操作をキャンセルするにはどうすればよいですか?

4

0 に答える 0