システムwiki

wdm-iocalldriver-デバイスドライバーのアンインストールの次の試行をブロックします

Roberto 受付中 最終更新日:2022-05-25 05:45

すみません、

私は初心者ですが、孤独で「すべて自分で」学んだこと...それほど悪くはないと感じています...

「初心者」ではありません....

フィルタードライバーを実現しました...「サブフィルタードライバーとしてCH341SER_A64を使用するBArduino」

ドライバーで「サブクラス化トラップ」を使用せず、ドライバーが「デフォルト関数とサブドライバー関数」を使用するままにしておく場合」

...すべてうまく機能します...

しかし、そのとき、「完了ルーチンなし」または

の両方のメソッドで「IoReadの例のトラップ」を実装しようとしました.

「完了ルーチンを渡す」(スキップまたはコピーのirp apiメソッドを使用)..

(そして、正しく機能している同期システムを使用し、Microsoftの例が言うように、「シングル」リクエストを参照していません(そして私の意見ではそれは間違っています)私のシステムはドライバー全体を同期します)

しかし、それがサイクロナイゼーションシステムの実装とロジックではないことは確かです...それは本当にうまく機能しています....

問題は「IoCallDriver()」の使用に関連しています...私のドライバーはそれを正しく呼び出します..正の値を返します

次に、完了ルーチンを呼び出します.....そしてすべてがうまく機能しているようです.....同じ仮想シリアルを「開閉」しようとしても

ポートを2回以上......

この問題は、ハードウェアデバイスツリーから「新しいversionでドライバのインストールを更新する」ことを目的として削除しようとすると発生します...

問題は「IoCallDriver()」関数の呼び出しに関連していると確信しています...「コメントすると」すべてが機能するためです...明らかに

「正しい配列バイトの応答コンテンツ」を返さないでください.ただし、少なくとも、次のドライバをアンインストールする可能性を妨げることはありません....

多分それを覚えています「IoCallDriver()」を呼び出すと、「カーネルまたはデバイスオブジェクトのカウンターが増える」....しかし、私はしません

正確に覚えておいてください

だからpls...誰かが私を助けることができますか?

次の画像は、発生する「無限のアンインストールループ」を示しています:

返信リスト(回答:1)

1 #
Roberto

自分で解決しました...=)

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)