カーネル内のすべてのZw apiは、PASSIVE_LEVEL
でのみ呼び出される必要があります。これは設計によるものです。 APC_LEVEL
に電話をかけると、これはすでにUBになります。これは何度か動作しますが、何度かハングやクラッシュが発生します。例えば、ZwOpenKey
- レジストリマネージャは、メモリにまだ格納されていない場合、ディスクからキーデータを読み取ることができます。 IRPをファイルシステムに渡して、それが完了するのを待ちます。完了のためのIrpは呼び出し元のスレッドに特殊なAPC(IopCompleteRequest
)を挿入できます。 APCレベルのスレッド - スレッドのIRQLがパッシブになるまでAPCは実行されません。それやったことがない - 彼の完全なIRPを待つ。..
別のポイント - Zwとサービス、システムチェックからの出口では - スレッドにUserApcPending
あり、そうならば、APC_LEVEL
にIRQLを上げ、ユーザーのAPCを開始し、そして背中にそれを下げますPASSIVE_LEVEL
(システムはZwがPASSIVE_LEVEL
を呼び出したと仮定します) - Zw APIにはAPC_LEVEL
で入力し、PASSIVE_LEVEL
で終了することができます。何時にスレッドがAPC_LEVEL
を持っているのがなぜ尋ねることができますか?なぜならIRQLを何もしないからです。ある時点でAPC_LEVEL
である必要があるいくつかの要件が存在していますか?はいの場合、状況がAPC_LEVEL
に留まる必要がありますが、スレッドが先に遅いIRQLをPASSIVE_LEVEL
に下ろす場合はどうなりますか?本当にUB。ほとんどの場合、何もできません。しかし、場合によっては非常に厄介なバグとなることがあります。
あなたはソースコードを所有していないので、これはプログラミングに関連する質問ではなく、SuperUser.comでより一般的なPCドライバの問題であると言います。 –
これは常に重大な問題です。 –