次の方法で共有


KeInsertHeadQueue 関数 (ntifs.h)

KeInsertHeadQueue ルーチンは、スレッド待機を満たすためにエントリをすぐに使用できない場合に、指定されたキューの先頭にエントリを挿入します。

構文

LONG KeInsertHeadQueue(
  [in, out] PRKQUEUE    Queue,
  [in, out] PLIST_ENTRY Entry
);

パラメーター

[in, out] Queue

呼び出し元が非ページ プールに常駐ストレージを提供する初期化されたキュー オブジェクトへのポインター。 この構造体は次のように定義されます。

typedef struct _KQUEUE {
    DISPATCHER_HEADER Header;
    LIST_ENTRY EntryListHead;
    ULONG CurrentCount;
    ULONG MaximumCount;
    LIST_ENTRY ThreadListHead;
} KQUEUE, *PKQUEUE, *RESTRICTED_POINTER PRKQUEUE;
メンバー 意味
ヘッダー キュー ヘッダー
EntryListHead キュー内の最初のエントリへのポインター
CurrentCount する キュー内のエントリの数
MaximumCount キューに含めることができるエントリの最大数
ThreadListHead スレッド リスト内の最初のエントリへのポインター

[in, out] Entry

挿入するキュー エントリへのポインター。 このポインターは、常駐システム・スペース・アドレスでなければなりません。

戻り値

KeInsertHeadQueue は、指定されたキューの以前のシグナル状態を返します。 KeInsertHeadQueue が呼び出される前に 0 (シグナル化されていない) に設定された場合、KeInsertHeadQueue は 0 を返します。つまり、キューに登録されたエントリが存在しません。 0 以外の場合 (シグナル通知)、KeInsertHeadQueue は、KeInsertHeadQueue が呼び出される前にキューに登録されたエントリの数 返します。

備考

KeInsertHeadQueue キューに登録するエントリは、非ページ プールから割り当てる必要があります。 たとえば、呼び出し元定義エントリのメモリは、exAllocatePoolWithTag 使用して割り当てることができます。 呼び出し元が固定サイズのエントリを割り当てる場合、ExInitializeNPagedLookasideList してルックアサイド リストを作成し、exAllocateFromNPagedLookasideList を使用して割り当てる方が、ExAllocatePoolWithTag 頻繁に呼び出すよりも効率的です。特に、サイズがPAGE_SIZEの倍数ではないエントリの場合です。

KeInsertHeadQueue が呼び出されたときにキュー オブジェクト 待機しているスレッドがある場合、この呼び出しによって 1 つのスレッドの待機が満たされます。 指定された Entry ポインターを使用して、スレッドが実行のためにディスパッチされます。

KeInsertHeadQueue が呼び出されたときにキュー オブジェクト 待機しているスレッドがない場合は、指定されたエントリがキューに挿入され、キュー オブジェクトのシグナル状態がインクリメントされます。

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

必要条件

要件 価値
ターゲット プラットフォーム 万国
ヘッダー ntifs.h (Ntifs.h を含む)
ライブラリ NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI コンプライアンス規則 する hwStorPortProhibitedDDDIs(storport) する

関連項目

ExAllocateFromNPagedLookasideList

ExAllocatePoolWithTag

ExInitializeNPagedLookasideList

KeInitializeQueue

KeInsertQueue

KeRemoveQueue