KeRemoveQueue 関数 (ntifs.h)

KeRemoveQueue ルーチンは、呼び出し元のスレッドに、指定されたキュー オブジェクトからのデキューされたエントリへのポインターを提供するか、または呼び出し元がキュー オブジェクトでタイムアウト間隔 (省略可能) まで待機できるようにします。

構文

PLIST_ENTRY KeRemoveQueue(
  [in, out]      PRKQUEUE        Queue,
  [in]           KPROCESSOR_MODE WaitMode,
  [in, optional] PLARGE_INTEGER  Timeout
);

パラメーター

[in, out] Queue

呼び出し元が非ページ プールに常駐ストレージを提供する初期化されたキュー オブジェクトへのポインター。

[in] WaitMode

呼び出し元が待機しているプロセッサ モード 。 KernelMode または UserMode のいずれかです。 IRQL >= DISPATCH_LEVELでスタック上の何かにアクセスできる場合、呼び出し元は KernelMode を指定する必要があります。

[in, optional] Timeout

待機の有効期限が切れる 100 ナノ秒単位の絶対時間または相対時間を指定する変数へのポインター。 Timeout の値が負の場合、有効期限は現在のシステム時刻を基準とします。それ以外の場合は絶対です。 絶対有効期限は、システム時間の変更を追跡します。相対有効期限は、システム時間の変更の影響を受けません。 このポインターには NULL を指定できます。

戻り値

KeRemoveQueue は 、次のいずれかを返します。

  • 指定されたキュー オブジェクトからキューに登録されていないエントリ (使用可能な場合) へのポインター。
  • STATUS_TIMEOUT、エントリが使用可能になる前に指定されたタイムアウト間隔が期限切れになった場合
  • STATUS_USER_APC、呼び出し元スレッドのコンテキストでユーザー モード APC が配信された場合
  • STATUS_ABANDONEDキューがダウンしている場合

注釈

KeRemoveQueue の呼び出し元は、エントリ メンバーにアクセスする前に、戻り値がSTATUS_TIMEOUTかSTATUS_USER_APCかをテストする必要があります。 KERemoveQueue の戻り値を NULL に対してテストすることは、プログラミング エラーです。

[タイムアウト] に 0 の値を指定すると、キューが現在空の場合に、呼び出し元がエントリを待機することを望まないことを示します。**NULL*タイムアウト ポインターを指定すると、呼び出し元がエントリを無期限に待機する意思を示します。

WaitMode パラメーターが UserMode の場合、待機中にカーネル スタックをスワップアウトできます。 そのため、WaitModeUserMode に設定して KeRemoveQueue を呼び出すときに、呼び出し元がスタックにパラメーターを渡そうとしないでください。

KeRemoveQueue の呼び出しで WaitModeKernelMode として指定すると、呼び出し元のスレッドのカーネル スタックがスワップアウトされるのを防ぎ、ユーザー モードの非同期プロシージャ 呼び出し (APC) が配信されないようにします。 スレッドが IRQL PASSIVE_LEVELから KeRemoveQueue を呼び出すときに、I/O マネージャーが IRP を完了するために使用するようなカーネル モードの APC の配信を妨げることはありません。 このようなカーネル モードの APC を配信しても、呼び出し元のスレッドがキュー オブジェクトで待機したり、カーネル APC の実行後にエントリを含む実行のためにディスパッチされたりすることはありません。

ドライバーで管理される内部キューの使用の詳細については、「 Driver-Managed Queues」を参照してください。

要件

要件
対象プラットフォーム ユニバーサル
Header ntifs.h (Ntifs.h、FltKernel.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI コンプライアンス規則 HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm)

こちらもご覧ください

KeInsertHeadQueue

KeInsertQueue