2017-04-20 12 views

答えて

0

APCは、DPCレベルスレッドリストに(KeInsertQueueAPCによって)挿入することができるため、APCは、非ページプールからのみ割り当てられなければならない - そう例えば、あなたはページプールからKAPCを割り当てる場合に、それを挿入し、その後、誰かがDPCレベルでAPC別を挿入してみてください - (リンクリストに挿入されたときに)あなたのページングAPCデータを割り当てることができ、その結果としてBSOD

iniファイルのための例:KAPC使用KeInitializeApc無料の場合APCは正確にを呼び出す必要があります.ExFreePoolなど何もない場合は0をRundownRoutineとして使用できます。それ以外の場合は、正しいクリーンアップのために独自のRundownRoutineを提供する必要があります。 KernelRoutineは常に設定する必要があります。ほとんどの場合、ドライバの一部の機能を指しているため、ドライバはアンロードしないでください。APCは実行されません。 KernelRoutineまたはRundownRoutineKeInsertQueueAPCObfDereferenceObjectすることにより、インサートAPC前にドライバオブジェクトのための通常の必要性コールObfReferenceObjectが実行されます(またはKeInsertQueueAPCはfalseを返し)。しかし、あなたは、「通常の方法」ObfDereferenceObjectを呼び出すことはできません - あなたのドライバコードにクラッシュObfDereferenceObjectリターンになりますあなたはKernelRoutineRundownRoutineから組み立て書かれたプロキシを必要とする - 。最後の参照上のドライバホールドがあれば、これは(無意味ですObfDereferenceObjectとスタックにどの実装彼らは、C/C++呼び出し、終了時にJMP行う(ただしコールを!!)命令は後ObfDereferenceObjectコールRETのための特別な再構築しなければならない - コードがカーネルに返されます共同Inside NT's Asynchronous Procedure Callを読む - - これは、すでに非常に古い記事でもかかわらず - ので詳細はObfDereferenceObject

は、後にドライバのコードが実行スキップ - (カーネルやランダウン)あなたのドライバのコールバック・ルーチンを呼び出すデ、何もこの時から、最新の変更します勝利10 - すべて同じ

関連する問題