wdm-iocalldriver-デバイスドライバーのアンインストールの次の試行をブロックします
すみません、
私は初心者ですが、孤独で「すべて自分で」学んだこと...それほど悪くはないと感じています...
「初心者」ではありません....
フィルタードライバーを実現しました...「サブフィルタードライバーとしてCH341SER_A64を使用するBArduino」
ドライバーで「サブクラス化トラップ」を使用せず、ドライバーが「デフォルト関数とサブドライバー関数」を使用するままにしておく場合」
...すべてうまく機能します...
しかし、そのとき、「完了ルーチンなし」または
の両方のメソッドで「IoReadの例のトラップ」を実装しようとしました.「完了ルーチンを渡す」(スキップまたはコピーのirp apiメソッドを使用)..
(そして、正しく機能している同期システムを使用し、Microsoftの例が言うように、「シングル」リクエストを参照していません(そして私の意見ではそれは間違っています)私のシステムはドライバー全体を同期します)
しかし、それがサイクロナイゼーションシステムの実装とロジックではないことは確かです...それは本当にうまく機能しています....
問題は「IoCallDriver()」の使用に関連しています...私のドライバーはそれを正しく呼び出します..正の値を返します
次に、完了ルーチンを呼び出します.....そしてすべてがうまく機能しているようです.....同じ仮想シリアルを「開閉」しようとしても
ポートを2回以上......
この問題は、ハードウェアデバイスツリーから「新しいversionでドライバのインストールを更新する」ことを目的として削除しようとすると発生します...
問題は「IoCallDriver()」関数の呼び出しに関連していると確信しています...「コメントすると」すべてが機能するためです...明らかに
「正しい配列バイトの応答コンテンツ」を返さないでください.ただし、少なくとも、次のドライバをアンインストールする可能性を妨げることはありません....
多分それを覚えています「IoCallDriver()」を呼び出すと、「カーネルまたはデバイスオブジェクトのカウンターが増える」....しかし、私はしません
正確に覚えておいてください
だからpls...誰かが私を助けることができますか?
次の画像は、発生する「無限のアンインストールループ」を示しています:
返信リスト(回答:1)
自分で解決しました...=)
1)WDFピュアシステムを使用すると、すべて機能します...すでに述べたように
2)WDF + WDMを混合すると、次のようになります.
2.1)アンダードライバー、私の意見では、IRPを完了せずに完了するという理由で「論理的なバグ」があります
コールバックルーチンを渡したという「手がかり」への決定に基づいて...だから私はロジックを修正します...すべきです
別のドライバーがIRPを完了するために注意を払うと推測します(完了コールバック関数を取得しました、、、
そしておそらくもっと正しい...コールバック関数がどこかの場所に上位のコールバックが存在することを確認した場合...それはすべきではありません
以前に公開されたのと同じ理由で、IRPを完了しないでください)
2.2)コールバック関数でIRPを完了しなかった場合でも(コールバック関数に注意してください
元のコンテキストではなく、アンダードライバーコンテキストで呼び出されるようです....したがって、終了呼び出し
そのコンテキストが返されます....そしてアンダードライバーはその可能性を考えていませんそしてアッパーフィルター
すでにIRPを完了している可能性があり、KeDebuggerCheckでBSODエラーが発生しました
2.3)しかし、IRPを完了しなかった場合(ロジックが悪いアンダードライバーのために明らかに義務付けられています、 によってそれをしました
それ自体....最後の問題は、WDFリクエストを完了する必要があることでした(ドライバーの反対側ではありません
削除時にアンロードされます)...しかし、「完了したIRP」を使用して、割り当てを解除するにはどうすればよいでしょうか....クラッシュします
システム!
解決策....IRPを保留中のIRPとしてマークします..アンダードライバーが完了せず、IRPを解放しないようにします
したがって、プロセス呼び出しが元のコンテキストに戻ったときに...情報が入力される可能性があります
保留中のIRP...明らかに!pendingとしてマークできます....問題なく電話をかけます
WdfRequestcompleteWithInformation(Request、status、P1_IRP_richiesta->IoStatus.Information);
機能.
情報が誰かに役立つことを願っています.
良い一日を
ロバート(0xb0ffe)